Как подключить часы реального времени (RTC) к Arduino
Содержание
- 1 Подключение к Arduino модуля ZS-042 с часами реального времени DS3231
- 2 Подключение к Arduino модуля с часами реального времени DS1307
- 3 Подключение к Arduino модуля с часами реального времени DS1302
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
Назначение выводов модуля такое:
Название | Назначение |
---|---|
32K | Выход генератора 32 кГц. |
SQW | Выход прямоугольного сигнала; частота задаётся с помощью регистра управления 0x0E и может составлять 1, 1024, 4096 или 8192 Гц. |
SCL | Шина тактовых импульсов интерфейса I2C. |
SDA | Шина данных интерфейса I2C. |
VCC | Питание 3.3 или 5 вольт. |
GND | Земля. |
С противоположной стороны модуля выводы SCL, SDA, питание и земля дублируются. На выходе 32K постоянно присутствует сигнал с встроенного кварцевого генератора:
Сигнал на выходе 32K модуля ZS-042
Теперь нужно подключить модуль к Arduino. Мы уже знаем, что линия SDA нужно подключать к пину A4 Arduino UNO и Nano, а линию SCL к пину A5. Для питания возьмём выход 5V платы Arduino, землю модуля соединим с землёй Arduino.
Схема подключения модуля ZS-042 с таймером DS3231 к Arduino
Вот как это выглядит вживую:
Модуль ZS-042 с таймером DS3231 подключён к Arduino
Рассмотрим диаграммы записи и чтения для таймера реального времени DS3231:
Обзор передачи данных по последовательной шине I2C
Диаграмма записи и диаграмма чтения таймера реального времени DS3231
Как видно, тут всё стандартно для интерфейса I2C. Осталось только узнать, какие регистры за что отвечают, и мы будем готовы начать обмен данными с таймером DS3231. А вот и карта регистров:
Карта регистров таймера реального времени DS3231
Первым делом нужно выставить дату и время. А затем нужно будет только читать значение времени и календаря. Расширенные функции установка будильников и т.д. всё это делается аналогично, поэтому останавливаться на этом не будем. Итак, чтобы выставить дату и время, нас интересуют регистры 0x000x06. Для записи значений в них, нужно послать команду записи, указать начальный адрес (0x00), а дальше 7 байтов, сформированных для нужной даты и времени. Например, чтобы записать дату 02 января 2019 года, среда, и время 17 час 30 мин 02 сек, нужно отправить ведомому устройству с I2C адресом 0x68 массив: 00 02 30 17 03 02 01 19. Скетч, который реализует это, будет таким:
Вот как выглядит диаграмма записи этого массива в память таймера реального времени DS3231:
Диаграмма выставления времени на RTC DS3231
Таймер запомнит выставленную дату и время. Если подключена батарейка, то данные будут храниться в памяти устройства до сброса или до полного разряда батареи, ведь в этом и есть назначение устройств такого рода. Давайте теперь будем с периодом 1 секунда читать значение времени и выводить в монитор последовательного порта. Для этого напишем вот такой скетч:
Скетч для чтения времени с часов DS3231 (разворачивается)
Обратите внимание, что каждую итерацию цикла loop() мы записываем адрес регистра 0x00. Если этого не делать, то мы будем каждый раз сдвигаться по карте регистров на 7 позиций, и возвращаемые данные будут совсем не те, что мы ожидаем.
Вот как выглядит в мониторе последовательного порта результат работы данного скетча:
Вывод даты и времени в монитор последовательного порта
А вот так выглядит временная диаграмма, порождаемая работой этого скетча:
Временная диаграмма чтения регистров времени DS3231
Напоследок давайте немного усложним нашу программу и будем читать также значение температуры:
Скетч для чтения времени и температуры с часов DS3231 (разворачивается)
Вот как теперь выглядит вывод нашей программы:
Вывод даты, времени и температуры в монитор последовательного порта
Само собой, в интернете полно библиотек для Arduino, которые упрощают работу с часами реального времени DS3231 и модулем ZS-042 в частности. Они делают всю рутинную работу, и вам не нужно будет разбираться с картой регистров и проводить манипуляции с перестановкой полученных байтов, чтобы получить удобочитаемое значение времени. В конце статьи дана ссылка на скачивание архива, в котором лежат несколько библиотек для работы с часами реального времени DS3231 и DS1307.
2 Подключение к Arduino модуля с часами реального времени DS1307
Таймер DS1307 в отличие от DS3231 проще по функциональности: он имеет меньше регистров, не имеет встроенного датчика температуры и встроенного генератора тактовой частоты. Не имеет он также и функции будильника. Шина I2C функционирует только на частоте 100 кГц. Модуль с часами реального времени DS1307 может выглядеть вот так:
Внешний вид модуля с часами реального времени DS1307
Здесь номером 1 обозначена микросхема собственно таймера DS1307, номер 2 микросхема памяти AT24C32 объёмом 32 кбит, 3 кварцевый резонатор с частотой 32,768 кГц, 4 держатель для батареи типа 2032. Схема датчика приведена на рисунке:
Схема часов реального времени на датчике DS1307. Изображение с сайта easyelectronics.ru
На модуле имеются две группы контактов: P1 и P2. Группа P2 имеет стандартные выводы для шины I2C, плюс дополнительный вывод DS, к которому можно подключить внешний датчик температуры DS18B20. Группа P1 имеет большее число контактов:
Название | Назначение |
---|---|
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
Если присмотреться, увидим, что регистры 0x000x06 в точности совпадают с аналогичными регистрами рассмотренного таймера DS3231, а регистр 0x07 отвечает за частоту генерируемого прямоугольного сигнала. Кроме того, I2C адрес DS1307 также аналогичен адресу модуля DS3231. Поэтому логично предположить, что скетч установки времени подойдёт и здесь. В этом легко убедиться, если загрузить скетч в Arduino с подключённым модулем DS1307. Не забудьте только обновить установочный массив в соответствии с временем, которое будете выставлять на часах. Пример разобран в предыдущем разделе.
Скетч вывода времени также будет работать с этим модулем. После установки времени загрузим скетч и проверим это. Всё работает!
Модуль с таймером DS1307 подключён к Arduino
3 Подключение к Arduino модуля с часами реального времени DS1302
Модуль DS1302 может выглядеть, например, так:
Модуль часов реального времени DS1302
На нижней стороне модуля никаких компонентов нет. Как видно, вся обвязка микросхемы DS1302 это кварцевый резонатор.
Нижняя сторона модуля часов реального времени DS1302
Назначение выводов микросхемы DS1302 такое (слева в DIP-корпусе, справа в планарном):
Выводы микросхемы 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 это, конечно же, воспользоваться одной из множества готовых библиотек для Arduino, например, этой (она приложена также архивом внизу статьи). Она позволяет выставлять время и считывать его, а также записывать и читать данные из ПЗУ часов.
Подключение DS1302 к Arduino
Думаю, что объяснять, как использовать библиотеку для Arduino, не нужно. В библиотеке есть два примера, в которых подробно расписано, как использовать часы DS1302. Поэтому давайте попробуем разобраться, как работать с часами DS1302 без сторонних библиотек.
Для обмена с микросхемой DS1302 используется последовательный интерфейс, похожий на SPI. Диаграмма передачи данных показана ниже. Видно, что во время чтения или записи данных сначала следует выставить логическую "1" на линии CE. Затем сгенерировать 16 тактовых синхронизирующих импульсов. В это время передаются 16 бит информации.
Диаграмма чтения и записи данных DS1302
В первых 8-ми битах передаётся команда (командный байт), а следующие 8 бит данные. Структура командного байта показана ниже. В нём старший бит всегда "1", младший признак операции (чтение RD=1 или запись WR=0), а остальные биты это адрес регистра, с которым взаимодействуем.
Структура командного байта DS1302
Кроме того, DS1302 поддерживает множественную передачу (burst mode). Для этого следует удерживать высокий уровень на линии CE и генерировать необходимое число тактовых импульсов. Данные будут читаться (или записываться) из регистров или ПЗУ последовательно, начиная с заданного адреса и далее. Карта регистров и адресное пространство ПЗУ микросхемы DS1302 показаны на рисунке.
Карта регистров часов реального времени DS1302
Предлагаю для изучения DS1302 воспользоваться отладочной платой с микросхемой FT2232H и программы SPI via FTDI. Это позволит избежать постоянного программирования Arduino и проводить все эксперименты с часами на лету.
Схема подключения FT2232H к DS1302 через логик шифтер
К высоковольтной стороне преобразователя подключается модуль DS1302, к низковольтной микросхема FT2232H. Соответствие выводов такое: CLK ADBUS0, DAT ADBUS1 и ADBUS2, RST ADBUS3. Подключаем соответственно через преобразователь напряжения. Вот так это выглядит вживую:
Управление часами DS1302 с помощью FT2232H
Когда собрали схему, запустим программу SPI via FTDI и в меню Устройство выберем интерфейс SPI, потом нажмём Подключить. Теперь в левой части главного окна, в рамке Настройки SPI снимем галочки с CS active LOW (активация часов DS1302 высоким уровнем, вывод CE) и MSB first (передача байта старшим битом вперёд). Остальные параметры оставим как есть.
Теперь попробуем прочитать 1 байт из регистра секунд 0x81. Он должен меняться каждую секунду, и мы сразу увидим, что наша схема работает. Для чтения регистра секунд настройки программы будут такие (обратите внимание на раздел Чтение):
Чтение 1 байта из регистра секунд 0x81 часов DS1302
Чтобы увидеть принятые данные, нужно нажать на кнопку с изображением таблицы слева от кнопки Прочитать.
Чтобы прочитать данные всех регистров, нужно отправить команду BF и запросить столько регистров, сколько нужно. Все данные о дате хранятся в 7-ми регистрах, а восьмой данные о запрете записи (WP , write protect).
Чтение всех регистров часов DS1302 в режиме множественной передачи (burst mode)
Кстати, если вместо числа "1" ввести число раз "0" (справа от кнопки чтения), то программа будет постоянно опрашивать часы DS1302, и вы увидите в таблице принятых данных как идёт время часов DS1302.
Для записи данных в ПЗУ часов DS1302 в режиме множественной передачи (не по одному байту) следует отправить команду FE и дальше нужные данные. Для чтения данных из ПЗУ в режиме множественной передачи нужно отправить команду FF:
Чтение ПЗУ часов DS1302 в режиме множественной передачи (burst mode)
Теперь мы можем устанавливать время на часах DS1302, читать его, а также работать с постоянной энергонезависимой памятью часов. Приведённых примеров должно быть достаточно, чтобы реализовать всё это на Arduino без использования сторонних библиотек.
Библиотеки для работы с часами реального времени DS1307 и DS3231
В приложенном архиве лежат две разные библиотеки для Arduino (используйте ту, которая будет вам наиболее удобна), а также технические описания (datasheet) на микросхемы DS1307 и DS3231.
Установка библиотек проводится стандартным способом: помещением директории с библиотекой в директорию libraries среды Arduino IDE или через меню Sketch Include Library. Проще всего начать знакомство с библиотекой с изучения примеров, которые появятся в меню File Examples после установки библиотеки. Там имеются примеры и установки времени, и чтения показаний часов.
Источник: