Всем привет. Сделал схему, написал код - все работает, часы идут. Проходит месяц - часы становятся 00:00 и дальше идут, но время уже не реальное, а от сброшенного, от этого таймеры перестают работать. Перенастроил (без сброса ардуино), снова проходит примерно месяц - опять часы 00:00 и снова идут.
Кусок кода, с setup и loop.
#include <Wire.h>
#include <RTClib.h>
#include <GyverButton.h>
#include <EEPROM.h>
#define segmentA 2
#define segmentB 3
#define segmentC 4
#define segmentD 5
#define segmentE 6
#define segmentF 7
#define segmentG 8
#define segmentDP 9
//задержка вкл/выкл сегментов
int time_delay = 4;
#define DIGIT_1PIN 10 //(1) //1234
#define DIGIT_2PIN 11 //(2)
#define DIGIT_3PIN 12 //(3)
#define DIGIT_4PIN 13 //(4)
//кнопки
GButton butt1; //mode
GButton butt2; //UP
GButton butt3; //DOWN
GButton butt4; //SET
//Динамик
#define SPEAKER A1
//РЕЛЕ
int Relay = A2;
//для RTC
RTC_DS1307 rtc;
int hour_new = 0;
int minute_new = 0;
bool settingTime = false;
//Паметры меню
int numMenu = 0; //Выбор меню 0 - ничего не отображать, 1 - отображать часы, 2 - показать час включения, 3 - показать час выключения.
int setnumMenu = 0; //Выбор меню 0 - ничего не отображать, 1 - настройка часов , 2 - настройка часа включения реле, 3 - настройка часа выключения реле
//Таймеры
int onHour = 255; // час включения
int offHour = 255; // час выключения
void setup() {
pinMode(segmentA, OUTPUT);
pinMode(segmentB, OUTPUT);
pinMode(segmentC, OUTPUT);
pinMode(segmentD, OUTPUT);
pinMode(segmentE, OUTPUT);
pinMode(segmentF, OUTPUT);
pinMode(segmentG, OUTPUT);
pinMode(DIGIT_1PIN, OUTPUT);
pinMode(DIGIT_2PIN, OUTPUT);
pinMode(DIGIT_3PIN, OUTPUT);
pinMode(DIGIT_4PIN, OUTPUT);
pinMode(Relay, OUTPUT);
//Serial.begin(9600);
Wire.begin();
rtc.begin();
//rtc.adjust(DateTime(2023, 8, 30, 22, 07, 0)); // изначальная установка часов.
onHour = EEPROM.read(0); // включение реле
offHour = EEPROM.read(2); // выключение реле
}
void loop() {
DateTime now = rtc.now();
int currentHour = now.hour();
if (onHour==255 || offHour == 255) {digitalWrite(Relay, HIGH);}
//Чтение кнопок
int analog = analogRead(A7);
butt1.tick(analog < 100 && analog >= 0);
butt2.tick(analog < 210 && analog > 150);
butt3.tick(analog < 330 && analog > 280);
butt4.tick(analog < 450 && analog > 370);
switch(numMenu)
{
case 0: if ((numMenu == 0 ) && (setnumMenu == 0)) { display_digits_off(); } break; // выключить дисплей
case 1: if ((numMenu == 1 ) && (setnumMenu == 0)) { mode_display_time(); } break; // настройка времени
case 2: if ((numMenu == 2 ) && (setnumMenu == 0)) { onHourRelay(); } break; // настройка "часа" включения реле
case 3: if ((numMenu == 3 ) && (setnumMenu == 0)) { offHourRelay(); } break; // настройка "часа" выключения реле
}
if ((numMenu == 1 ) && (setnumMenu == 1)) { setup_time(); }
if ((numMenu == 2 ) && (setnumMenu == 2)) { editOnHourRelay(); }
if ((numMenu == 3 ) && (setnumMenu == 3)) { editOffHourRelay(); }
if (butt1.isClick()) {tone(SPEAKER, 1000, 10); numMenu = numMenu + 1; if (numMenu > 3) {numMenu = 0;}} // меню 1 показать время - Нажата кнопка MODE
if (currentHour == onHour && onHour < 255) {
digitalWrite(Relay, LOW); // Turn on the output
} else if (currentHour == offHour && offHour < 255) {
digitalWrite(Relay, HIGH); // Turn off the output
}
}
Грешу на строчки:
int hour_new = 0;
int minute_new = 0;
Правильно понимаю, что срабатывает reset на контроллере из-за наводок и МК сбрасывается ?? Как сделать так, что бы arduino nano не сбрасывала настройки из-за наводок??? (Блок питания использую заводской от роутера). СПАСИБО