DS3231 RTC к Arduino + Nokia 5110: часы, дата, температура, кастомный шрифт

DS3231 подключение к  дисплею NOKIA 5110

Модуль часов реального времени DS3231 — точный RTC с встроенным термодатчиком, резервной батареей CR2032 и интерфейсом I²C. Подключаем к Arduino, считываем время, дату, температуру и выводим всё на графический дисплей Nokia 5110. Научимся устанавливать время, работать с 12/24-часовым форматом, выводить кастомный шрифт и создавать стильные цифровые часы.

Модуль RTC DS3231 с батареей CR2032

Преимущества DS3231 перед DS1307

DS3231 точнее (±2 ppm ≈ 1 минута в год), имеет встроенный термокомпенсированный кварц, диапазон -40…+85 °C и встроенный датчик температуры. Работает от 3,3–5 В, потребляет всего 3,5 мкА в режиме ожидания. Резервная батарея держит время годами.

DS3231 с резервной батареей CR2032

Схема подключения DS3231 к Arduino

I²C-шина: SDA → A4, SCL → A5 (Uno/Nano). VCC → 5 В, GND → GND. Для Nokia 5110 используем пины 3–7 (как в предыдущем уроке).

Схема подключения DS3231 и Nokia 5110 к Arduino Контакты модуля DS3231: SQW, 32K, SCL, SDA

Установка времени (сеттер)

#include <DS3231.h>
#include <Wire.h>

DS3231 rtc;

void setup() {
  Wire.begin();
  rtc.begin();
  // Установка: год, месяц, день, день недели (1=вс), час, минута, секунда
  rtc.setDateTime(2020, 12, 27, 6, 14, 30); // суббота
}
Устанавливает точное время и дату на DS3231: 27 декабря 2020 года, суббота, 14:30:30.

Базовый скетч — часы на Nokia 5110

#include <Adafruit_GFX.h>
#include <Adafruit_PCD8544.h>
#include <DS3231.h>
#include <Wire.h>

// Инициализация дисплея: (CLK, DIN, DC, CE, RST)
Adafruit_PCD8544 display = Adafruit_PCD8544(7, 6, 5, 4, 3);

// DS3231 объект
DS3231 rtc;

// Дни недели
const char* weekdays[7] = {"Вс", "Пн", "Вт", "Ср", "Чт", "Пт", "Сб"};

void setup() {
  Wire.begin();
  rtc.begin();
  
  display.begin();
  display.setContrast(55);
  display.clearDisplay();
}

void loop() {
  // Получаем текущее время
  int hour = rtc.getHour(true);    // true = 24-часовой формат
  int minute = rtc.getMinute();
  int second = rtc.getSecond();
  
  // Дата
  int dayOfWeek = rtc.getDoW();   // 0–6
  int day = rtc.getDate();
  int month = rtc.getMonth();
  int year = rtc.getYear();       // последние две цифры года

  // Очистка дисплея
  display.clearDisplay();

  // Вывод времени
  display.setTextSize(2);
  display.setCursor(8, 5);
  if (hour < 10) display.print("0");
  display.print(hour);
  display.print(":");
  if (minute < 10) display.print("0");
  display.print(minute);
  display.print(":");
  if (second < 10) display.print("0");
  display.print(second);

  // Вывод даты и дня недели
  display.setTextSize(1);
  display.setCursor(10, 30);
  display.print(weekdays[dayOfWeek]);
  display.print(" ");
  if (day < 10) display.print("0");
  display.print(day);
  display.print(".");
  if (month < 10) display.print("0");
  display.print(month);
  display.print(".");
  display.print(year);

  display.display();
  delay(1000);
}

Получает текущее время и дату с DS3231.
Отображает часы, минуты, секунды крупным шрифтом на LCD PCD8544.
Выводит день недели и дату в нижней строке.
Обновляет дисплей каждую секунду.
Кастомный шрифт и часы на Nokia 5110 с DS3231

Дополнительные возможности

Считывайте температуру: rtc.getTemperature();. Настройте SQW-выход на 1 Гц, 4 кГц, 8 кГц или 32 кГц. Программируйте будильники для включения устройств по расписанию.

Заключение

DS3231 + Nokia 5110 — отличная комбинация для точных часов, термометра или расписания. Замените glcdfont.c для русского текста, добавьте кастомные цифры — и получите стильный ретро-дисплей с высокой точностью времени.

FAQ

Как установить текущее время?

Используйте rtc.setDateTime(год, месяц, день, день_недели, час, мин, сек). Выполните один раз.

Почему время сбивается?

Разрядилась батарея CR2032 или плохой контакт. Замените на новую.

Работает ли от 3,3 В?

Да, модуль совместим с 3,3–5 В. На ESP8266/ESP32 подключайте напрямую.

Как вывести температуру?

float t = rtc.getTemperature(); — встроенный датчик микросхемы.

Как сделать мигающее двоеточие?

В loop() чередуйте display.print(":") и display.print(" "); с delay(500).

Поддерживает ли русский?

Да, замените glcdfont.c в Adafruit_GFX на русифицированный.

Точность хода?

±2 ppm — около 1 минуты в год при нормальной температуре.