LED часы Arduino Nano 3.0, Ds3231,DHT11,MAX7219

Попытался сделать минимальный рабочий скетч с RTC, чтобы как можно меньше изменять ваш исходный.
Дело это непростое))) За дефицитом времени - сокращённый вариант, только секунды , минуты и часы. По аналогии несложно будет сделать. Мигалку не трогал и не проверял, т.к. вывод в сериал, если делать , то по другому. У меня в Proteus нет ds3231, делал на ds1302, не проблема поменять.

По поводу библиотеки советую почитать здесь #3
https://forum.arduino.ru/t/ne-rabotaet-vremya-na-module-chasov-realnogo-vremeni-ds1302/12811/3

bandicam 2024-01-13 22-49-42-022_004

Спойлер
#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;
  }
}
1 лайк