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

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

Модуль DS3231 ведёт точный отсчёт времени и хранит его при отключённом питании. Характеристики, выводы, установка времени и часы на дисплее TM1637.

Чем DS3231 лучше предшественника

Модуль часов реального времени (RTC) нужен устройству, которое должно знать текущее время. Он ведёт отсчёт самостоятельно и не сбивается при отключении основного питания, если установлен резервный источник — батарейка CR2032 или аккумулятор LIR2032 на 3,6 В. Резерва хватает на несколько лет.

Раньше в проектах на Arduino обычно использовали модуль на DS1307 с внешним кварцем на 32 кГц. Частота кварца менялась вместе с температурой, и часы постепенно уходили. В микросхеме DS3231 кварцевый генератор встроен внутрь вместе с датчиком температуры, который компенсирует её влияние. По данным источника, погрешность составляет ±2 минуты в год.

Модуль часов реального времени DS3231

Характеристики

Календарьдо 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.

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

Чтение времени

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

Вывод времени с DS3231 в мониторе порта

На новом модуле отсчёт идёт правильно, но сами значения неверны: при отсутствии питания время в микросхеме сбрасывается на 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 В.

← Все статьи