Всем здравствуйте.
Написал второй свой скетч, прошил. Ардуино нано с алика, олд бутлоадер и 4разрядный дисплей на TM1637. Простой таймер обратного остчета с одной кнопкой.
Наблюдаю вот такую картину:
При запуске все нормально(01мин:00сек), но при начале отсчета времени по короткому клику, секунды не убывают как задумано, а кратковременно вспыхивают все сегменты 4го разряда , и при этом прибавляется по одной минуте.
При удержании кнопки секунды начисляются - а потом, при отпускании кнопки, отсчет идет как положено, вычитает по одной секунде, но цифры не соответствуют реальным значениям переменных(минуты перед этим начислялись и пришли в беспорядок). По этой причине сигнал получается не по нулям.
С другими библиотеками то же самое. disp.clear(); перед отображением только мерцание вызывает, а значения как были так и остаются неверные.
Посмотрите, кому не лень, пожалуйста. И если нетрудно, порекомендуйте более правильно компоновать код, чтобы было красиво и экономично. Намеренно выбросил ненужный антидребезг в обработчике кнопки, и старался объявлять переменные внутри функций. Не знаю, правильно это или нет. Писал на телефоне, может где-то некрасиво выглядит, не видно толком.
#define btnPin 5 //кнопка
//#define ledPin 8
#define buzPin 4 //пищалка
#define CLK 6
#define DIO 7
#include <GyverTM1637.h>
GyverTM1637 disp(CLK, DIO);
bool longClick, shortClick = false; //флаги кнопок
bool alarm = false; //флаг сигнала
uint8_t secund = 0;
uint8_t minut = 1;
void setup() {
pinMode(btnPin, INPUT_PULLUP);
// pinMode(ledPin, OUTPUT);
pinMode(buzPin, OUTPUT);
disp.clear();
disp.brightness(0); //яркость минимум
}
void loop() {
Button();
setupTimer(); //установка времени
goTime(); //отсчет времени
Signal();
DispTimer (); //показываем время
}
//показываем время
void DispTimer () {
byte dispTime[] = {(byte)minut / 10, (byte)minut % 10, (byte)secund / 10, (byte)secund % 10}; //массив значений каждого разряда дисплея
disp.display(dispTime); //показываем
}
//сигналим по истечению времени перывистым сигналом и встаем на отсчете 1мин , чтоб не уйти в минус при повторном запуске
void Signal() {
if (alarm) {
static unsigned long timeled;
int i {16};
do {
if((millis()-timeled)>=500ul) {
// digitalWrite(ledPin,!digitalRead(ledPin));
digitalWrite(buzPin,!digitalRead(buzPin));
timeled = millis();
i--;
}
}
while (i>0);
alarm = false;
minut = 1;
}
}
//обратный отсчет времени
void goTime() {
static unsigned long timerGo; //отсчет сек
static bool points; //флаг точек дисплея
if (shortClick) {
if (millis()-timerGo >1000) {
points = !points;
disp.point(points); //мигаем точками
timerGo = millis();
secund--;
}
if (secund < 0) {
secund = 59;
minut--; }
if (minut == 0 && secund == 0) {
alarm = true; //включаем сигнал
shortClick = false; //останавливаем отсчет
}
}
}
//установка времени
void setupTimer() {
if (longClick) {
secund += 10; }
if (secund >= 60) {
secund = 0;
minut++; }
if (minut >= 100) {
minut = 0;
secund = 0;
}
longClick = false;
}
//кнопка
void Button() {
static unsigned long pressTime;
static bool button;
static bool push = false;
button = digitalRead(btnPin);
if (!button && !push) {
pressTime = millis();
push = true;
}
if (!button && push && millis()-pressTime >= 400ul) {
pressTime = millis();
longClick = true; //флаг на установку времени
alarm = false;
}
if (button && push) {
push = false;
shortClick = !shortClick; //флаг на паузу и пуск отсчета
alarm = false;
}
}