Программирование часов DS1302 и индикатора TM1637

Проблема в следующем: функция setTime() при примерно 3м вызове(иногда и раньше или позже) выполняется очень быстро. Где команда общения с последовательным кодом Serial.println(“SEcond”); при первом вызове всё нормально, и на комп это выдаёт раз в секунду, 10 раз если нет нажатия на кнопки, и выходит из функции. Но при 3м вызове этой функции SEcond выдаёт очень быстро 10 раз и происходит выход из функции setTime(). Не могу понять почему так происходит. Если ресетнуть контроллер то снова работает как положено, но на 3й раз случается та же история.

#include <Wire.h>
#include <GyverTM1637.h>
#include <iarduino_RTC.h>
iarduino_RTC time(RTC_DS1302,6,8,7);
#define CLK 13
#define DIO 12
int bright = 1;
int sec;
int min;
int hour;
bool flag = 1;
int BrightButton = 2;
int setButton = 3;
bool current=0;
bool tekButton = 0; //Кнопка яркости
bool prevButton = 1; //1 чтобы при включении не срабатывала кнопка(до установки значений 0)
bool tekButton1 = 0; //Кнопка установки времени
bool prevButton1 = 1;
GyverTM1637 disp(CLK, DIO);
uint32_t Now, clocktimer;
void setup() {
delay(300);
time.begin(&Wire);

Serial.begin(9600);
disp.brightness(7);
disp.clear();
pinMode(BrightButton, INPUT);
pinMode(setButton, INPUT);
}
void loop() {
time.gettime();
min = time.minutes; //Получение времени
hour = time.Hours;
sec = time.seconds;
disp.displayClockScroll( hour, min, 10);
if (millis() - Now > 500) //Мигание двоеточием
{
Now = millis();
flag = !flag;
disp.point(flag);
}
tekButton = debounce(prevButton, BrightButton);
if(tekButton == 1 && prevButton == 0) // регулировка яркости дисплея
{
BRIGHT();
}
prevButton = tekButton;
tekButton1 = debounce(prevButton1, setButton);
if(tekButton1 == 1 && prevButton1 == 0) // Вход в settime
{
setTime();
}
prevButton1 = tekButton1;







}


bool debounce(bool last, int but) //обработка кнопок
{
current=digitalRead(but);
if(last!=current)
{
delay(5);
current=digitalRead(but);
return(current);
}
}
void BRIGHT() //Регулировка яркости дисплея
{
bright++;
if (bright>7){ bright = 0;}
disp.brightness(bright);
}
void setTime() //Функция установки времени
{
delay(100);
int Timer = 0;
int NowTimer = 0;
bool flag = 0;
int Now = 0;
time.gettime();
min = time.minutes; //Получение времени
hour = time.Hours;
disp.point(0); //обозначение что меняются часы
NowTimer = 0;
while(Timer<10) //Цикл установки Часов
{

if (millis() - Now > 400) //Мигание временем
{
Now = millis();
flag = !flag;
if(flag == 0)
{
disp.clear();
}
else disp.displayClockScroll( hour, min, 5);
}

int but = debounce(prevButton1, setButton); //Настройка часов
if(but == 1 && prevButton1 == 0)
{
hour++;
if(hour==25){hour=0;}
Timer = 0;
}
prevButton1 = but;
int but1 = debounce(prevButton, BrightButton); //Настройка минут
if(but1 == 1 && prevButton == 0)
{
min++;
if(min==60){min=0;}
Timer = 0;
}
prevButton = but1;
if (millis() - NowTimer > 1000) //Таймер выхода из режима установки
{
Serial.println("SEcond");
NowTimer = millis();
Timer++;
}
}
time.settime(0, min, hour, 12, 6, 20, 3); // 0 сек, 30 мин, 18 часов, 12, июня, 2020, четверг

}

Значение переменной NowTimer почему то становится отрицательным (NowTimer = -20872, а millis() в это момент равен
44670

Тип значения миллис - uint32. А тип вашего NowTimer - просто int. Дальше продолжать?
Тоже самое относится к переменной Now.

3 лайка

Благодарю. Проблема действительно скрывалась в этом :handshake: