Загрузка данных
// Подключаем необходимые библиотеки
#include <Wire.h> // Для работы с I2C
#include <RTClib.h> // Для работы с модулем RTC
#include <LiquidCrystal_I2C.h> // Для работы с LCD дисплеем по I2C
// --- Настройки ---
// Создаем объект для RTC. Используем RTC_DS1307, т.к. он совместим с DS3231 для базовых функций
RTC_DS1307 rtc;
// Или можно использовать RTC_DS3231 rtc; если нужна точность DS3231 или доп. функции
// Настройки LCD дисплея
const int LCD_ADDRESS = 0x27; // I2C адрес дисплея (чаще всего 0x27 или 0x3F)
const int LCD_COLS = 16; // Количество столбцов
const int LCD_ROWS = 2; // Количество строк
// Создаем объект для LCD
LiquidCrystal_I2C lcd(LCD_ADDRESS, LCD_COLS, LCD_ROWS);
// Буфер для форматирования даты (DD/MM/YYYY)
char dateBuffer[11]; // 10 символов + нулевой терминатор
// Буфер для форматирования времени (HH:MM:SS)
char timeBuffer[9]; // 8 символов + нулевой терминатор
// --- Функция Setup (выполняется один раз при старте) ---
void setup() {
// Инициализируем Serial порт для отладки
Serial.begin(9600);
Serial.println("RTC Clock Initializing...");
// Инициализируем LCD дисплей
lcd.init();
lcd.backlight(); // Включаем подсветку
lcd.setCursor(0, 0);
lcd.print("RTC Clock");
lcd.setCursor(0, 1);
lcd.print("Initializing...");
// Инициализируем RTC модуль
if (!rtc.begin()) {
Serial.println("Couldn't find RTC!"); // Сообщение об ошибке, если модуль не найден
lcd.clear();
lcd.print("RTC Error!");
while (1); // Останавливаем выполнение, если RTC не найден
}
Serial.println("RTC Found!");
// --- УСТАНОВКА ВРЕМЕНИ (Раскомментировать ОДИН РАЗ, потом закомментировать!) ---
// Эта строка устанавливает время RTC на время компиляции вашего скетча.
// Загрузите скетч с этой строкой ОДИН РАЗ, затем ЗАКОММЕНТИРУЙТЕ ее и загрузите СНОВА.
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
// --------------------------------------------------------------------------
// Проверка, идет ли время (если батарейка села или время не установлено, может не идти)
if (!rtc.isrunning()) {
Serial.println("RTC is NOT running, let's set the time!");
// Можно снова попытаться установить время компиляции, если оно не идет
// rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
lcd.clear();
lcd.print("RTC not running!");
lcd.setCursor(0, 1);
lcd.print("Set time!");
}
delay(2000); // Пауза для отображения статуса инициализации
lcd.clear();
}
// --- Функция Loop (выполняется постоянно) ---
void loop() {
// 1. Получаем текущее время от RTC
DateTime now = rtc.now();
// 2. Форматируем дату в строку "DD/MM/YYYY"
// sprintf - мощная функция для форматирования строк
// %02d означает "вывести целое число (d), дополнив его нулем слева (0), если оно меньше 2 знаков (2)"
sprintf(dateBuffer, "%02d/%02d/%04d", now.day(), now.month(), now.year());
// 3. Форматируем время в строку "HH:MM:SS"
sprintf(timeBuffer, "%02d:%02d:%02d", now.hour(), now.minute(), now.second());
// 4. Выводим дату и время на LCD
lcd.setCursor(0, 0); // Курсор в начало первой строки
lcd.print("Date: ");
lcd.print(dateBuffer);
lcd.setCursor(0, 1); // Курсор в начало второй строки
lcd.print("Time: ");
lcd.print(timeBuffer);
// 5. Выводим также в Serial Monitor для отладки
Serial.print(dateBuffer);
Serial.print(" ");
Serial.println(timeBuffer);
// 6. Ждем 1 секунду перед следующим обновлением
delay(1000);
}