Часы реального времени DS3231: подключение к Arduino

Модуль DS3231 ведёт точный отсчёт времени и хранит его при отключённом питании. Характеристики, выводы, установка времени и часы на дисплее TM1637.
Чем DS3231 лучше предшественника
Модуль часов реального времени (RTC) нужен устройству, которое должно знать текущее время. Он ведёт отсчёт самостоятельно и не сбивается при отключении основного питания, если установлен резервный источник — батарейка CR2032 или аккумулятор LIR2032 на 3,6 В. Резерва хватает на несколько лет.
Раньше в проектах на Arduino обычно использовали модуль на DS1307 с внешним кварцем на 32 кГц. Частота кварца менялась вместе с температурой, и часы постепенно уходили. В микросхеме DS3231 кварцевый генератор встроен внутрь вместе с датчиком температуры, который компенсирует её влияние. По данным источника, погрешность составляет ±2 минуты в год.

Характеристики
| Календарь | до 2100 года |
| Погрешность | ±4 ppm |
| Будильники | 2 |
| Выход стабильной частоты | 1–32768 Гц |
| Напряжение питания | 2,7–5,3 В |
| Напряжение батарейки | 2,3–5,3 В |
| Ток потребления | 250 мкА |
| Ток от батарейки | 3 мкА |
| Порог переключения на батарейку | 2,6 В |
| Интерфейс | I2C |
| Размеры | 40 x 22 мм |
Выводы и подключение
- GND — общий;
- VCC — питание 2,7–5,3 В;
- SDA — линия данных I2C;
- SCL — линия синхронизации I2C;
- SQW — прерывание от будильников или выход импульсов 1–8192 Гц;
- 32K — выход импульсов 32768 Гц.
С Arduino модуль общается по шине I2C, поэтому для работы достаточно питания и двух линий — SDA и SCL.

Чтение времени
В примерах используются библиотеки DS1307RTC и Time вместе со стандартной Wire. Первый скетч раз в секунду вызывает RTC.read() и заполняет структуру типа tmElements_t, после чего выводит в последовательный порт (9600 бод) часы, минуты, секунды и дату; числа меньше десяти дополняются ведущим нулём. Если прочитать данные не удалось, выводится «error» и делается пауза 5 секунд.

На новом модуле отсчёт идёт правильно, но сами значения неверны: при отсутствии питания время в микросхеме сбрасывается на 00:00:00 01/01/2000.
Установка времени
Второй скетч дополнен приёмом строки из последовательного порта. Ожидается формат «dd/mm/YYYY hh:mm:ss» с переводом строки в конце. Символы накапливаются в обработчике serialEvent(), затем из фиксированных позиций строки извлекаются день, месяц, год, часы, минуты и секунды, и результат записывается в микросхему вызовом RTC.write(datetime).

После этого DS3231 ведёт точное время, а при установленной батарейке сохраняет его и без внешнего питания.
Пример: часы на дисплее TM1637
Для настольных часов понадобятся Arduino Uno, макетная плата, модуль DS3231, четырёхразрядный семисегментный дисплей на драйвере TM1637 и провода. В Arduino IDE устанавливают библиотеку TM1637; в скетче линия CLK дисплея назначена на вывод 3, DIO — на вывод 2.
Программа считывает время из RTC и раскладывает его по разрядам в два массива: часы с минутами и день с месяцем. Каждые 5 секунд изображение меняется — то текущее время, то дата. Пока показывается время, двоеточие между вторым и третьим разрядом мигает с периодом 0,5 секунды; при выводе даты разделитель погашен.
Возможные проблемы
- Данные с модуля не читаются — проверить подключение к плате Arduino.
- Время и дата неверные — установить их скетчем с приёмом строки из последовательного порта.
- Время сбивается после отключения питания — установить резервный элемент (CR2032 или LIR2032) и проверить его напряжение: оно должно быть не ниже 2,3 В.