Главная → Питание

Модуль часов реального времени DS3231: обзор и подключение

6 сентября 2026 · Питание

Зачем плате 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, если часы останавливались. При каждом рестарте время заново не переписывается: иначе часы «откатывались» бы к моменту компиляции скетча.

Частые ошибки

  1. Обычная CR2032 вместо LIR2032. На плате распаяна цепочка заряда (диод и резистор), рассчитанная на аккумулятор LIR2032. Если вставить одноразовую CR2032 и запитать модуль от 5 В, она начнёт «заряжаться», чего литий без защиты не переносит — может вздуться. Ставьте LIR2032 или выпаивайте диод заряда.
  2. Время сбрасывается при отключении питания. Проверьте батарейку: без неё или с севшей часы на резерве не живут. Признак — rtc.lostPower() возвращает true при каждом старте.
  3. Модуль не найден на шине. Чаще всего перепутаны SDA и SCL. Прогоните сканер I2C: DS3231 должен отвечать на 0x68, EEPROM — на 0x57.
  4. Будильник срабатывает один раз. Флаг события (A1F/A2F) в регистре статуса сам не очищается — прерывание «висит». В RTClib после обработки вызывайте rtc.clearAlarm().
  5. ESP32 и 5-вольтовое питание модуля. Чип переживёт и 5 В, но подтяжка шины при этом тянет SDA/SCL к 5 В, а входы ESP32 на это не рассчитаны.

Куда поставить дальше

DS3231 раскрывается в паре с исполнительной частью: связка с реле-модулем даёт полив или освещение по расписанию, а вместе с ультразвуковым дальномером HC-SR04 — логгер с точной меткой времени у каждой записи. Ещё два будильника чипа умеют будить ESP32 из глубокого сна по расписанию — полезно для автономных датчиков на батарейке.

Информация собрана из открытых источников и паспортов производителей и не является истиной в последней инстанции. Характеристики, распиновку и совместимость проверяйте по документации конкретной партии модуля перед покупкой и подключением.

Читайте дальше

Датчики

Датчик движения HC-SR501: обзор и подключение

Что это за датчик HC-SR501 — самый ходовой PIR-датчик движения: зелёная плата с белым куполом-линзой Френеля стоит копейки и закрывает девять задач…

Читать обзор →
Питание

INA219: измеряем ток и напряжение в своём проекте — обзор и подключение

Зачем ставить датчик тока Пока проект живёт на макетке, ток обычно оценивают на глаз: «серве надо до 700 мА, значит блок на…

Читать обзор →
Датчики

Тензодатчик и HX711: делаем электронные весы

Почему датчику не обойтись без усилителя Электронные весы — это пара: тензодатчик, превращающий деформацию металла в изменение сопротивления, и АЦП-усилитель, потому что…

Читать обзор →