Это рыбы, которые будут выполнять специальные государственные задачи. Поэтому кормление начинается с секундной точностью, а съесть они все должны, пока спичка горит.
Затроллили и зачмырили знатно))) Хочу просто понять, как работает. Спасибо всем за разъяснения!
Заработало, но есть нюансы…
Продолжительность будильника - 7 секунд. Когда он срабатывает, секунды “зависают” то на 6, то на 12 секунд, а выключается будильник через 12-16 секунд.
Помогите, плиз, понять проблему.
//-------ПОДКЛЮЧЕНИЕ БИБЛИОТЕК
#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 = 46; // будильник №1 минуты
uint8_t alarm_HOUR = 12; // будильник №1 часы
uint8_t alarm2_SEC = 00; // будильник №1 секунды
uint8_t alarm2_MIN = 47; // будильник №2 минуты
uint8_t alarm2_HOUR = 12; // будильник №2 часы
//-------СТАТУСЫ
bool ReleState = false; // Состояние реле
unsigned long ReleTime = 0; // Время включения реле
const unsigned long ReleDuration = 7000; // Длительность включения (7 секунд)
//-------ИНИЦИАЛИЗАЦИИ МОДУЛЕЙ
LiquidCrystal_I2C lcd(0x27,16,2); // инициализируем LCD-дисплей 1602
iarduino_RTC time(RTC_DS1302, 5, 3, 4); // инициализируем модуль DS1302
//-------ОСНОВНАЯ НАСТРОЙКА
void setup() {
delay(300); // задержка после иницализации
Serial.begin(9600); // подключаем последовательный порт
time.begin(); // запускаем модуль RTC
//time.settime(00,33,12,26,3,25,3); // настраиваем время 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(((time.Hours==alarm_HOUR) && (time.minutes==alarm_MIN) && (time.seconds==00)) ||
((time.Hours==alarm2_HOUR) && (time.minutes==alarm2_MIN) && (time.seconds==00))) {
lcd.setCursor(9,1); // помещаем курсор вниз вправо
lcd.print("Rele-ON"); // выводим надпись на LCD
digitalWrite(PinRELE, LOW); // включаем реле
ReleState = true; // ставим статус
ReleTime = millis(); // Запоминаем время включения
}
//-------ВЫКЛЮЧЕНИЕ БУДИЛЬНИКА
if (ReleState && (millis() - ReleTime >= ReleDuration)) {
lcd.setCursor(9,1); // помещаем курсор вниз вправо
lcd.print("Rele-OF"); // выводим надпись на LCD
digitalWrite(PinRELE, HIGH); // выключаем реле
ReleState = false; // ставим статус
}
}
А где переменной time присваивается текущее время?
Зачем сравнение с time.seconds? При таком методе обновления данных легко можно не попасть в time.seconds==0