Попытался сделать минимальный рабочий скетч с RTC, чтобы как можно меньше изменять ваш исходный.
Дело это непростое))) За дефицитом времени - сокращённый вариант, только секунды , минуты и часы. По аналогии несложно будет сделать. Мигалку не трогал и не проверял, т.к. вывод в сериал, если делать , то по другому. У меня в Proteus нет ds3231, делал на ds1302, не проблема поменять.
По поводу библиотеки советую почитать здесь #3
https://forum.arduino.ru/t/ne-rabotaet-vremya-na-module-chasov-realnogo-vremeni-ds1302/12811/3
Спойлер
#include <iarduino_RTC.h>
iarduino_RTC watch(RTC_DS1302, 2, 3, 4);
//заменить на нужный модуль
#define sek_ TIME[0]
#define min_ TIME[1]
#define hour_ TIME[2]
#define day_ TIME[3]
#define mon_ TIME[4]
#define year_ TIME[5]
#define wday_ TIME[6]
const int setButt = 5;
const int upButt = 6;
const int downButt = 7;
int mode = 0;
bool setFlag = LOW;
byte TIME[7] = {0, 51, 21, 27, 10, 15, 2};
//массив для хранения времени
unsigned long buttonTimer = 0;
void printTime();
void checkTime();
void ButtonSetControl();
void setup() {
for (int butts = 5; butts < 8; butts++) {
pinMode (butts, INPUT_PULLUP);
}
delay(300);
Serial.begin(9600);
delay(300);
watch.begin();
watch.settime(sek_, min_, hour_, day_, mon_, year_, wday_);
}
void loop() {
static byte tik = 0;
if (millis() - buttonTimer > 20) {
buttonTimer = millis();
ButtonSetControl();
if (tik >= 50) {
if (!setFlag) {
checkTime();
}
printTime();
tik = 0;
}
tik++;
}
}
void checkTime() {
watch. gettime();
sek_ = watch.seconds;
min_ = watch.minutes;
hour_ = watch.Hours;
}
void printTime() {
for (int poz = 2; poz >= 0; poz--) {
Serial.print(TIME[poz]);
Serial.print(" ");
}
Serial.println();
}
Спойлер
void ButtonSetControl() {
static byte setButtstat = 0;
static bool upFlag = LOW;
static bool downFlag = LOW;
watch.blinktime(mode, 2);
int setBUTTON = digitalRead(setButt);
//отрабатываем все возможные состояния кнопки SET
// 4 нажатия и 4 отпускания(сокращённый вариант: сек, мин, час)
if (setBUTTON == LOW && setButtstat == 0 ) {
setFlag = true;
setButtstat = 1;
mode = 1;
}
if (setBUTTON == HIGH && setButtstat == 1) {
setButtstat = 2;
}
if (setBUTTON == LOW && setButtstat == 2) {
setButtstat = 3;
mode = 2;
}
if (setBUTTON == HIGH && setButtstat == 3) {
setButtstat = 4;
}
if (setBUTTON == LOW && setButtstat == 4) {
setButtstat = 5;
mode = 3;
}
if (setBUTTON == HIGH && setButtstat == 5) {
setButtstat = 6;
}
if (setBUTTON == LOW && setButtstat == 6) {
setButtstat = 7;
mode = 0;
}
if (setBUTTON == HIGH && setButtstat == 7) {
setButtstat = 0;
setFlag = false;
watch.settime(sek_,min_, hour_, -1, -1, -1, -1);//
// устанавливаем время непосредственно перед выходом из меню
//чтобы не убежало)))
}
if (mode) {
int upBUTTON = digitalRead(upButt);
if (upBUTTON == LOW && upFlag == LOW) {
upFlag = HIGH;
switch (mode) {
/* сек */ case 1: sek_ += 1; if (sek_ > 59)sek_ = 0; break;
/* мин */ case 2: min_ += 1; if (min_ > 59)min_ = 0; break;
/* час */ case 3: hour_ += 1; if (hour_ > 23)hour_ = 0; break;
/* дни */// case 4: watch.settime(-1, -1, -1, (watch.day==31?1:watch.day+1), -1, -1, -1); break;
/* мес */// case 5: watch.settime(-1, -1, -1, -1, (watch.month==12?1:watch.month+1), -1, -1); break;
/* год */// case 6: watch.settime(-1, -1, -1, -1, -1, (watch.year==99?0:watch.year+1), -1); break;
/* д.н.*/// case 7: watch.settime(-1, -1, -1, -1, -1, -1, (watch.weekday==6?0:watch.weekday+1) ); break;}
}
}//==================
if (upBUTTON == HIGH && upFlag == HIGH) {
upFlag = LOW;
}
int downBUTTON = digitalRead(downButt);
if (downBUTTON == LOW && downFlag == LOW ) {
downFlag = HIGH;
switch (mode)
{
/* сек */ case 1: if (sek_ < 2 )sek_ = 1; sek_ -= 1; break;
/* мин */ case 2: if (min_ < 2 )min_ = 1; min_ -= 1; break;
/* час */ case 3: if (hour_ < 2 )hour_ = 1; hour_ -= 1; break;
/* дни */ case 4: watch.settime(-1, -1, -1, (watch.day == 1 ? 31 : watch.day - 1), -1, -1, -1); break;
/* мес */ case 5: watch.settime(-1, -1, -1, -1, (watch.month == 1 ? 12 : watch.month - 1), -1, -1); break;
/* год */ case 6: watch.settime(-1, -1, -1, -1, -1, (watch.year == 0 ? 99 : watch.year - 1), -1); break;
/* д.н.*/ case 7: watch.settime(-1, -1, -1, -1, -1, -1, (watch.weekday == 0 ? 6 : watch.weekday - 1) ); break;
}
}
if (downBUTTON == HIGH && downFlag == HIGH) {
downFlag = LOW;
}
//return;
}
}