Загрузка данных


// Подключаем необходимые библиотеки
#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);
}