/* Электронные часы на Arduino Nano LCD 1602 + DS1302 + Rtc by Makuna Автор: metaDonta */ #include #include #include // Входит в Rtc by Makuna #include // Входит в Rtc by Makuna // ============================================ // НАСТРОЙКИ // ============================================ // Пины для DS1302 #define RTC_CLK_PIN 4 #define RTC_DAT_PIN 5 #define RTC_RST_PIN 6 // LCD 1602 I2C (адрес обычно 0x27 или 0x3F) LiquidCrystal_I2C lcd(0x27, 16, 2); // Создаем объекты для RTC ThreeWire myWire(RTC_DAT_PIN, RTC_CLK_PIN, RTC_RST_PIN); RtcDS1302 Rtc(myWire); // ============================================ // НАСТРОЙКА // ============================================ void setup() { Serial.begin(9600); Serial.println("Часы на LCD 1602 + DS1302"); Serial.println("Библиотека: Rtc by Makuna"); // Инициализация LCD lcd.init(); lcd.backlight(); lcd.clear(); lcd.setCursor(0, 0); lcd.print("metaDonta Clock"); lcd.setCursor(0, 1); lcd.print("Initializing..."); // Инициализация RTC Rtc.Begin(); // Проверка и установка времени setupRTC(); delay(2000); lcd.clear(); Serial.println("Часы готовы к работе!"); } // ============================================ // НАСТРОЙКА RTC // ============================================ void setupRTC() { // Если RTC потерял время или не был установлен if (!Rtc.IsDateTimeValid()) { Serial.println("RTC потерял время!"); // Устанавливаем время компиляции RtcDateTime manualTime = RtcDateTime(2026, 2, 2, 12, 11, 0); // год, месяц, день, час, минута, секунда Rtc.SetDateTime(manualTime); } // Проверяем, работает ли RTC if (!Rtc.GetIsRunning()) { Serial.println("RTC не работает! Запускаю..."); Rtc.SetIsRunning(true); } // Снимаем защиту от записи if (Rtc.GetIsWriteProtected()) { Serial.println("RTC защищен от записи. Снимаю защиту..."); Rtc.SetIsWriteProtected(false); } } // ============================================ // ОСНОВНОЙ ЦИКЛ // ============================================ void loop() { static unsigned long lastUpdate = 0; // Обновляем время каждую секунду if (millis() - lastUpdate >= 1000) { lastUpdate = millis(); // Получаем текущее время RtcDateTime now = Rtc.GetDateTime(); // Отображаем на LCD displayTime(now); // Выводим в Serial для отладки printDateTime(now); } delay(10); // Небольшая задержка } // ============================================ // ОТОБРАЖЕНИЕ ВРЕМЕНИ НА LCD // ============================================ void displayTime(const RtcDateTime& dt) { // Форматируем время char timeStr[9]; sprintf(timeStr, "%02d:%02d:%02d", dt.Hour(), dt.Minute(), dt.Second()); // Форматируем дату char dateStr[11]; sprintf(dateStr, "%02d/%02d/%04d", dt.Day(), dt.Month(), dt.Year()); // Выводим время на первую строку lcd.setCursor(0, 0); lcd.print("Time: "); lcd.print(timeStr); // Выводим дату на вторую строку lcd.setCursor(0, 1); lcd.print("Date: "); lcd.print(dateStr); } // ============================================ // ВСПОМОГАТЕЛЬНЫЕ ФУНКЦИИ // ============================================ void printDateTime(const RtcDateTime& dt) { char datestring[20]; snprintf_P(datestring, countof(datestring), PSTR("%02u/%02u/%04u %02u:%02u:%02u"), dt.Month(), dt.Day(), dt.Year(), dt.Hour(), dt.Minute(), dt.Second()); Serial.println(datestring); }