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

trek1203

✩✩✩✩✩✩✩
31 Окт 2024
2
0
Проблема в следующем: функция setTime() при примерно 3м вызове(иногда и раньше или позже) выполняется очень быстро. Где команда общения с последовательным кодом Serial.println("SEcond"); при первом вызове всё нормально, и на комп это выдаёт раз в секунду, 10 раз если нет нажатия на кнопки, и выходит из функции. Но при 3м вызове этой функции SEcond выдаёт очень быстро 10 раз и происходит выход из функции setTime(). Не могу понять почему так происходит. Если ресетнуть контроллер то снова работает как положено, но на 3й раз случается та же история.
Значение переменной NowTimer почему то становится отрицательным (NowTimer = -20872, а millis() в это момент равен
44670






#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, четверг

}
 
Изменено:

viktor1703

★★★✩✩✩✩
9 Дек 2021
615
146
Так лучше будет
C++:
#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, четверг

}
 

asaitov

✩✩✩✩✩✩✩
16 Янв 2024
16
6
Значение переменной NowTimer почему то становится отрицательным (NowTimer = -20872, а millis() в это момент равен
44670
Это потому что NowTimer у тебя объявлена как int (знаковое двухбайтное число с диапазоном значений от -32768 до 32767), а millis() возвращает unsigned long (4 байта, без знака, значения от 0 до 4294967295). Попробуй NowTimer сделать тоже unsigned long.