Переписал код. Вроде работает. Вот полный код всего проекта, пытаюсь сделать суточный таймер с выборов режимов и отображением на 7 сегментном индикаторе. Начал с простого, получить время - изменить время, сохранить изменения.
#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 - отображать часы.
int setnumMenu = 0; //Выбор меню 0 - ничего не отображать, 2 - настройка часов , 3 - настройка таймеров
void show_number(int num)
{
switch(num)
{
case 0:
digitalWrite(segmentA, HIGH);
digitalWrite(segmentB, HIGH);
digitalWrite(segmentC, HIGH);
digitalWrite(segmentD, HIGH);
digitalWrite(segmentE, HIGH);
digitalWrite(segmentF, HIGH);
digitalWrite(segmentG, LOW);
break;
case 1:
digitalWrite(segmentA, LOW);
digitalWrite(segmentB, HIGH);
digitalWrite(segmentC, HIGH);
digitalWrite(segmentD, LOW);
digitalWrite(segmentE, LOW);
digitalWrite(segmentF, LOW);
digitalWrite(segmentG, LOW);
break;
case 2:
digitalWrite(segmentA, HIGH);
digitalWrite(segmentB, HIGH);
digitalWrite(segmentC, LOW);
digitalWrite(segmentD, HIGH);
digitalWrite(segmentE, HIGH);
digitalWrite(segmentF, LOW);
digitalWrite(segmentG, HIGH);
break;
case 3:
digitalWrite(segmentA, HIGH);
digitalWrite(segmentB, HIGH);
digitalWrite(segmentC, HIGH);
digitalWrite(segmentD, HIGH);
digitalWrite(segmentE, LOW);
digitalWrite(segmentF, LOW);
digitalWrite(segmentG, HIGH);
break;
case 4:
digitalWrite(segmentA, LOW);
digitalWrite(segmentB, HIGH);
digitalWrite(segmentC, HIGH);
digitalWrite(segmentD, LOW);
digitalWrite(segmentE, LOW);
digitalWrite(segmentF, HIGH);
digitalWrite(segmentG, HIGH);
break;
case 5:
digitalWrite(segmentA, HIGH);
digitalWrite(segmentB, LOW);
digitalWrite(segmentC, HIGH);
digitalWrite(segmentD, HIGH);
digitalWrite(segmentE, LOW);
digitalWrite(segmentF, HIGH);
digitalWrite(segmentG, HIGH);
break;
case 6:
digitalWrite(segmentA, HIGH);
digitalWrite(segmentB, LOW);
digitalWrite(segmentC, HIGH);
digitalWrite(segmentD, HIGH);
digitalWrite(segmentE, HIGH);
digitalWrite(segmentF, HIGH);
digitalWrite(segmentG, HIGH);
break;
case 7:
digitalWrite(segmentA, HIGH);
digitalWrite(segmentB, HIGH);
digitalWrite(segmentC, HIGH);
digitalWrite(segmentD, LOW);
digitalWrite(segmentE, LOW);
digitalWrite(segmentF, LOW);
digitalWrite(segmentG, LOW);
break;
case 8:
digitalWrite(segmentA, HIGH);
digitalWrite(segmentB, HIGH);
digitalWrite(segmentC, HIGH);
digitalWrite(segmentD, HIGH);
digitalWrite(segmentE, HIGH);
digitalWrite(segmentF, HIGH);
digitalWrite(segmentG, HIGH);
break;
case 9:
digitalWrite(segmentA, HIGH);
digitalWrite(segmentB, HIGH);
digitalWrite(segmentC, HIGH);
digitalWrite(segmentD, HIGH);
digitalWrite(segmentE, LOW);
digitalWrite(segmentF, HIGH);
digitalWrite(segmentG, HIGH);
break;
default:
digitalWrite(segmentA, LOW);
digitalWrite(segmentB, HIGH);
digitalWrite(segmentC, HIGH);
digitalWrite(segmentD, HIGH);
digitalWrite(segmentE, HIGH);
digitalWrite(segmentF, LOW);
digitalWrite(segmentG, HIGH);
break;
}
}
void show_h(){ //H
digitalWrite(segmentA, LOW);
digitalWrite(segmentB, HIGH);
digitalWrite(segmentC, HIGH);
digitalWrite(segmentD, LOW);
digitalWrite(segmentE, HIGH);
digitalWrite(segmentF, HIGH);
digitalWrite(segmentG, HIGH);
}
void show_min(){ //-
digitalWrite(segmentA, LOW);
digitalWrite(segmentB, LOW);
digitalWrite(segmentC, LOW);
digitalWrite(segmentD, LOW);
digitalWrite(segmentE, LOW);
digitalWrite(segmentF, LOW);
digitalWrite(segmentG, HIGH);
}
void display_digits_off(){
digitalWrite(segmentA, LOW);
digitalWrite(segmentB, LOW);
digitalWrite(segmentC, LOW);
digitalWrite(segmentD, LOW);
digitalWrite(segmentE, LOW);
digitalWrite(segmentF, LOW);
digitalWrite(segmentG, LOW);
}
//Основные функции
void mode_display_time(){ //функция отображения текущего времени
DateTime now = rtc.now();
int now_time = now.hour()*100 + now.minute();
int a = now_time / 1000;
int b = now_time % 1000/100;
int c = now_time % 100/10;
int d = now_time % 10;
digitalWrite(DIGIT_1PIN,HIGH);
digitalWrite(DIGIT_2PIN,LOW);
digitalWrite(DIGIT_3PIN,LOW);
digitalWrite(DIGIT_4PIN,LOW);
show_number(a);
delay(time_delay);
digitalWrite(DIGIT_1PIN,LOW);
digitalWrite(DIGIT_2PIN,HIGH);
digitalWrite(DIGIT_3PIN,LOW);
digitalWrite(DIGIT_4PIN,LOW);
show_number(b);
delay(time_delay);
digitalWrite(DIGIT_1PIN,LOW);
digitalWrite(DIGIT_2PIN,LOW);
digitalWrite(DIGIT_3PIN,HIGH);
digitalWrite(DIGIT_4PIN,LOW);
show_number(c);
delay(time_delay);
digitalWrite(DIGIT_1PIN,LOW);
digitalWrite(DIGIT_2PIN,LOW);
digitalWrite(DIGIT_3PIN,LOW);
digitalWrite(DIGIT_4PIN,HIGH);
show_number(d);
delay(time_delay);
digitalWrite(DIGIT_1PIN,LOW);
digitalWrite(DIGIT_2PIN,LOW);
digitalWrite(DIGIT_3PIN,LOW);
digitalWrite(DIGIT_4PIN,LOW);
butt4.setTimeout(1000);
if (butt4.isHold()){tone(SPEAKER, 1000, 10); setnumMenu = 1;}
}
void setup_time(){
DateTime now = rtc.now();
if (!settingTime) {
hour_new = now.hour();
minute_new = now.minute();
Serial.print("No");
}
if (butt1.isClick()) {tone(SPEAKER, 1000, 10); settingTime = !settingTime; Serial.print("Yes");};
if (butt2.isClick()) {tone(SPEAKER, 1000, 10); hour_new = (hour_new + 1) % 24; rtc.adjust(DateTime(now.year(), now.month(), now.day(), hour_new, now.minute(), now.second())); Serial.print(hour_new); };
if (butt3.isClick()) {tone(SPEAKER, 1000, 10); minute_new = (minute_new + 1) % 60; rtc.adjust(DateTime(now.year(), now.month(), now.day(), now.hour(), minute_new, now.second())); Serial.print(minute_new);};
if (butt4.isClick()) {tone(SPEAKER, 1000, 10); numMenu = 1; setnumMenu = 0; };
}
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));
}
void loop() {
DateTime now = rtc.now();
Serial.println(now.hour());
Serial.println(now.minute());
Serial.println(now.second());
//Чтение кнопок
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;
}
if ((numMenu == 1 ) && (setnumMenu == 1)) { setup_time(); }
if (butt1.isClick()) {tone(SPEAKER, 1000, 10); numMenu = numMenu + 1; if (numMenu > 1) {numMenu = 0;}} // меню 1 показать время на 500 мс. - Нажата кнопка MODE
}
Просто “гуру” сейчас напишут, что код говно, я с этим соглашусь полностью, но пока делаю по простому, далее постараюсь сделать все лучше.