Модуль часов реального времени DS3231: обзор и подключение
Зачем плате Arduino часы
У Arduino и ESP32 есть таймеры, но нет часов: millis() честно считает миллисекунды с момента включения, а какой сегодня день и сколько сейчас времени — не знает. Обесточили плату — счёт пошёл заново. Любой проект с расписанием (полив, управление обогревателем, логгер данных, ночное понижение температуры) требует настоящего RTC. DS3231 — самый удачный из недорогих модулей: кварц и подстройка частоты уже внутри чипа, батарейка держит время годами, а точность позволяет не подводить часы месяцами.
Что внутри модуля
Сердце платы — микросхема DS3231 производства Maxim Integrated (теперь Analog Devices). Это не просто счётчик секунд: внутри стоит температурно-компенсированный кварцевый генератор (TCXO). Каждые 64 секунды чип измеряет свою температуру встроенным датчиком и вносит поправку в частоту кварца. Обычный кварц гуляет на ±20…100 ppm, DS3231 укладывается в ±2 ppm при 0…+40 °C — это примерно минута ошибки за год.
На типовой плате (маркировка ZS-042) есть держатель батарейки, EEPROM AT24C32 на 32 Кбит для своих данных и подтягивающие резисторы шины I2C. Модуль занимает на шине адрес 0x68, EEPROM — 0x57: на одной паре проводов SDA/SCL уживаются оба.
Характеристики
Числа взяты из даташита Maxim Integrated DS3231:
| Параметр | Значение |
|---|---|
| Напряжение питания VCC | 2,3–5,5 В (тип. 3,3 В) |
| Напряжение резервной батареи VBAT | 2,3–5,5 В (тип. 3,0 В) |
| Точность хода | ±2 ppm при 0…+40 °C; ±3,5 ppm при −40…+85 °C |
| Ток в активном режиме | не более 200 мкА при 3,63 В; 300 мкА при 5,5 В |
| Ток от батареи (ход часов) | тип. 0,84 мкА, макс. 3 мкА при 3,63 В |
| Интерфейс | I2C до 400 кГц, адрес 0x68 |
| Выходы тактовых импульсов | SQW: 1 Гц / 1,024 / 4,096 / 8,192 кГц; отдельный вывод 32,768 кГц |
| Будильники | 2 независимых |
| Календарь | до 2100 года, автопоправка на високосный год и короткие месяцы |
| Встроенный термодатчик | точность ±3 °C, разрешение 0,25 °C |
| Рабочая температура | 0…+70 °C (DS3231S) / −40…+85 °C (DS3231SN) |
Подключение к Arduino UNO и ESP32
Модуль четырёхпроводной: питание, земля и два провода шины I2C. Подтяжка уже на плате, дополнительные резисторы не нужны.
| Вывод модуля | Arduino UNO | ESP32 |
|---|---|---|
| GND | GND | GND |
| VCC | 5 В | 3,3 В |
| SDA | A4 | GPIO21 |
| SCL | A5 | GPIO22 |
| SQW, 32K | не подключаются | |
У Arduino UNO шина I2C выведена на A4 (SDA) и A5 (SCL). У ESP32 это GPIO21 и GPIO22. Питайте модуль от ESP32 от 3,3 В: подтяжка шины тогда не потянет SDA/SCL выше логики контроллера. От 5 В (UNO) чип работает штатно — даташит допускает питание 2,3–5,5 В.
Код: установка и чтение времени
Поставьте библиотеку RTClib от Adafruit через менеджер библиотек. Скетч раз в секунду печатает дату, время и температуру с модуля:
#include <Wire.h>
#include <RTClib.h>
RTC_DS3231 rtc; // адрес на шине I2C — 0x68
void setup() {
Serial.begin(9600);
if (!rtc.begin()) { // модуль не отвечает на шине
Serial.println("DS3231 не найден: проверь SDA/SCL и питание");
while (true) delay(100);
}
if (rtc.lostPower()) { // батарейка села или вставлена впервые
rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); // время сборки скетча
}
}
void loop() {
DateTime now = rtc.now(); // дата и время одним вызовом
char buf[25];
snprintf(buf, sizeof(buf), "%02u.%02u.%04u %02u:%02u:%02u",
now.day(), now.month(), now.year(),
now.hour(), now.minute(), now.second());
Serial.println(buf);
Serial.print("Температура на плате: ");
Serial.print(rtc.getTemperature()); // встроенный термодатчик, ±3 °C
Serial.println(" C");
delay(1000);
}
Строка с rtc.adjust() выполняется только после потери питания — rtc.lostPower() вернёт true, если часы останавливались. При каждом рестарте время заново не переписывается: иначе часы «откатывались» бы к моменту компиляции скетча.
Частые ошибки
- Обычная CR2032 вместо LIR2032. На плате распаяна цепочка заряда (диод и резистор), рассчитанная на аккумулятор LIR2032. Если вставить одноразовую CR2032 и запитать модуль от 5 В, она начнёт «заряжаться», чего литий без защиты не переносит — может вздуться. Ставьте LIR2032 или выпаивайте диод заряда.
- Время сбрасывается при отключении питания. Проверьте батарейку: без неё или с севшей часы на резерве не живут. Признак — rtc.lostPower() возвращает true при каждом старте.
- Модуль не найден на шине. Чаще всего перепутаны SDA и SCL. Прогоните сканер I2C: DS3231 должен отвечать на 0x68, EEPROM — на 0x57.
- Будильник срабатывает один раз. Флаг события (A1F/A2F) в регистре статуса сам не очищается — прерывание «висит». В RTClib после обработки вызывайте rtc.clearAlarm().
- ESP32 и 5-вольтовое питание модуля. Чип переживёт и 5 В, но подтяжка шины при этом тянет SDA/SCL к 5 В, а входы ESP32 на это не рассчитаны.
Куда поставить дальше
DS3231 раскрывается в паре с исполнительной частью: связка с реле-модулем даёт полив или освещение по расписанию, а вместе с ультразвуковым дальномером HC-SR04 — логгер с точной меткой времени у каждой записи. Ещё два будильника чипа умеют будить ESP32 из глубокого сна по расписанию — полезно для автономных датчиков на батарейке.
Информация собрана из открытых источников и паспортов производителей и не является истиной в последней инстанции. Характеристики, распиновку и совместимость проверяйте по документации конкретной партии модуля перед покупкой и подключением.