Синхронизация ds3231 с компьютером
Сегодня снова поговорим о модуле часов DS3231. А точнее про его настройку и установку на нём времени, даты и будильников.
Про саму работу датчика и его подключение к Ардуино уже есть много видео, и на моём канале тоже. Если есть желание, то можете посмотреть вот здесь.
Мы же сегодня поговорим именно про настройку.
Давайте посмотрим, что получилось, а я по ходу буду рассказывать, что мы сегодня изучим.
- Во-первых, это установку даты и времени. Есть несколько вариантов. Первый и самый простой – это прямо в коде написать дату и время и сохранить в модуль часов. Этот вариант хороший, но модуль, хоть он и считается очень точным, но через какое-то время, он начнёт отставать или спешить. И для настройки нам снова придётся подключать его к компьютеру и заново прошивать время.
- Второй способ – это синхронизировать время с временем на компьютере. Но для этого Ардуино всегда должна быть подключена к компьютеру.
- И третий способ — это сделать возможным управление часами с помощью кнопок или энкодера. С энкодером удобнее, но это я оставлю на следующий раз. А сегодня – это кнопки.
Я хочу снова вернуться к спонсорской помощи канала. Если вам нравятся мои уроки и то как я всё делаю и объясняю, то думаю вам не составит большого труда помочь в развитии канала. Минимальный вклад – это 99 рублей. Согласитесь, что это не много. А мне это поможет в закупке новых комплектующих. Мои резервы уже на исходе. Время не стоит на месте и появляются всё новые модули и датчики, и если вы хотите чтобы я рассказывал о них, они должны у меня быть. У меня на каждый проект уходит очень много времени, вам же я стараюсь рассказать за несколько минут, то что я искал часами.
Скачивая готовые проекты, вы можете буквально за час-другой сделать готовое изделие. Это экономит ваше время. А как говорится, Время это деньги.
Мне не жалко, но без вашей помощи, канал может загнуться.
Думаю, что вы войдёте в моё положение и поможете каналу, а так же и себе тоже.
Думаю вы достаточно посмотрели, и теперь готовы к изучению этого примера.
Сегодня нам понадобятся
- Модуль часов DS3231
- LCD дисплей 1602
- Три кнопки
- И плата семейства Ардуино.
Как вы уже поняли выводить дату время мы будем на LCD дисплей 1602. Я взял в версии с I2C. Так проще и подключить надо будет всего 2 вывода, а оставшиеся свободные выходы Ардуино нам ещё пригодятся.
Сначала я хотел выводить на экран русские буквы, но с налёта у меня не получилось. Возможно сделаю это в следующей версии.
Давайте посмотрим схему подключения.
У модуля дисплея, и у модуля часов одинаковые выходы, так как они работаю по одной шине. Шине I2C. Поэтому их подключаем одинаково.И выводы SDA и SCL подключаем к выводам A4 и A5 соответственно. Питание у обоих модулей 5 вольт.
Кнопки подключаем к выводам A0 – A3.
- A0 – кнопка отвечает за выбор режима работы.
- A1 – прибавляет значения, а A2 – уменьшает значения.
- A3– кнопка работы с будильником.
- Для работы будильника установим на выход D8 пищалку.
Давайте немного посмотрим скетч.
Скетч довольно непростой. А для тех кто никогда не работал в энергонезависимой памятью EEPROM, так и вообще покажется запутанным.
Для начала вам нужно установить 2 библиотеки. Одну для работы с дисплеем, а вторую для модуля часов.
Библиотеку для дисплея можно установить из самой Ардуино IDE, а вот библиотеку часов нужно установить мою, их архива. И если у вас уже установлена другая версия библиотеки, то её надо будет удалить перед установки моей библиотеки.
Это адрес дисплея на шине I2C и его размер.
Это для работы с библиотекой часов. Я в коде кое-где накидал комментариев. Если что разберётесь.
Это куда подключены кнопки и пищалка, а это переменные для хранения времени, даты и дней недели.
Так выглядит код отвечающий за символы термометра и будильника. Если хотите можете заменить на свои.
Если что там ещё много кода осталось. Попробуйте разобраться сами.
Если вам нравятся мои видео, то вы можете помочь в развитии канала став его спонсором. Все ваши вклады пойдут на закупки новых модулей. Вам же за это будут предоставлены дополнительные бонусы, и они довольно интересные.
Микросхема DS3231 представляет собой высокоточные часы реального времени RTC, которая обладает встроенным кварцевым генератором с температурной компенсацией, благодаря чему уход времени составляет всего ±2 минуты за год. Дополнительно реализована функция будильника, также имеется выход прерываний. Часы можно приобрести в виде готового модуля под Arduino с элементами обвязки и отсеком для батареи.
Я заказывал модуль здесь . Схема представлена на картинке ниже:
Микросхема использует широко распространенный интерфейс передачи данных I2C. Поддерживается стандартная (100 кГц) и высокая (400 кГц) скорость передачи данных. Адрес микросхемы (7 бит) на шине I2C равен 1101000. Дополнительно на модуле установлена память I2C (24C32), на схеме не изображена.
Режимы электропитания
Напряжение питания микросхемы может находиться в пределах 2,3…5,5В, имеются две линии питания, для внешнего источника (линия Vcc), а также для батареи (Vbat). Напряжение внешнего источника постоянно отслеживается, при падении ниже порога Vpf=2,5В, происходит переключение на линию батареи. В следующей таблице представлены условия переключения между линиями питания:
Комбинации уровней напряжения | Активная линия питания |
Vcc < Vpf, Vcc < Vbat | Vbat |
Vcc < Vpf, Vcc > Vbat | Vcc |
Vcc > Vpf, Vcc < Vbat | Vcc |
Vcc > Vpf, Vcc > Vbat | Vcc |
Точность хода часов поддерживается за счет отслеживания температуры окружающей среды. В микросхеме запускается внутренняя процедура корректировки частоты тактового генератора, величина корректировки определяется по специальному графику зависимости частоты от температуры. Процедура запускается после подачи питания, а затем выполняется каждые 64 секунды.
Ток потребления при питании от батареи напряжением 3,63В, составляет 3 мкА, при отсутствии передачи данных по интерфейсу I2C. Максимальный ток потребления может достигать 300 мкА, в случае использования внешнего источника питания напряжением 5,5В, и высокой скорости передачи данных I2C.
Функция внешнего сброса
Линия RST может использоваться для внешнего сброса, а также обладает функцией оповещения о низком уровне напряжения. Линия подтянута к высокому логическому уровню через внутренний резистор, внешняя подтяжка не требуется. Для использования функции внешнего сброса, между линией RST и общим проводом можно подключить кнопку, в микросхеме реализована защита от дребезга контактов. Функция оповещения активируется при снижении напряжения питания Vcc ниже порогового значения Vpf, при этом на линии RST устанавливается низкий логический уровень.
Описание регистров DS3231
Ниже в таблице представлен перечень регистров часов реального времени:
Адрес | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 | Функция | Пределы |
0x00 | 0 | 10 секунд | Секунды | Секунды | 00-59 | |||||
0x01 | 0 | 10 минут | Минуты | Минуты | 00-59 | |||||
0x02 | 0 | 12/24 | AM/PM | 10 часов | Час | Часы | 1-12 + AM/PM или 00-23 | |||
10 часов | ||||||||||
0x03 | 0 | 0 | 0 | 0 | 0 | День | День недели | 1-7 | ||
0x04 | 0 | 0 | 10 число | Число | Дата | 01-31 | ||||
0x05 | Century | 0 | 0 | 10 месяц | Месяц | Месяцы/век | 01-12 + Век | |||
0x06 | 10 лет | Год | Годы | 00-99 | ||||||
0x07 | A1M1 | 10 секунд | Секунды | Секунды, 1-й будильник | 00-59 | |||||
0x08 | A1M2 | 10 минут | Минуты | Минуты, 1-й будильник | 00-59 | |||||
0x09 | A1M3 | 12/24 | AM/PM | 10 часов | Час | Часы, 1-й будильник | 1-12 + AM/PM или 00-23 | |||
10 часов | ||||||||||
0x0A | A1M4 | DY/DT | 10 число | День | День недели, 1-й будильник | 1-7 | ||||
Число | Дата, 1-й будильник | 01-31 | ||||||||
0x0B | A2M2 | 10 минут | Минуты | Минуты, 2-й будильник | 00-59 | |||||
0x0C | A2M3 | 12/24 | AM/PM | 10 часов | Час | Часы, 2-й будильник | 1-12 + AM/PM или 00-23 | |||
10 часов | ||||||||||
0x0D | A2M4 | DY/DT | 10 число | День | День недели, 2-й будильник | 1-7 | ||||
Число | Дата, 2-й будильник | 01-31 | ||||||||
0x0E | EOSC | BBSQW | CONV | RS2 | RS1 | INTCN | A2IE | A1IE | Регистр настроек (Control) | |
0x0F | OSF | 0 | 0 | 0 | EN32kHz | BSY | A2F | A1F | Регистр статуса (Status) | |
0x10 | SIGN | DATA | DATA | DATA | DATA | DATA | DATA | DATA | Регистр подстройки частоты (Aging Offset) | |
0x11 | SIGN | DATA | DATA | DATA | DATA | DATA | DATA | DATA | Регистр температуры, старший байт | |
0x12 | DATA | DATA | 0 | 0 | 0 | 0 | 0 | 0 | Регистр температуры, младший байт |
Информация о времени хранится в двоично-десятичном формате, то есть каждый разряд десятичного числа (от 0 до 9) представляется группой из 4-х бит. В случае одного байта, младший полубайт отсчитывает единицы, старший десятки и т. д. Счет времени осуществляется в регистрах с адресами 0x00-0x06, для отсчета часов можно выбрать режим 12-ти или 24-х часов. Установка 6-го бита регистра часов (адрес 0x02), задает 12-ти часовой режим, в котором 5-й бит указывает на время суток, значению 1 соответствует время после полудня (PM), значению 0 до полудня (AM). Нулевое значение 6-го бита соответствует 24-х часовому режиму, здесь 5-й бит участвует в счете часов (значения 20-23).
Регистр дня недели инкрементируется в полночь, счет идет от 1 до 7, регистр месяцев (адрес 0x05) содержит бит века Century (7-й бит), который переключается при переполнении регистра счета лет (адрес 0x06), от 99 к 00.
В микросхеме DS3231 реализовано два будильника, 1-й будильник настраивается с помощью регистров с адресами 0x07-0x0A, 2-й будильник регистрами 0x0B-0x0D. Битами A1Mx и A2Mx можно настроить различные режимы для будильников, установка бита исключает соответствующий регистр из операции сравнения. Ниже в таблицах приведены комбинации битов для разных режимов будильника:
Будильник 1 | |||||
DY/DT | A1M4 | A1M3 | A1M2 | A1M1 | Режим будильника |
X | 1 | 1 | 1 | 1 | Сигнал каждую секунду |
X | 1 | 1 | 1 | 0 | Сигнал при совпадении секунд |
X | 1 | 1 | 0 | 0 | Сигнал при совпадении минут, секунд |
X | 1 | 0 | 0 | 0 | Сигнал при совпадении часа, минут, секунд |
0 | 0 | 0 | 0 | 0 | Сигнал при совпадении даты, часа, минут, секунд |
1 | 0 | 0 | 0 | 0 | Сигнал при совпадении дня недели, часа, минут, секунд |
Будильник 2 | ||||
DY/DT | A2M4 | A2M3 | A2M2 | Режим будильника |
X | 1 | 1 | 1 | Сигнал каждую минуту (при значении 00 секунд) |
X | 1 | 1 | 0 | Сигнал при совпадении минут |
X | 1 | 0 | 0 | Сигнал при совпадении часа, минут |
0 | 0 | 0 | 0 | Сигнал при совпадении даты, часа, минут |
1 | 0 | 0 | 0 | Сигнал при совпадении дня недели, часа, минут |
Комбинации битов не указанные в таблицах, приводят к некорректному функционированию будильников. Если бит DY/DT сброшен, то для будильника отслеживается совпадение даты (день месяца), при установке бита DY/DT, проверяется совпадение дня недели.
Большинство функций настраиваются в регистре Control. Бит EOSC управляет запуском тактового генератора, сброс бита запускает генератор. Установка бита останавливает генератор, только для режима питания от батареи (Vbat). При питании от внешнего источника (Vcc), генератор всегда запущен независимо от состояния бита EOSC. После включения, значение бита по умолчанию равно 0.
Установка бита BBSQW разрешает функционирование выхода INT/SQW (3-й вывод) в режиме питания от батареи, при отсутствии внешнего питания. При нулевом значении бита, выход INT/SQW переходит в 3-е состояние (деактивируется), если напряжение внешнего источника Vcc падает ниже порогового значения Vpf. После подачи питания, значение бита по умолчанию равно 0.
Бит CONV отвечает за принудительное измерение температуры, установка бита запускает процесс преобразования, во время которого также выполняется корректировка частоты тактового генератора, результат измерения находится в регистрах с адресами 0x11, 0x12. Запуск возможен только в случае окончания предыдущего преобразования, перед запуском необходимо проверить флаг занятости BSY. Принудительное преобразование температуры не влияет на внутренний 64-х секундный цикл корректировки частоты. Установка бита CONV не влияет на флаг BSY в течение 2 мс. Биты CONV и BSY сбрасываются автоматически после завершения преобразования.
Биты RS2, RS1 устанавливают частоту прямоугольных импульсов (меандр) на выходе INT/SQW. По умолчанию, при включении биты устанавливаются в 1. Ниже в таблице представлены возможные комбинации битов:
RS2 | RS1 | Частота прямоугольных импульсов на выходе INT/SQW |
0 | 0 | 1 Гц |
0 | 1 | 1,024 кГц |
1 | 0 | 4,096 кГц |
1 | 1 | 8,192 кГц |
Установка битов A1IE, A2IE разрешает прерывания по сигналу 1-го и 2-го будильника соответственно. Сброс битов, запрещает прерывания. По умолчанию значение равно 0.
Регистр Status содержит флаги событий, и управляет выходом 32 kHz. Флаг OSF отражает состояние тактового генератора, значение 1, означает, что генератор остановлен, это событие может произойти в следующих случаях:
- В первое время после подачи питания
- Напряжение батареи или внешнего источника недостаточно для работы тактового генератора
- Генератор выключен установкой бита EOSC в режиме питания от батареи
- Внешние факторы, влияющие на кварцевый генератор (шум, утечка и т.д.)
После установки значение бита не меняется, необходимо сбросить бит вручную.
Установка бита EN32kHz разрешает генерирование прямоугольных импульсов (меандр) на выходе 32kHz (1-й вывод), частота импульсов фиксирована и равна 32,768 кГц. Сброс бита отключает данную функцию и переводит выход в 3-е состояние (с высоким входным сопротивлением). По умолчанию значение бита равно 1, после подачи питания на выходе появляются импульсы. Тип выхода 32kHz открытый сток, поэтому требуется подтяжка к высокому логическому уровню.
Флаг занятости BSY устанавливается во время процесса преобразования температуры и корректировки частоты тактового генератора. Флаг сбрасывается после завершения преобразования.
Флаги будильников A1F, A2F устанавливаются при совпадении значений регистров счета времени и регистров будильника. Если разрешены прерывания по сигналу будильников A1IE, A2IE, а также назначен выход прерывания (установлен бит INTCN), то на выходе INT/SQW появляется сигнал прерывания (переход от высокого к низкому логическому уровню). Флаги необходимо сбросить вручную, записав значение 0.
Текущее значение температуры хранится в регистрах с адресами 0x11 и 0x12, старший и младший байт соответственно, значение температуры в регистрах периодически обновляется. Установлено левое выравнивание, разрешение составляет 10 бит или 0,25°C/LSB, то есть в старшем байте находится целая часть температуры, а 6, 7-й биты в младшем регистры составляют дробную часть. В старшем байте 7-й бит указывает знак температуры, например, значению 00011011 01 соответствует температура +27,25 °C, значению 11111110 10 температура -2,5 °C.
При чтении регистров счета времени, рекомендуется использовать дополнительный буфер, то есть считывать сразу несколько регистров, а не по отдельности, так как между отдельными операциями чтения, регистры времени могут поменять свое значение. Это правило также рекомендуется соблюдать при записи новых данных в регистры счета. Запись нового значения в регистр секунд, приостанавливает ход часов на 1 секунду, остальные регистры должны быть перезаписаны в течение этого времени.
Подключение DS3231 к микроконтроллеру
Я подключил часы к микроконтроллеру PIC16F628A, для отображения времени использовал цифровое табло из семисегментных индикаторов на драйвере MAX7219. Схема подключения представлена ниже:
После подачи питания на индикаторах высвечиваются знаки тире (– – – – – –), далее выполняется инициализация часов, значение времени появляется на индикаторах с задержкой в 1 секунду, которая требуется для запуска тактового генератора часов. На индикаторы выводится значение часов, минут и секунд, разделенных десятичной точкой, формат времени 24-х часовой. Кнопкой SB1 “Индикация” можно сменить формат отображения, где на индикаторы будет выводиться температура, а также значение часов и минут, разделенных десятичной точкой, которая мигает с частотой 2 Гц. Температура отображается без дробной части, в программе считывается только старший байт хранения температуры по адресу 0x11.
Значение времени считывается из часов по прерыванию на линии SQW/INT, которая управляется сигналом 1-го будильника, в процессе инициализации часов будильник настраивается на ежесекундный сигнал. Светодиод HL1 служит в качестве индикатора и вспыхивает по сигналу прерывания каждую секунду. Светодиод HL2 загорается в случае ошибки передачи данных по интерфейсу I2C.
Неполный код программы приведен ниже (полную версию можно скачать в конце статьи):
Технические параметры
► Напряжение питания: 3.3В и 5В
► Чип памяти: AT24C32 (32 Кб)
► Точность: ± 0.432 сек в день
► Частота кварца:32.768 кГц
► Поддерживаемый протокол: I2C
► Габариты: 38мм x 22мм x 15мм
Общие сведения
Большинство микросхем, таких как DS1307 используют внешний кварцевый генератор частотой 32кГц, но в них есть существенный недостаток, при изменении температуры меняется частота кварца, что приводит к погрешности в подсчете времени. Эта проблема устранена в чипе DS3231, внутрь которого установили кварцевый генератор и датчик температуры, который компенсирует изменения температуры, так что время остается точным (при необходимости, данные температуры можно считать). Так же чип DS3231 поддерживает секунды, минуты, часы, день недели, дата, месяц и год информацию, а так же следит за количеством дней в месяце и делает поправку на високосный год. Поддерживает работу часов в двух форматов 24 и 12, а так-же возможно запрограммировать два будильника. Модуль работает по двух проводной шине I2C.
Теперь немного о самом модуле, построен он на микросхеме 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 к Arduino
Библиотеки работающий с DS3231 нет в среде разработке IDE Arduino, необходимо скачать «DS3231 » и добавить в среду разработки Arduino.
Установка времени DS3231
При первом включении необходимо запрограммировать время, откройте пример из библиотеки DS3231 «Файл» —> «Примеры» —> «DS3231» —> «Arduino» —> «DS3231_Serial_Easy», или скопируйте код снизу
Для подключения 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 несколько раз, то запрос к модулю по шине будет отправлено только в первый раз, а ответом на все остальные запросы будет сумма времени последнего ответа модуля и времени прошедшего с этого ответа.
Читайте также: