Про Ардуино и не только

Содержание

В данной публикации я расскажу об использовании RTC модуля на базе DS3231 для вывода Ардуино (или отдельного микроконтроллера) из режима энергосбережения. Можно сказать, будем делать будильник для Ардуино.

Микросхема DS3231 — это высокоточные часы реального времени с I2C интерфейсом, встроенным кварцевым генератором и температурной компенсацией. Как и другие подобные микросхемы DS3231 имеет два входа питания: основной и резервный для подключения батарейки или суперконденсатора. Рекомендуемое напряжение питания 2.3В .. 5.5В. Точность хода часов составляет ±3.5ppm при работе в температурном диапазоне от -40°C до +85°C, что обеспечивает отклонение не более, чем на 2 минуты за год — это, действительно, хороший показатель. Кроме учета времени в данной микросхеме реализованы два будильника и программируемый генератор прямоугольных импульсов. Ссылка на даташит: https://datasheets.maximintegrated.com/en/ds/DS3231.pdf

Почему именно DS3231?

У тех же Maxim/Dallas Semiconductor номенклатура RTC устройств насчитывает десятки микросхем. Среди них немало достойных моделей. И при желании их, конечно, можно купить, например, в ЧИП и ДИП. Но всё же большинство покупаемых деталей — это Аликспресс, а что он предлагает нам на запрос RTC? — Убогий DS1302, DS1307 и DS3231, что-то другое встречается значительно реже. Из указанных трёх микросхем будильник есть только в DS3231. Таким образом, DS3231 — это наиболее доступная микросхема (или модуль) RTC с функцией будильника и высокой точностью.

Подключение DS3231 к Ардуино

Общение с DS3231 осуществляется по линиям I2C. Схема подключения RTC модуля на DS3231 к Ардуино Уно приведена ниже.

Подключение DS3231 к Ардуино для работы с будильником

Если бы нас интересовало только текущее время, то достаточно было бы подключить VCC, GND, SCL и SDA модуля к соответствующим выводам Ардуино. В данном же случае нам нужен ещё вывод INT/SQW. На нём будет генерироваться сигнал запроса прерывания для пробуждения микроконтроллера. Поэтому проще всего подключить его к входу внешнего прерывания, для УНО это D2 и D3. Хотя можно использовать и другие выводы, разрешив на них PCINT.

Кстати, на моём модуле не было вывода INT/SQW. При этом в штыревом разъеме один из выводов был не задействован. Я подпаял его к третьей ножке микросхемы DS3231 (это и есть INT/SQW) и получил нужный мне вывод на штыревом разъеме модуля.

Добавление недостающего вывода INT/SQW на модуле DS3231

Библиотека для DS3231

Я использую библиотеку https://github.com/jarzebski/Arduino-DS3231, она поддерживает все функции DS3231 и не требует установки других библиотек. Предлагаю и вам скачать данную библиотеку и добавить её в среду разработки Ардуино. В ней есть несколько полезных примеров. Для сейчас интересует пример DS3231_intalarm, показывающий, как установить будильник и генерировать им внешнее прерывание. Правда в примере раскрыты не все опции библиотеки, поэтому я немного подправил его и привел ниже для рассмотрения. Залейте его в Ардуино и откройте монитор порта. Модуль DS3231 должен быть подключен к Ардуино по приведённой выше схеме.

Перед настройкой будильников необходимо запретить их работу и сбросить флаги. Это делается в начале функции setup. Далее выставляется время, это может быть сделано с использованием времени компиляции скетча или вручную. Далее настраиваем будильники. В DS3231 их два, первый может быть настроен с точностью до секунд, второй до минут. В скетче я привел все возможные варианты их установки. После этого остаётся разрешить внешнее прерывание и привязать для него обработчик. В данном скетче обработчик устанавливает переменную isAlarm, что будет говорить о срабатывании будильника.

Функция loop проверяет значение переменной isAlarm и, если она установлена, определяет какой из будильников сработал. В результате мы видим в мониторе порта сообщения "Alarm 1" и "Alarm 2":

Пример вывода при пробуждении Ардуино

Использование DS3231 для пробуждения Ардуино

Итак, наша задача — перевести Ардуино в режим энергосбережения и периодически просыпаться по будильнику для выполнения каких-то действий. Попробуем, например, мигать встроенным светодиодом при пробуждении Ардуино. Практически всё, что нам для этого нужно, уже есть в приведённом выше скетче. Остаётся лишь добавить переход в режим энергосбережения:

В данном примере будильник 1 устанавливается на срабатывание в 10 секунд каждой минуты, после чего Ардуино переводится в режим энергосбережения. Доступные для Ардуино (ATmega328P) режимы энергосбережения, а также события, пробуждающие микроконтроллер, я приводил в статье Режимы энергосбережения Ардуино. Проснувшись, не лишним будет проверить флаг будильника, чтобы убедиться, что именно он нас разбудил. Если флаг будильника 1 установлен, то можем выполнять наш код, в данном случае — включение и выключение светодиода.

Будильник не обязательно должен настраиваться единожды, как в приведённых выше скетчах. Его можно менять хоть при каждом срабатывании. Так можно добиться пробуждения Ардуино через определённый интервал времени. Например, чтобы будильник срабатывал каждые 10 минут, его нужно выставлять при каждом пробуждении на текущее время + 10 минут. Это потребует минимальных изменений приведённого выше скетча:

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

Энергопотребление DS3231

Если мы хотим использовать DS3231 для вывода микроконтроллера из режима энергосбережения, то неплохо бы разобраться с потреблением и самих часов. Обратимся для этого к даташиту. В нём нас интересуют две таблицы Electrical Characteristics. Первая для случая, когда источником питания служит вход VCC, вторая — питание от VBAT, то есть от батарейки. Небольшая выжимка из этих таблиц приведена ниже:

Максимальное

значение

Вывод 32кГц разрешён,

Меандр (SQW) запрещён

Вывод 32кГц разрешён,

Меандр (SQW) запрещён

Меандр (SQW) запрещён

Вывод 32кГц разрешён,

Меандр (SQW) запрещён

Меандр (SQW) запрещён

Active Supply Current — это среднее значение тока, потребляемого микросхемой DS3231 при работающей шине I2C (причем на максимальной частоте — 400кГц), с учётом тока измерения температуры.

Standby Supply Current отражает среднее потребление DS3231 при неактивной шине I2C, разрешённом выводе частоты 32кГц и с запрещённым меандром SQW. Данное значение также включает в себя ток при измерении температуры.

Temperature Conversion Current — ток, потребляемый микросхемой в момент измерения температуры. Измерения выполняются при подаче питания и далее каждые 64 секунды для подстройки частоты генератора. Время измерения температуры (параметр TCONV — Temperature Conversion Time) не превышает 200мс.

Active Battery Current — среднее значение тока, потребляемого DS3231 при питании от VBAT, работающей шине I2C, с учетом тока при измерении температуры.

Timekeeping Battery Current — среднее значение тока, потребляемого DS3231 при питании от VBAT, при неактивной шине I2C, с учетом тока при измерении температуры.

Переключение источника питания с VCC на VBAT происходит при выполнении двух условий: VCC VPF и VCC VBAT. VPF — это Power-Fail Voltage, его значение составляет 2.45В .. 2.70В. Переключение на VCC происходит, когда напряжение на данном входе становится больше VBAT.

Из таблицы видно, что потребление DS3231 не превышает 300мкА при работающей шине I2C и VCC = 5.5В. В целом же потребление значительно ниже. Для его оценки я подключил модуль DS3231 к микроконтроллеру ATmega328P без обвязки. Тактирование от внутреннего генератора 8МГц. Питание — литиевый аккумулятор 18650 с напряжением 4.1В. В режиме POWER_DOWN с отключённым АЦП и BOD потребление микроконтроллера и часов составило 93мкА:

Таким образом, DS3231 — это не просто точные часы, это полезный инструмент для многих проектов, требующих минимизации энергопотребления.


Источник: tsibrov.blogspot.com