Таймер на ардуино

Askar

✩✩✩✩✩✩✩
17 Фев 2021
14
0
Всем привет, подскажите пожалуйста что я делаю не так. Суть делаю таймер в обычном режиме не что не происходит, при долгом нажатие на кнопку таймер переключается в состояние отсчёта времени. После того как первый лимит времени вышел, таймер спрашивает у пользователя продолжить, если пользователь нажимает на кнопку, то запускается 2й таймер. По окончании 2го лимита времени таймер снова спрашивает продолжить, если пользователь нажимает на кнопку то запускается 1й таймер и так по кругу. Но если пользователь не нажмёт на кнопку во время подтверждения или нажмёт во время любого таймера на длительное время, то программа выходит из режима таймер.
Вот сам код:
#define BTN     2       // Пин кнопки
#define BUZZER_PIN  5       // Пин для баззера (если нужен)
#define BUZZER_TONE 2500    // Частота баззера в герцах
#define BUZZER_DUR  300     // Длинна сигнала баззера в мс

#include <GyverButton.h>
GButton btn(BTN, HIGH_PULL);

#include "GyverTimer.h"
GTimer_ms Timer_1((long)3 * 60 * 1000);         // 3 минут
GTimer_ms Timer_2((long)5 * 60 * 1000);         // 5 минуты

bool checkFlag = false;
uint32_t checkTimer;

void setup()
{
  Serial.begin(9600);
  pinMode(BUZZER_PIN, OUTPUT);  // Пин баззера как выход
  btn.setTimeout(1500);   
}

void loop()
{
  btn.tick();     // опрос кнопки

  if (btn.isClick()) {    // короткое нажатие
      checkFlag = !checkFlag;   // инверт флага
      Serial.print("checkFlag ");
      Serial.println(checkFlag);
  }

  if (btn.isHolded()) { // длинное нажатие
    Serial.println("Tick");
    tone(BUZZER_PIN, BUZZER_TONE, BUZZER_DUR); // подаем сигнал
    Tick();        // переход в рабочий цикл
  }




}

void Tick()
{
  if (Timer_1.isReady()) { // Запуск 1го таймера на 3 минуты
    checkFlag = true;
    checkTimer = millis();
    tone(BUZZER_PIN, BUZZER_TONE, BUZZER_DUR); // подаем сигнал
    Serial.println(3);
  }

  if (checkFlag && millis() - checkTimer >= 1500) { // после конца 1го таймера дается 1.5 сек. на нажатие кнопки. Если нажата, запуск 2го таймера, иначе вывод ошибки
    //checkTimer = millis();
    checkFlag = false;
    Serial.println("Click");

  } //else { Serial.println("NOOOOOOOOOOOOOOOOOOOOO Click");}
  if (!checkFlag) {
    Timer_2.start();

  }

  if (Timer_2.isReady()) {  // Запуск 2го таймера на 5 минут
    tone(BUZZER_PIN, BUZZER_TONE, BUZZER_DUR); // подаем сигнал
    Serial.println(5);
  }

  //else { Serial.println("EROR"); }
}
 

Вложения

poty

★★★★★★✩
19 Фев 2020
3,230
940
1. Неверно использована библиотека таймеров (GyverTimer), в частности, старт, стоп и ресет таймеров.
2. Вся обработка сосредоточена в функции Tick(), единственным способом попасть в которую является длительное нажатие кнопки (т.е., только один раз).