Всем привет!
Наверняка, невероятно популярная тема с таймерами, но столько всего перечитал и перепробовал, что в итоге запутался и пришёл к Вам за помощью.
Есть задача - включать реле на несколько секунд в определенное время, потом выключать и так 2 раза в день (утром и вечером) ежедневно.
Повторюсь, пробовал разное. В последнем варианте собрал 4 будильника: 2 на вкл/выкл и ещё 2 такие же через 1 минуту.
Модули: Arduino Nano, DS1302, LCD1602
Описание работы:
- Элемент списка
1-ый будильник включает реле на 7 секунд,
- Элемент списка
2-ой будильник выключает,
- Элемент списка
через минуту 3-ий будильник включает реле на 7 секунд,
- Элемент списка
4-ый будильник выключает.
Но функционально всё работает как надо, только если в действиях 2-ого и 4-ого будильников выполнять принудительную перезагрузку Ардуино
Помогите, пожалуйста, с настройкой таймеров (или действий) для 2-ого и 4-ого будильников вместо перезагрузки. А может, наоборот, 2 и 4 будильники исключить и правильно настроить таймеры в 1 и 3 будильниках. У меня не получилось: то включается реле, но не выключается; то включается и выключается, но потом по кругу каждые 7 секунд циклично включается/выключается, пока не перезагрузишь вручную и т.д.
Код такой (не ругайтесь, плиз):
//-------ПОДКЛЮЧЕНИЕ БИБЛИОТЕК
#include <Wire.h> // подключаем библиотеку I2C
#include <LiquidCrystal_I2C.h> // подключаем библиотеку LCD-дисплея 1602
#include <iarduino_RTC.h> // подключаем библиотеку RTC DS1302
//-------НАЗНАЧЕНИЕ ПИНОВ
const int PinRELE = 6; // вывод 6 к реле на "минус"
//-------МАССИВЫ ДЛЯ БУДИЛЬНИКОВ РЕЛЕ
uint8_t alarm_SEC = 00; // будильник №1 секунды
uint8_t alarm_MIN = 12; // будильник №1 минуты
uint8_t alarm_HOUR = 17; // будильник №1 часы
uint8_t alarm2_SEC = 07; // будильник №2 секунды
uint8_t alarm2_MIN = 12; // будильник №2 минуты
uint8_t alarm2_HOUR = 17; // будильник №2 часы
uint8_t alarm3_SEC = 00; // будильник №3 секунды
uint8_t alarm3_MIN = 13; // будильник №3 минуты
uint8_t alarm3_HOUR = 17; // будильник №3 часы
uint8_t alarm4_SEC = 07; // будильник №4 секунды
uint8_t alarm4_MIN = 13; // будильник №4 минуты
uint8_t alarm4_HOUR = 17; // будильник №4 часы
bool alarm_FLAG1 = true; // будильник №1 разрешение работы
bool alarm_FLAG2 = false; // будильник №1 включаем реле
bool alarm2_FLAG1 = true; // будильник №2 разрешение работы
bool alarm2_FLAG2 = false; // будильник №2 выключаем реле
bool alarm3_FLAG1 = true; // будильник №3 разрешение работы
bool alarm3_FLAG2 = false; // будильник №3 включаем реле
bool alarm4_FLAG1 = true; // будильник №4 разрешение работы
bool alarm4_FLAG2 = false; // будильник №4 выключаем реле
//-------ИНИЦИАЛИЗАЦИИ МОДУЛЕЙ
LiquidCrystal_I2C lcd(0x27,16,2); // инициализируем LCD-дисплей 1602
iarduino_RTC time(RTC_DS1302, 5, 3, 4); // инициализируем модуль DS1302
//ПРОЧЕЕ
unsigned long current_pause = millis(); //целое число паузы для таймера
bool rele_pause; //переменная паузы для таймера
//-------ОСНОВНАЯ НАСТРОЙКА
void setup() {
delay(300); // задержка после иницализации
Serial.begin(9600); // подключаем последовательный порт
time.begin(); // запускаем модуль RTC
//time.settime(00,17,20,24,3,25,6); // настраиваем время 0 сек, 17 мин, 20 часов, 24, март, 2025, суббота
lcd.init(); // включаем LCD
lcd.backlight(); // включаем подсветку LCD
lcd.setCursor(9,1); // помещаем курсор вниз вправо
lcd.print("Rele-OF"); // выводим надпись на LCD
pinMode(PinRELE, OUTPUT); // подключаем контакт реле на выход
digitalWrite(PinRELE, HIGH); // выключаем реле - посылаем высокий сигнал
}
//-------ПРОГРАММА
void loop() {
if (millis() % 1000 == 0) { // выводим время каждую секунду
Serial.println(time.gettime("d-m-Y, H:i:s, D")); // выводим время на последовательный порт
delay(1); // задержка в 1 мс
lcd.setCursor(0,0); // помещаем курсор вверх влево
lcd.print(time.gettime("d M Y")); // выводим дату на LCD
lcd.setCursor(0,1); // помещаем курсор вниз влево
lcd.print(time.gettime("H:i:s")); // выводим время на LCD
}
//-------РАБОТА БУДИЛЬНИКОВ КОМПРЕССОРА
if(alarm_FLAG1){ // если будильник №1 включён
if(time.seconds==alarm_SEC){ // если совпали секунды
if(time.minutes==alarm_MIN){ // если совпали минуты
if(time.Hours==alarm_HOUR){ // если совпали часы
alarm_FLAG2=true; // устанавливаем флаг, разрешающий будильнику №1 действовать
}
}
}
}
else{alarm_FLAG2=false;} // если будильник выключен, то сбрасываем флаг, разрешающий будильнику №1 действовать
if(alarm_FLAG2){Func_alarm_action(); // включаем реле
}
if(alarm2_FLAG1){ // если будильник №2 включён
if(time.seconds==alarm2_SEC){ // если совпали секунды
if(time.minutes==alarm2_MIN){ // если совпали минуты
if(time.Hours==alarm2_HOUR){ // если совпали часы
alarm2_FLAG2=true; // устанавливаем флаг, разрешающий будильнику №2 действовать
}
}
}
}
else{alarm2_FLAG2=false;} // если будильник выключен, то сбрасываем флаг, разрешающий будильнику №2 действовать
if(alarm2_FLAG2){Func_alarm2_action(); // выключаем реле
}
if(alarm3_FLAG1){ // если будильник №3 включён
if(time.seconds==alarm3_SEC){ // если совпали секунды
if(time.minutes==alarm3_MIN){ // если совпали минуты
if(time.Hours==alarm3_HOUR){ // если совпали часы
alarm3_FLAG2=true; // устанавливаем флаг, разрешающий будильнику №3 действовать
}
}
}
}
else{alarm3_FLAG2=false;} // если будильник выключен, то сбрасываем флаг, разрешающий будильнику №3 действовать
if(alarm3_FLAG2){Func_alarm3_action(); // включаем реле
}
if(alarm4_FLAG1){ // если будильник №4 включён
if(time.seconds==alarm4_SEC){ // если совпали секунды
if(time.minutes==alarm4_MIN){ // если совпали минуты
if(time.Hours==alarm4_HOUR){ // если совпали часы
alarm4_FLAG2=true; // устанавливаем флаг, разрешающий будильнику №4 действовать
}
}
}
}
else{alarm4_FLAG2=false;} // если будильник выключен, то сбрасываем флаг, разрешающий будильнику №4 действовать
if(alarm4_FLAG2){Func_alarm4_action(); // выключаем реле
}
}
//-------ДЕЙСТВИЯ
void Func_alarm_action(){ // активируем действие
if (rele_pause == 0 && millis() - current_pause >= 7000) { // 7 секунд
lcd.setCursor(9,1); // помещаем курсор вниз вправо
lcd.print("Rele-ON"); // выводим надпись на LCD
digitalWrite(PinRELE, LOW); // включаем реле
current_pause = millis();
rele_pause = 1;
}
}
void Func_alarm2_action(){ // активируем действие
asm volatile("jmp 0x00"); // перезагрузка
}
void Func_alarm3_action(){ // активируем действие
if (rele_pause == 0 && millis() - current_pause >= 7000) { // 7 секунд
lcd.setCursor(9,1); // помещаем курсор вниз вправо
lcd.print("Rele-ON"); // выводим надпись на LCD
digitalWrite(PinRELE, LOW); // включаем реле
current_pause = millis();
rele_pause = 1;
}
}
void Func_alarm4_action(){ // активируем действие
asm volatile("jmp 0x00"); // перезагрузка
}