Как подключить часы реального времени (RTC) к Arduino

Содержание

1 Подключение к Arduino модуля ZS-042 с часами реального времени DS3231

Модуль ZS-042 с часами реального времени (RTC ) имеет следующие характеристики:

  • Календарь до 2100 года с отсчётами секунд, минут, часов, числа месяца, месяца, дня недели и года (с учётом високосных годов);
  • 12- или 24-часовой формат;
  • 2 будильника;
  • напряжение питания: 3,3 или 5 В;
  • точность: ± 0.432 сек в день;
  • внутренний кварцевый генератор с частотой 32768 Гц;
  • поддерживаемый протокол: I2C со скоростью от 100 до 400 кГц;
  • габариты: 38×22×15 мм;
  • диапазон рабочих температур −40+85C.

На модуле присутствуют: микросхема таймера реального времени DS3231 (1 на рисунке), микросхема памяти AT24C32 объёмом 32 кбит (2 на рисунке), места для трёх перемычек A0, A1 и A2 (3 на рисунке), с помощью которых можно менять адресацию памяти микросхемы памяти; место для батареи питания размером 2032 (4 на рисунке).

Внешний вид модуля ZS-042 Внешний вид модуля ZS-042

Назначение выводов модуля такое:

Назначение выводов модуля c RTC DS3231

Название Назначение
32K Выход генератора 32 кГц.
SQW Выход прямоугольного сигнала; частота задаётся с помощью регистра управления 0x0E и может составлять 1, 1024, 4096 или 8192 Гц.
SCL Шина тактовых импульсов интерфейса I2C.
SDA Шина данных интерфейса I2C.
VCC Питание 3.3 или 5 вольт.
GND Земля.

С противоположной стороны модуля выводы SCL, SDA, питание и земля дублируются. На выходе 32K постоянно присутствует сигнал с встроенного кварцевого генератора:

Сигнал на выходе 32K модуля ZS-042 Сигнал на выходе 32K модуля ZS-042

Теперь нужно подключить модуль к Arduino. Мы уже знаем, что линия SDA нужно подключать к пину A4 Arduino UNO и Nano, а линию SCL к пину A5. Для питания возьмём выход 5V платы Arduino, землю модуля соединим с землёй Arduino.

Схема подключения модуля ZS-042 с таймером DS3231 к Arduino Схема подключения модуля ZS-042 с таймером DS3231 к Arduino

Вот как это выглядит вживую:

Модуль ZS-042 с таймером DS3231 подключён к Arduino Модуль ZS-042 с таймером DS3231 подключён к Arduino

Рассмотрим диаграммы записи и чтения для таймера реального времени DS3231:

Обзор передачи данных по последовательной шине I2C Обзор передачи данных по последовательной шине I2C Диаграмма записи и диаграмма чтения таймера реального времени DS3231 Диаграмма записи и диаграмма чтения таймера реального времени DS3231

Как видно, тут всё стандартно для интерфейса I2C. Осталось только узнать, какие регистры за что отвечают, и мы будем готовы начать обмен данными с таймером DS3231. А вот и карта регистров:

Карта регистров таймера реального времени DS3231 Карта регистров таймера реального времени DS3231

Первым делом нужно выставить дату и время. А затем нужно будет только читать значение времени и календаря. Расширенные функции установка будильников и т.д. всё это делается аналогично, поэтому останавливаться на этом не будем. Итак, чтобы выставить дату и время, нас интересуют регистры 0x000x06. Для записи значений в них, нужно послать команду записи, указать начальный адрес (0x00), а дальше 7 байтов, сформированных для нужной даты и времени. Например, чтобы записать дату 02 января 2019 года, среда, и время 17 час 30 мин 02 сек, нужно отправить ведомому устройству с I2C адресом 0x68 массив: 00 02 30 17 03 02 01 19. Скетч, который реализует это, будет таким:

Вот как выглядит диаграмма записи этого массива в память таймера реального времени DS3231:

Диаграмма выставления времени на RTC DS3231 Диаграмма выставления времени на RTC DS3231

Таймер запомнит выставленную дату и время. Если подключена батарейка, то данные будут храниться в памяти устройства до сброса или до полного разряда батареи, ведь в этом и есть назначение устройств такого рода. Давайте теперь будем с периодом 1 секунда читать значение времени и выводить в монитор последовательного порта. Для этого напишем вот такой скетч:

Скетч для чтения времени с часов DS3231 (разворачивается)

Обратите внимание, что каждую итерацию цикла loop() мы записываем адрес регистра 0x00. Если этого не делать, то мы будем каждый раз сдвигаться по карте регистров на 7 позиций, и возвращаемые данные будут совсем не те, что мы ожидаем.

Вот как выглядит в мониторе последовательного порта результат работы данного скетча:

Вывод даты и времени в монитор последовательного порта Вывод даты и времени в монитор последовательного порта

А вот так выглядит временная диаграмма, порождаемая работой этого скетча:

Временная диаграмма чтения регистров времени DS3231 Временная диаграмма чтения регистров времени DS3231

Напоследок давайте немного усложним нашу программу и будем читать также значение температуры:

Скетч для чтения времени и температуры с часов DS3231 (разворачивается)

Вот как теперь выглядит вывод нашей программы:

Вывод даты, времени и температуры в монитор последовательного порта Вывод даты, времени и температуры в монитор последовательного порта

Само собой, в интернете полно библиотек для Arduino, которые упрощают работу с часами реального времени DS3231 и модулем ZS-042 в частности. Они делают всю рутинную работу, и вам не нужно будет разбираться с картой регистров и проводить манипуляции с перестановкой полученных байтов, чтобы получить удобочитаемое значение времени. В конце статьи дана ссылка на скачивание архива, в котором лежат несколько библиотек для работы с часами реального времени DS3231 и DS1307.

2 Подключение к Arduino модуля с часами реального времени DS1307

Таймер DS1307 в отличие от DS3231 проще по функциональности: он имеет меньше регистров, не имеет встроенного датчика температуры и встроенного генератора тактовой частоты. Не имеет он также и функции будильника. Шина I2C функционирует только на частоте 100 кГц. Модуль с часами реального времени DS1307 может выглядеть вот так:

Внешний вид модуля с часами реального времени DS1307 Внешний вид модуля с часами реального времени DS1307

Здесь номером 1 обозначена микросхема собственно таймера DS1307, номер 2 микросхема памяти AT24C32 объёмом 32 кбит, 3 кварцевый резонатор с частотой 32,768 кГц, 4 держатель для батареи типа 2032. Схема датчика приведена на рисунке:

Схема часов реального времени на датчике DS1307 Схема часов реального времени на датчике DS1307. Изображение с сайта easyelectronics.ru

На модуле имеются две группы контактов: P1 и P2. Группа P2 имеет стандартные выводы для шины I2C, плюс дополнительный вывод DS, к которому можно подключить внешний датчик температуры DS18B20. Группа P1 имеет большее число контактов:

Назначение выводов DS1307

Название Назначение
SQ Выход прямоугольного сигнала 30 кГц.
DS Подключение внешнего датчика температуры DS18B20.
SCL Шина тактирования интерфейса I2C.
SDA Шина данных интерфейса I2C.
VCC Питание модуля 3.3 или 5 вольт.
GND Земля.
BAT Вход питания от внешней батареи с напряжением в диапазоне 2,03,5 В.

Подключение этого модуля к Arduino осуществляется абсолютно так же, как и рассмотренного ранее: VCC модуля 5V Arduino, GND GND, SDA A4, SCL A5.

Теперь пришла пора познакомиться с устройством регистров часов DS1307. Карта регистров приведена на рисунке:

Карта регистров часов реального времени DS1307 Карта регистров часов реального времени DS1307

Если присмотреться, увидим, что регистры 0x000x06 в точности совпадают с аналогичными регистрами рассмотренного таймера DS3231, а регистр 0x07 отвечает за частоту генерируемого прямоугольного сигнала. Кроме того, I2C адрес DS1307 также аналогичен адресу модуля DS3231. Поэтому логично предположить, что скетч установки времени подойдёт и здесь. В этом легко убедиться, если загрузить скетч в Arduino с подключённым модулем DS1307. Не забудьте только обновить установочный массив в соответствии с временем, которое будете выставлять на часах. Пример разобран в предыдущем разделе.

Скетч вывода времени также будет работать с этим модулем. После установки времени загрузим скетч и проверим это. Всё работает!

Модуль с таймером DS1307 подключён к Arduino Модуль с таймером DS1307 подключён к Arduino

3 Подключение к Arduino модуля с часами реального времени DS1302

Модуль DS1302 может выглядеть, например, так:

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

На нижней стороне модуля никаких компонентов нет. Как видно, вся обвязка микросхемы DS1302 это кварцевый резонатор.

Нижняя сторона модуля часов реального времени DS1302 Нижняя сторона модуля часов реального времени DS1302

Назначение выводов микросхемы DS1302 такое (слева в DIP-корпусе, справа в планарном):

Выводы микросхемы DS1302 Выводы микросхемы DS1302

Назначение выводов RTC DS1302

Название вывода DS1302 Назначение
X1, X2 Входы для подачи частоты 32,768 кГц с кварцевого резонатора.
SCLK Вход тактовой частоты последовательных данных.
I/O Вход/выход последовательных данных.
CE Вход выбора чипа. Активируется высоким уровнем.
VCC1 Дополнительное резервное питание (например, от батареи) для сохранения настроек времени в ПЗУ, 3 В.
VCC2 Первичное питание микросхемы, 5 В.
GND Земля

Соответствие выводов микросхемы DS1302 выводам модуля, думаю, очевидно: VCC это первичное питание 5 В, GND земля. CLK вход тактовых импульсов. DAT ввод/вывод последовательных данных. RST это CE, который включает логику и показывает микросхеме RTC, что происходит обмен данными (чтение или запись).

Типичная схема подключения RTC микросхемы DS1302:

Типичная схема подключения микросхемы DS1302 Типичная схема подключения микросхемы DS1302

Самый простой способ управлять DS1302 это, конечно же, воспользоваться одной из множества готовых библиотек для Arduino, например, этой (она приложена также архивом внизу статьи). Она позволяет выставлять время и считывать его, а также записывать и читать данные из ПЗУ часов.

Подключение DS1302 к Arduino Подключение DS1302 к Arduino

Думаю, что объяснять, как использовать библиотеку для Arduino, не нужно. В библиотеке есть два примера, в которых подробно расписано, как использовать часы DS1302. Поэтому давайте попробуем разобраться, как работать с часами DS1302 без сторонних библиотек.

Для обмена с микросхемой DS1302 используется последовательный интерфейс, похожий на SPI. Диаграмма передачи данных показана ниже. Видно, что во время чтения или записи данных сначала следует выставить логическую "1" на линии CE. Затем сгенерировать 16 тактовых синхронизирующих импульсов. В это время передаются 16 бит информации.

Диаграмма чтения и записи данных DS1302 Диаграмма чтения и записи данных DS1302

В первых 8-ми битах передаётся команда (командный байт), а следующие 8 бит данные. Структура командного байта показана ниже. В нём старший бит всегда "1", младший признак операции (чтение RD=1 или запись WR=0), а остальные биты это адрес регистра, с которым взаимодействуем.

Структура командного байта DS1302 Структура командного байта DS1302

Кроме того, DS1302 поддерживает множественную передачу (burst mode). Для этого следует удерживать высокий уровень на линии CE и генерировать необходимое число тактовых импульсов. Данные будут читаться (или записываться) из регистров или ПЗУ последовательно, начиная с заданного адреса и далее. Карта регистров и адресное пространство ПЗУ микросхемы DS1302 показаны на рисунке.

Карта регистров часов реального времени DS1302 Карта регистров часов реального времени DS1302

Предлагаю для изучения DS1302 воспользоваться отладочной платой с микросхемой FT2232H и программы SPI via FTDI. Это позволит избежать постоянного программирования Arduino и проводить все эксперименты с часами на лету.

Схема подключения FT2232H к DS1302 через логик шифтер Схема подключения FT2232H к DS1302 через логик шифтер

К высоковольтной стороне преобразователя подключается модуль DS1302, к низковольтной микросхема FT2232H. Соответствие выводов такое: CLK ADBUS0, DAT ADBUS1 и ADBUS2, RST ADBUS3. Подключаем соответственно через преобразователь напряжения. Вот так это выглядит вживую:

Управление часами DS1302 с помощью FT2232H Управление часами DS1302 с помощью FT2232H

Когда собрали схему, запустим программу SPI via FTDI и в меню Устройство выберем интерфейс SPI, потом нажмём Подключить. Теперь в левой части главного окна, в рамке Настройки SPI снимем галочки с CS active LOW (активация часов DS1302 высоким уровнем, вывод CE) и MSB first (передача байта старшим битом вперёд). Остальные параметры оставим как есть.

Теперь попробуем прочитать 1 байт из регистра секунд 0x81. Он должен меняться каждую секунду, и мы сразу увидим, что наша схема работает. Для чтения регистра секунд настройки программы будут такие (обратите внимание на раздел Чтение):

Чтение 1 байта из регистра секунд 0x81 часов DS1302 Чтение 1 байта из регистра секунд 0x81 часов DS1302

Чтобы увидеть принятые данные, нужно нажать на кнопку с изображением таблицы слева от кнопки Прочитать.

Чтобы прочитать данные всех регистров, нужно отправить команду BF и запросить столько регистров, сколько нужно. Все данные о дате хранятся в 7-ми регистрах, а восьмой данные о запрете записи (WP , write protect).

Чтение всех регистров часов DS1302 в режиме множественной передачи Чтение всех регистров часов DS1302 в режиме множественной передачи (burst mode)

Кстати, если вместо числа "1" ввести число раз "0" (справа от кнопки чтения), то программа будет постоянно опрашивать часы DS1302, и вы увидите в таблице принятых данных как идёт время часов DS1302.

Для записи данных в ПЗУ часов DS1302 в режиме множественной передачи (не по одному байту) следует отправить команду FE и дальше нужные данные. Для чтения данных из ПЗУ в режиме множественной передачи нужно отправить команду FF:

Чтение ПЗУ часов DS1302 в режиме множественной передачи Чтение ПЗУ часов DS1302 в режиме множественной передачи (burst mode)

Теперь мы можем устанавливать время на часах DS1302, читать его, а также работать с постоянной энергонезависимой памятью часов. Приведённых примеров должно быть достаточно, чтобы реализовать всё это на Arduino без использования сторонних библиотек.

Библиотеки для работы с часами реального времени DS1307 и DS3231

В приложенном архиве лежат две разные библиотеки для Arduino (используйте ту, которая будет вам наиболее удобна), а также технические описания (datasheet) на микросхемы DS1307 и DS3231.

Установка библиотек проводится стандартным способом: помещением директории с библиотекой в директорию libraries среды Arduino IDE или через меню Sketch Include Library. Проще всего начать знакомство с библиотекой с изучения примеров, которые появятся в меню File Examples после установки библиотеки. Там имеются примеры и установки времени, и чтения показаний часов.


Источник: soltau.ru