Одновременно не работает таймер и счетчик нажатий на кнопку

kyber_kotlet
Offline
Зарегистрирован: 08.06.2022

Всем доброго времени суток. Дали интересный проект, как счетчик отжиманий на время, но столкнулся с одной проблемой: не работает одновременно таймер времени и счетчик нажатий на кнопку. по отдельности все прекрасно работает. Время вывожу на семисегментный дисплей TM1637, количество нажатий на жк дисплей 1602a.

https://github.com/johnrickman/LiquidCrystal_I2C это 1602 жк дисплей

https://github.com/avishorp/TM1637 это семисегментник

в ардуино я не бум-бум, пока начинаю, поэтому основной код взял с интернета. Если можно, то причесать код хоть чуть-чуть и помочь решить эту беду.

//*************************** LIBRARIES ********************
#include <TM1637Display.h> // Tm1637 module
#include <LiquidCrystal_I2C.h> //Display
#define _LCD_TYPE 1  // для работы с I2C дисплеями

#include <EncButton.h>
EncButton<EB_TICK, 3> btn(INPUT_PULLUP);
volatile int counter = 0;


//*************************** GLOBALS ********************

// TM1637 Module connection pins (Digital Pins)
#define CLK 5
#define DIO 4
TM1637Display display(CLK, DIO);

//buzzer pin
int buzzer = 9;//the pin of the active buzzer

// Button
#define buttonPin 2
int buttonState;             // the current reading from the input pin
int lastButtonState = HIGH;   // the previous reading from the input pin
// the following variables are unsigned longs because the time, measured in
// milliseconds, will quickly become a bigger number than can be stored in an int.
unsigned long lastDebounceTime = 0;  // the last time the output pin was toggled
unsigned long debounceDelay = 50;    // the debounce time; increase if the output flickers
int count_start = 0;


// time calc
#define numberOfSeconds(_time_) ((_time_ / 1000) % 60)
#define numberOfMinutes(_time_) ((_time_ / 1000) / 60)
// hold time selected in ms.
unsigned long timeLimit = 0;

//pot pin Analog A0
int potPin = 0;
// Varibles to Sample and smooth the A0 input from pot to reduce gitter on display
// Define the number of samples to keep track of. The higher the number, the
const int numReadings = 10;
int readings[numReadings];      // the readings from the analog input
int readIndex = 0;              // the index of the current reading
int total = 0;                  // the running total

//*************************** SETUP ************************
LiquidCrystal_I2C lcd(0x27, 16, 2);

void setup() {
  // put your setup code here, to run once:

  // button setup
  // Setup pins for button enable internal pull-up resistors
  digitalWrite(buttonPin, HIGH);

  //display setup
  display.setBrightness(0x0c);
  display.showNumberDecEx(0, 0x40, true);
  //buzzer
  pinMode(buzzer, OUTPUT); //initialize the buzzer pin as an output
  digitalWrite(buzzer, LOW);

  // initialize all the readings in array to 0:
  for (int thisReading = 0; thisReading < numReadings; thisReading++) {
    readings[thisReading] = 0;
  }
  lcd.init();           // инициализация
  lcd.backlight();      // включить подсветку  
  lcd.setCursor(1, 0);  // столбец 1 строка 0
  lcd.print("VF BSUIR");
  delay(3500);
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("COUNT:");
  pinMode(3, INPUT_PULLUP);
    
}
void btnIsr() {
  counter++;  // + нажатие
}

//******************* MAIN LOOP *****************
void loop() {
  // read the pot
  if (count_start == 0)
  {
    potRead();
  }

  // read and debounce push button.
  int reading = digitalRead(buttonPin);
  // If the switch changed?
  if (reading != lastButtonState) {
    // reset the debouncing timer
    lastDebounceTime = millis();
  }

  if ((millis() - lastDebounceTime) > debounceDelay) {
    // if the button state has changed:
    if (reading != buttonState) {
      buttonState = reading;
      // start timer if the new button state is low
      if (buttonState == LOW) {
        TestButton();
      }
    }
  }
  lastButtonState = reading;
  delay(5);
  
  lcd.setCursor(8,1);
  count();
  
}

// ********************* FUNCTIONS *************************

// TestButton:  Function to handle button press
void TestButton()
{
  count_start ++;
  if (count_start == 1)
  {
    countdown();
    my_buzzer();
    count();
  }
}
void count() {
      btn.tick();
  if (btn.isClick()) {
    static int count = 0;
    count++;
    lcd.setCursor(4, 1);  // столбец 4 строка 1
    lcd.print(count);
  }
  }
// potRead: Function to read analog pin connected to pot and display it in 7-seg
// includes smoothing the analog sample by taking avergae of 10 readings
void potRead()
{
  unsigned long average = 0;
  // subtract the last reading:
  total = total - readings[readIndex];
  readings[readIndex] = map(analogRead(potPin), 0, 1023, 1, 99);
  // increment total and array
  total = total + readings[readIndex];
  readIndex = readIndex + 1;
  // check for end of array, wrap to start if yes
  if (readIndex >= numReadings) {
    readIndex = 0;
  }
  average = total / numReadings;
  timeLimit = ((average * 60) * 1000);
  average = average * 100 ;
  display.showNumberDecEx(average, 0x40, true);
  //delay(100);
}

//my_buzzer: function to switch on buzzer and display "done" on 7-seg
void my_buzzer (void)
{
  unsigned char i;
  unsigned char j;

  const uint8_t SEG_DONE[] = {
    SEG_B | SEG_C | SEG_D | SEG_E | SEG_G,           // d
    SEG_A | SEG_B | SEG_C | SEG_D | SEG_E | SEG_F,   // O
    SEG_C | SEG_E | SEG_G,                           // n
    SEG_A | SEG_D | SEG_E | SEG_F | SEG_G            // E
  };
  display.setSegments(SEG_DONE);
  // run for 250*1400ms = 3.5 minutes
  for (j = 0; j < 250; j++)
  {
    //output an frequency
    for (i = 0; i < 100; i++)
    {
      digitalWrite(buzzer, HIGH);
      delay(1);//wait for 1ms
      digitalWrite(buzzer, LOW);
      delay(1);//wait for 1ms
    }
    //output another frequency
    for (i = 0; i < 100; i++)
    {
      digitalWrite(buzzer, HIGH);
      delay(2);//wait for 2ms
      digitalWrite(buzzer, LOW);
      delay(2);//wait for 2ms
    }
  }
}

// countdown: function to handle and display the countdown time
void countdown() {
  // Calculate the time remaining
  unsigned long  runTime = 0;
  
  runTime = millis();
  unsigned long timeRemaining = timeLimit - (millis() - runTime);
  
  while (timeRemaining > 50 )
  {
    // To display the countdown in mm:ss format, separate the parts
    int seconds = numberOfSeconds(timeRemaining);
    int minutes = numberOfMinutes(timeRemaining);
    
    // This displays the seconds in the last two places
    display.showNumberDecEx(seconds, 0, true, 2, 2);
    // Display the minutes in the first two places, with colon
    display.showNumberDecEx(minutes, 0x80 >> 3, true, 2, 0);

    // Update the time remaining
    timeRemaining = timeLimit - (millis() - runTime);
  }
  
}

 

b707
Offline
Зарегистрирован: 26.05.2017

Один вызов my_buzzer() занимает 3.5 минуты.
Вы это серьезно?

kyber_kotlet
Offline
Зарегистрирован: 08.06.2022

Так ведь это время, которое динамик будет пищать, не столь значимо

b707
Offline
Зарегистрирован: 26.05.2017

Так в это время ничего другого работать не может.

kyber_kotlet
Offline
Зарегистрирован: 08.06.2022

Динамик пищит же в конце отсчёта заданного времени. Изменение этого цикла результата не принесло, лишь только уменьшилось количество времени, сколько динамик пищит

b707
Offline
Зарегистрирован: 26.05.2017

Ну тогда виноват цикл while в строке 204

kyber_kotlet
Offline
Зарегистрирован: 08.06.2022

Я когда замыкаю кнопку на начало отсчёта времени, перестаёт работать счётчик нажатий. Не особо наблюдаю связь с этим циклом. Либо это я глупый

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

kyber_kotlet пишет:
основной код взял с интернета
Попробуйте ниоткуда не брать, а делать самостоятельно. Тогда у людей появится желание Вам помогать.

kyber_kotlet
Offline
Зарегистрирован: 08.06.2022

ЕвгенийП пишет:

kyber_kotlet пишет:
основной код взял с интернета
Попробуйте делать самостоятельно.

Я бы с радостью, сижу теперь изучаю основы ардуино. Просто нужно было срочно закончить проект, за который мне обещали сессию автоматом закрыть на 4 :) и дали неделю сделать. Проблему решил, повесив ещё одну ардуину на подсчёт нажатий

mixail844
Offline
Зарегистрирован: 30.04.2012

kyber_kotlet пишет:
ЕвгенийП пишет:

kyber_kotlet пишет:
основной код взял с интернета
Попробуйте делать самостоятельно.

Я бы с радостью, сижу теперь изучаю основы ардуино. Просто нужно было срочно закончить проект, за который мне обещали сессию автоматом закрыть на 4 :) и дали неделю сделать. Проблему решил, повесив ещё одну ардуину на подсчёт нажатий

ужас , а потом что бы вывести значение сердечного ритма , еще 1 экран и еще ардуинка понадобиться ?

kyber_kotlet
Offline
Зарегистрирован: 08.06.2022

mixail844 пишет:

kyber_kotlet пишет:
ЕвгенийП пишет:

kyber_kotlet пишет:
основной код взял с интернета
Попробуйте делать самостоятельно.

Я бы с радостью, сижу теперь изучаю основы ардуино. Просто нужно было срочно закончить проект, за который мне обещали сессию автоматом закрыть на 4 :) и дали неделю сделать. Проблему решил, повесив ещё одну ардуину на подсчёт нажатий

еще ардуинка понадобиться ?


Я ж говорю, проект сдам, и начну переписывать код, пока что вот такие костыли))