Как подключить часы реального времени к ардуино
Перейти к содержимому

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

Обзор часов реального времени DS3231 (RTC)

Модуль DS3231 (RTC, ZS-042) — представляет собой недорогую плату с чрезвычайно точными часами реального времени (RTC), с температурной компенсацией кварцевого генератора и кристалла. Модуль включает в себя литиевую батарею, которая поддерживает бесперебойную работу, даже при отключении источник питания. Интегрированный генератор улучшить точность устройства и позволил уменьшить количество компонентов.

Обзор часов реального времени DS3231 (RTC)

Технические параметры

► Напряжение питания: 3.3В и 5В
► Чип памяти: AT24C32 (32 Кб)
► Точность: ± 0.432 сек в день
► Частота кварца:32.768 кГц
► Поддерживаемый протокол: I2C
► Габариты: 38мм x 22мм x 15мм

Общие сведения

Большинство микросхем, таких как DS1307 используют внешний кварцевый генератор частотой 32кГц, но в них есть существенный недостаток, при изменении температуры меняется частота кварца, что приводит к погрешности в подсчете времени. Эта проблема устранена в чипе DS3231, внутрь которого установили кварцевый генератор и датчик температуры, который компенсирует изменения температуры, так что время остается точным (при необходимости, данные температуры можно считать). Так же чип DS3231 поддерживает секунды, минуты, часы, день недели, дата, месяц и год информацию, а так же следит за количеством дней в месяце и делает поправку на високосный год. Поддерживает работу часов в двух форматов 24 и 12, а так-же возможно запрограммировать два будильника. Модуль работает по двух проводной шине I2C.

Обзор часов реального времени DS3231 (RTC)

Теперь немного о самом модуле, построен он на микросхеме DS3231N. Резисторная сборка RP1 (4.7 кОм), необходима для подтяжки линий 32K, SQW, SCL и SDA (кстати, если используется несколько модулей с шиной I2C, необходимо выпаять подтягивающие резисторы на других модулях). Вторая сборка резисторов, необходима для подтяжки линий A0, A1 и A2, необходимы они для смены адресации микросхемы памяти AT24C32N. Резистор R5 и диод D1, служат для подзарядки батарее, в принципе их можно выпаять, так как обычной батарейки SR2032 хватает на годы. Так же установлена микросхема памяти AT24C32N, это как бы бонус, для работы часов RTC DS3231N в ней нет необходимости. Резистор R1 и светодиод Power, сигнализируют о включении модуля. Как и говорилось, модуль работает по шине I2C, для удобства эти шины были выведены на два разъема J1 и J2, назначение остальных контактов, можно посмотреть ниже.Назначение J1
► 32K: выход, частота 32 кГц
► SQW: выход
► SCL: линия тактирования (Serial CLock)
► SDA: линия данных (Serial Dфta)
► VCC: «+» питание модуля
► GND: «-» питание модуля Назначение J2
► SCL: линия тактирования (Serial CLock)
► SDA: линия данных (Serial Data)
► VCC: «+» питание модуля
► GND: «-» питание модуля

Обзор часов реального времени DS3231 (RTC)

Немного расскажу, о микросхеме AT24C32N, это микросхема с 32к памятью (EEPROM) от производителя Atmel, собранная в корпусе SOIC8, работающая по двухпроводной шине I2C. Адрес микросхемы 0x57, при необходимости легко меняется, с помощью перемычек A0, A1 и A2 (это позволяет увеличить количество подключенных микросхем AT24C32/64). Так как чип AT24C32N имеет, три адресных входа (A0, A1 и A2), которые могут находится в двух состояния, либо лог «1» или лог «0», микросхеме доступны восемь адресов. от 0x50 до 0x57.

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

Необходимые детали:
► Arduino UNO R3 x 1 шт.
► Часы реального времени на DS3231, RTC, SPI, AT24C32 x 1 шт.
► Провод DuPont, 2,54 мм, 20 см, F-M (Female — Male) x 1 шт.
► Кабель USB 2.0 A-B x 1 шт.

Подключение:
В данном примере буду использовать только модуль DS3231 и Arduino UNO R3, все данные будут передаваться в «Мониторинг порта». Схема не сложная, необходимо всего четыре провода, сначала подключаем шину I2C, SCL в A4 (Arduino UNO) и SDA в A5 (Arduino UNO), осталось подключить питание GND к GND и VCC к 5V (можно записать и от 3.3В), схема собрана, теперь надо подготовить программную часть.

Обзор часов реального времени DS3231 (RTC)

Библиотеки работающий с DS3231 нет в среде разработке IDE Arduino, необходимо скачать «DS3231 » и добавить в среду разработки Arduino.

Установка времени DS3231
При первом включении необходимо запрограммировать время, откройте пример из библиотеки DS3231 «Файл» —> «Примеры» —> «DS3231» —> «Arduino» —> «DS3231_Serial_Easy», или скопируйте код снизу

Подключение RTC часы реального времени DS1302, DS1307, DS3231 к Arduino

Для подключения RTC часов реального времени DS1302, DS1307, DS3231, была разработана универсальная библиотека.

Подключение:

Подключение DS1307 к Arduino :

RTC DS1307 Arduino UNO
GND GND
VCC +5V
SDA A4
SCL A5

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

RTC DS1302 Arduino UNO
GND GND
VCC +5V
RST 10 (Можно изменить на другие в скетче)
CLK 13 (Можно изменить на другие в скетче)
DAT 12 (Можно изменить на другие в скетче)

Подключение DS3231 к Arduino :

Программа:

В зависимости от того какой модуль Вы подключаете, необходимо в программе указать

Для DS1307:

Для DS1302 :

Для DS3231 :

Пример установки текущего времени в RTC модуль (DS1307):

Пример считывания текущего времени с RTC модуля (DS1307) и вывод в «Последовательный порт» :

Преимущества библиотеки:

— библиотека имеет внутренние функции аппаратной обработки протоколов передачи данных I2C и SPI, а следовательно не требует подключения дополнительных библиотек, но и не конфликтует с ними, если таковые всё же подключены.

— библиотека имеет внутренние функции программой обработки протокола передачи данных 3-Wire

— для инициализации модуля необходимо вызвать функцию begin с названием модуля.

— подключение модулей осуществляется к аппаратным выводам arduino используемой шины (за исключением 3-Wire)

— простота установки и чтения времени функциями settime и gettime

функция settime может устанавливать дату и время, как полностью, так и частично (например только минуты, или только день, и т.д.)

функция gettime работает как функция date в php, возвращая строку со временем, но если её вызвать без параметра, то функция ничего не вернёт, а время можно прочитать из переменных в виде чисел.

— библиотека расширяемая, то есть для того, чтоб она работала с новым модулем, нужно указать параметры этого модуля в уже существующих массивах файла RTC.h (тип шины, частота шины в кГц, режимы работы, адреса регистров и т.д.), как всё это сделать, описано в файле extension.txt

Таким образом добавив новый модуль в библиотеку, мы лишь увеличим область занимаемой динамической памяти на

36 байт, при этом не затронув область памяти программ.

— при вызове функции begin, библиотека читает флаги регистров модуля и при необходимости устанавливает или сбрасывает их так, чтоб модуль мог работать от аккумуляторной батареи, а на программируемом выводе меандра (если таковой у модуля есть) установилась частота 1Гц, тогда этот вывод можно использовать в качестве внешнего посекундного прерывания.

— при работе с модулем DS1302 не нужны никакие резисторы на выводе GND (которые нужны для его работы с другими библиотеками этого модуля), это достигнуто тем, что для шины 3-Wire указана конкретная частота 10кГц, не зависимо от частоты CPU arduino.

— в библиотеке реализована еще одна не обязательная функция period, принимающая в качестве единственного аргумента — количество минут (от 1 до 255)

если в течении указанного времени была вызвана функция gettime несколько раз, то запрос к модулю по шине будет отправлено только в первый раз, а ответом на все остальные запросы будет сумма времени последнего ответа модуля и времени прошедшего с этого ответа.

Arduino и часы RTC DS3231

DS3231 – микросхема часов реального времени, которая при наличии внешнего автономного питания считает время и всегда готова поделиться им с микроконтроллером. Основные характеристики:

  • Питание: 2.3.. 5.5V
  • Потребление: 180 мкА
  • Потребление батарейки: 0.8 мкА
  • Считает часы, минуты, секунды, число, месяц, год, день недели
  • Встроенный календарь до 2100 года
  • Встроенный термометр, точность ±3°С
  • Свой автономный источник питания: батарейка CR2025 или

В продаже можно найти несколько вариантов модулей на базе DS3231.

В наборе GyverKIT:

  • Партии 0, 1 и 2 комплектовались мини-версией модуля (второй слева на картинке выше)
  • Партия 3 и далее – самый левый модуль синего цвета

Подключение

Модуль подключается к шине I2C согласно распиновке микроконтроллера:

  • GND > GND
  • VCC > VCC
  • Arduino: SDA – A4, SCL – A5
  • Wemos: SDA – D2, SCL – D1

У мини-версии модуля пины подписаны немного иначе:

  • + > VCC
  • – > GND
  • D > SDA
  • C > SCL

Библиотеки

    от adafruit
  • Моя библиотека microDS3231

В примерах на этом сайте мы будем использовать microDS3231 как гораздо более лёгкую и оптимальную. Библиотека идёт в архиве к набору GyverKIT, а свежую версию всегда можно установить/обновить из встроенного менеджера библиотек Arduino по названию microDS3231. Краткая документация находится по ссылке выше, базовые примеры есть в самой библиотеке.

Примеры

Чтобы автоматически установить время на модуле, можно прошить следующую программу:

Она установит дату и время, равное времени компиляции программы, то есть текущее. После этого можно работать с модулем, например выведем дату и время разными способами:

Подключение часов DS3231 к Arduino

Если вы проектируете устройство, которому нужно всегда и везде знать точное время, вам пригодится модуль часов реального времени. Такие часы способны отсчитывать точное время и сохранять его даже при отключении основного питания, так как подразумевается их эксплуатация с батарейкой (обычно CR2032). В режиме работы без основного питания, часы способны отработать на такой батарейке c десяток лет!

Одним из наиболее часто используемых модулей ЧРВ (RTC – Real Time Clock) является микросхема DS1307 от Dallas Semiconductors. Точность хода микросхемы сильно зависит от внешнего кварца и его обвязки, поэтому на просторах Интернета данный модуль считается неточным.

Однако, существует «автономный» модуль – DS3231, который имеет встроенный кварц с термостабилизацией.

Его точность составляет 2ppm (partspermillion – частей на миллион). Такая погрешность зачастую незаметна и примерно равна погрешности наручных часов. При всех его плюсах, модуль ещё и совместим со всеми DS1307-ми библиотеками!

И в нашей сегодняшней статье мы поговорим о подключении данной микросхемы к микроконтроллерам Arduino.

DS3231 - часы реального времени)

Для реализации проекта из этой статьи нам потребуются следующие компоненты:

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

Часы подключаются по двухпроводной шине IIC (Inter-IntegratedCircuit) через выводы SDA и SCL к SDA и SCL Arduino соответственно. Также необходимо подключить питание +5В и GND. Остальные выводы специфичны для DS3231 и не поддерживаются библиотеками для DS1307, да и не часто используются.

Обратите внимание – выводы шины IICна разных контроллерах расположены на разных пинах:

Контакт SDA Контакт SCL
На Arduino UNO, Nano, Pro Mini etc. A4 A5
На Arduino Mega, Due 20 21
На Arduino Leonardo, Pro Micro 2 3

После подключения у нас должно получится примерно так:

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

Настройка и подключение в Arduino IDE

Как и со всей периферией Arduino, с модулем часов удобнее работать, используя библиотеку. Мы будем пользоваться низкоуровневой библиотекой Wire (входит в комплект поставки Arduino IDE) и двумя высокоуровневыми DS1307 RTCи Time (необходимо скачать).

Несмотря на то, что библиотека написана для «неточных» часов, она поддерживает работу и с DS3231.

После скачивания библиотек их необходимо установить. Для этого две папки с библиотеками копируются в поддиректорию libraries в папке установки среды Arduino IDE.

Папка Libraries находится по разным адресам в зависимости от вашей ОС:

На Mac: домашняя директория -> Documents -> Arduino -> libraries

На PC: Мои документы -> Arduino -> libraries

На Linux: домашняя директория -> sketchbook -> libraries

После установки запустите среду Arduino IDE и откройте пример TimeRTC библиотеки Time (Файл Examples Time TimeRTC), или просто скопируйте код:

Загрузите скетч в плату, после чего откройте монитор последовательного порта (Ctrl+Shift+M). Скорее всего, вы увидите неправильное время или вообще его не увидите, так как часы всё ещё не настроены.

Для их настройки запустите пример SetTime (Файл Примеры DS1307RTC SetTime) и залейте его в плату. После загрузки время будет настроено по системному времени ПК на момент компиляции. Если вы в любой момент времени перезагрузите плату, то время снова будет сброшено ко времени компиляции, поэтому после заливки настроенного скетча отключите сигнальные линии часов и залейте любой другой скетч (например, наш первый, выводящий время).

Если вам не нравится настройка времени по времени компиляции, вы можете задать ее самостоятельно, для этого используйте следующий код:

Он установит время и дату на 13:00:00 1 апреля 2016 года. Поменяйте это значение для установки своего времени. Учтите – если вы перезагрузите плату, время будет сброшено, как с временем компиляции, так что повторите действия с отключением платы и заливкой другого скетча.

Товары, используемые в материале

AC-DC Блок питания 9В / 1.2А (10Вт)

AC-DC Блок питания 9В / 1.2А (10Вт)

Плата Arduino Uno (Официальная версия)

Arduino Uno (DIP версия)

Модуль RTC (часов реального времени) на базе микросхемы DS3231

DS3231 – часы реального времени (RTC)

Набор проводов «Папа — Мама», шлейф, 20 см

Шлейф проводов «Папа — Мама» (20см, 40шт.)

Самые популярные материалы в блоге

За все время
За сегодня

Сдвиговый регистр и Arduino

Подключение Bluetooth модуля HC-03 - HC-07 к Arduino

10 комментариев . Оставить новый

спасибо но работает только с ардуино IDE 0015-1.5

а какие ошибки появляются при работе с другой версией?

Мне интересно, эти ошибки специально созданы для того, чтобы только продвинутый пользователь мог разобраться? Или всё же случайно?

Arduino: 1.8.2 Hourly Build 2017/03/21 05:33 (Windows XP), Плата:”Arduino Nano, ATmega328P”
In file included from C:\Program Files\Arduino\libraries\DS1307RTC\examples\SetTime\SetTime.ino:1:0:
C:\Program Files\Arduino\libraries\DS1307RTC/DS1307RTC.h:19:22: error: ‘tmElements_t’ has not been declared
static bool read(tmElements_t &tm);
^
C:\Program Files\Arduino\libraries\DS1307RTC/DS1307RTC.h:20:23: error: ‘tmElements_t’ has not been declared
static bool write(tmElements_t &tm);
^
SetTime:10: error: ‘tmElements_t’ does not name a type
tmElements_t tm;

^
C:\Program Files\Arduino\libraries\DS1307RTC\examples\SetTime\SetTime.ino: In function ‘void setup()’:

SetTime:20: error: expected primary-expression before ‘)’ token
if (RTC.write(tm)) <

^
C:\Program Files\Arduino\libraries\DS1307RTC\examples\SetTime\SetTime.ino: In function ‘bool getTime(const char*)’:

SetTime:53: error: expected unqualified-id before ‘.’ token
tm.Hour = Hour;

^
SetTime:54: error: expected unqualified-id before ‘.’ token
tm.Minute = Min;

^
SetTime:55: error: expected unqualified-id before ‘.’ token
tm.Second = Sec;

^
C:\Program Files\Arduino\libraries\DS1307RTC\examples\SetTime\SetTime.ino: In function ‘bool getDate(const char*)’:

SetTime:70: error: expected unqualified-id before ‘.’ token
tm.Day = Day;

^
SetTime:71: error: expected unqualified-id before ‘.’ token
tm.Month = monthIndex + 1;

^
SetTime:72: error: expected unqualified-id before ‘.’ token
tm.Year = CalendarYrToTm(Year);

^
exit status 1
‘tmElements_t’ does not name a type

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *