RTC DS3231; высокоточные часы реального времени
RTC DS3231 — высокоточные часы реального времени
DS3231 — высокоточные часы реального времени (real-time clock, RTC) со встроенными I2C интерфейсом, термокомпенсированным кварцевым генератором (TCXO) и кварцевым резонатором. Прибор имеет вход для подключения резервного автономного источника питания, позволяющего осуществлять хронометрирование и измерение температуры даже при отключенном основном напряжении питания. Встроенный кварцевый резонатор повышает срок службы прибора и уменьшает необходимое количество внешних элементов. DS3231 доступен в модификациях с коммерчески и индустриальным рабочим температурным диапазоном и упакован в 300 mil 16 контактный SO корпус.
RTC обеспечивает отсчет секунд, минут, часов, дней недели, дней месяца и года. Дата конца месяца определяется автоматически с учетом високосного года. Часы реального времени работают в 24 или 12- часовом формате с индикацией текущей половины суток (AM/PM). Прибор имеет два ежедневных будильника и выход прямоугольного сигнала с программируемой частотой. Обмен данными с прибором ведется через встроенный последовательный I2C совместимый интерфейс.
Прецизионный термокомпенсированный источник опорного напряжения и схема сравнения отслеживают напряжение основного питания VCC и при его снижении ниже заданного порога формируют сигнал сброса и осуществляют перевод схемы на работу от резервного источника питания. Дополнительный вывод RST может использоваться для внешнего сброса.
Почему именно DS3231?
У тех же Maxim/Dallas Semiconductor номенклатура RTC устройств насчитывает десятки микросхем. Среди них немало достойных моделей. И при желании их, конечно, можно купить, например, в ЧИП и ДИП. Но всё же большинство покупаемых деталей — это Аликспресс, а что он предлагает нам на запрос RTC? — Убогий DS1302, DS1307 и DS3231, что-то другое встречается значительно реже. Из указанных трёх микросхем будильник есть только в DS3231. Таким образом, DS3231 — это наиболее доступная микросхема (или модуль) RTC с функцией будильника и высокой точностью.
Функция delay()
Функция delay() позволяет приостановить выполнение текущей программы на указанное в параметре время. Синтаксис команды выглядит следующим образом:
Время указывается в миллисекундах (1 сек = 1000 мс). Данный параметр может иметь тип «unsigned long», который находится в диапазоне от 0 до 4294967295. Ниже пример использования команды delay():
В приведенном выше примере, светодиод загорается на 0,5 секунды, затем гаснет на 1 секунду и так далее, пока питание Arduino не будет отключено.
Этакий разработчик идей, имеющий открытый вход к запуску на платформе Ардуино. Главное требование в использовании – наличие интернета: Wi-Fi или мобильный трафик. Только в этом случае Blynk будет готов к выполнению. Начать использование можно спустя несколько минут, после окончания настроек. Программой поддерживается АО по выбору пользователя.
Основные функции приложения Blynk заключаются в управлении устройствами при помощи удаления и добавления протоколов HTTP, а также запросов GET и POST. Значения параметров можно обновлять и получать. Запросы обновляются в самом приложении.
Вариативность – важная точка программы. Имея связь с работающими платформами, можно соединиться с сервером любым удобным способом. Данный инстинктивный портал обладает простотой в использовании над проектом. Библиотека постоянно обновляется для всех приложений Arduino Blynk.
Клиентов, желающих включать кофе машинку со своего смартфона, заинтересует это приложение. Это, пожалуй, единственный сервис с подобными возможностями. И не смотря на, то, что он практически безлимитный, является трудным Openhab. В сравнении с другими сервисами обладает быстрой скоростью при запуске.
Тестируем часы реального времени
Первым делом посмотрим тестовый скетч, который считывает время с модуля RTC один раз в секунду. Также выясним, что произойдет, если снять батарею и заменить ее, что заставляет часы реального времени сбросится. Прежде всего, снимем батарею при отключенном питании Arduino. Подождем 3 секунды и вернем батарею на место. Это приведет к сбросу RTC.
Выберем пример скетча из меню Arduino IDE Файл → Образцы → DS1307RTC → ReadTest и загрузим его в микроконтроллер
Ардуино — будильник
С помощью пульта можно будет программировать время и будильник, включать/отключать будильник и устанавливать отсрочку сигнала. То есть делать всё не вставая с дивана.
Так же будут рассмотрены варианты получения времени.
Что понадобится
• Ардуина
• Дисплей TM1637
• Два светодиода — красный и зелёный . Красный будет гореть когда включён будильник, а зелёный будет зажигаться при переключении в режим установки будильника.
• Пищалка (buzzer)
Можно не покупать, а выдрать откуда-либо.
• ИК-приёмник — наиболее предпочтительный вариант — TSOPxx38 (38kHz).
Во втором варианте потребуется модуль часов DS 3231.
В начале вариант для тех, кто хочет просто подключить/проверить дисплей.
Подключаем всё по следующей схеме:
Скачиваем и устанавливаем библиотеку для дисплея TM1637.
Если всё работает, то переходим к следующему этапу. Добавим к схеме светики, пищалку и ик-приёмник…
У Вас может быть другая распиновка ик-приёмника. Резисторы 300-1000 ом.
Сначала залейте скетч для обнуления EEPROM…
Теперь я (немного забегая вперёд) опишу алгоритм, а после перейдём к программированию пульта.
Инструкция и как работает
Установите время на часах. Нажмите кнопку перехода в режим будильника (загорится зелёный светик и на дисплее будет отображаться будильник) и установите нужное время. Нажмите кнопку включения будильника (загорится красный светик).
Чтоб вернуться в режим часов нужно снова нажать ту же кнопку. Если не возвращаться в режим часов, то через минуту это произойдёт автоматически.
Сигнал будильника будет воспроизводиться в течении минуты, после этого будет десятиминутная пауза и снова сигнал в течении минуты. Так будет происходить до тех пор, пока будильник не будет выключен. Если во время воспроизведения сигнала нажать кнопку отсрочки, то звук выключится, а время будильника переведётся на десять минут вперёд.
То есть в момент пробуждения у вас будет два варианта — нажать кнопку отключения будильника и вылезать из тряпок, либо нажать кнопку отсрочки и поваляться ещё 10 минут.
После нажатия кнопки отключения будильника установленное время вернётся к изначальному значению. То есть, вы встаёте в 7:00 утра, будильник зазвенел, вы нажали отсрочку, будильник перевёлся на 7:10, зазвенел, вы таки встали, отключили будильник — будильник вернулся на 7:00.
В момент нажатия отсрочки появляется индикация будильника.
Время будильника, его состояние (включён/отключён) и уровень яркости дисплея сохраняются в энергонезависимой памяти.
Нажатия на кнопки сопровождаются звуковым сигналом.
Программирование пульта
Возьмите какой-нибудь пульт, например от телевизора, выберите на нём несколько кнопок (у большинства пультов есть незадействованные кнопки), которыми будете управлять часами/будильником.
Нужно выбрать кнопки, которыми вы будете устанавливать время на часах (прибавлять/убавлять часы и минуты, четыре кнопки). Кнопки для установки будильника — прибавлять/убавлять часы и минуты будильника (четыре кнопки). Кнопка включения/отключения будильника (одна кнопка). Кнопка отсрочки будильника на 10 минут (одна кнопка) и кнопка перехода в режим установки будильника (одна кнопка). Кнопки для регулировки яркости (две штуки).
Заполучим коды кнопок. Откройте «Монитор последовательного порта», и нажмите на пульте кнопку, которой планируете устанавливать время — прибавлять часы:
Нажатия должны быть короткими. Иногда печатаются сразу два числа, первое число это код кнопки (то, что нам нужно), а второе это код повтора (он нам не интересен).
Скопируйте это число и вставьте в скетч:
Повторяем процедуру для кнопки убавления часов:
Вставляем в скетч:
Проделываем всё то же самое для остальных кнопок. В скетче есть комментарии.
И в конце комментируем или удаляем строку…
Заливаем скетч, и в принципе можно пользоваться. Однако такой способ подсчёта времени не выдерживает никакой критики, поэтому предложу пару вариантов. Первый — это использование модуля DS3231 (очень точный и стабильный), а второй — это ежесуточная коррекция времени от большого компьютера. Начну с последнего.
Сразу же скажу, что второй вариант подходит тем, у кого есть компьютер с линуксом или роутер с альтернативной прошивкой.
Синхронизация от компьютера
Идея заключается в следующем, часы подключены (USB, UART) к компьютеру с запущенной на нём программой, которая «слушает» USB-порт в ожидании запроса от часов. Ровно в 00:00:10 часы отправляют запрос компьютеру, а тот в ответ отсылает часам своё системное время.
Добавим в скетч необходимый функционал. Там где счётчик времени добавим блок отвечающий за запрос…
И в конец основного цикла добавим блок отвечающий за приём:
Не забудьте про коды кнопок пульта.
Далее скачиваем программу chasikom, кладём её в домашнюю папку, подключаем часы к компу и запускаем:
У вас будет свой юзер и возможно другое устройство (/dev/ttyUSB0). Проверить можно так:
Через десять секунд установится точное время.
Если нужна прога для какого-либо роутера, тогда напишите в комментах.
Вариант с DS3231
Добавляем в схему модуль:
Скачиваем и устанавливаем библиотеку DS3231, заливаем новый скетч:
Не забывайте про коды кнопок пульта.
Библиотека для DS3231 написана так, что если отсоединить модуль, то программа зависнет в ожидании ответа от модуля.
Теперь возьмите пульт, выставите время (в этом скетче нет коррекции от большого компьютера) и передёрните ардуине питание. Если всё работает правильно, то на часах будет текущее время.
Ну и наконец скетч для работы с модулем часов и коррекцией времени:
На этом пожалуй всё.
Вступайте в Telegram-группу Arduino
Скетч для Arduino
Проверка часов реального времени
Первый скетч, который стоит запустить — это программа, которая будет считывать данные с модуля часов реального времени раз в секунду.
Для начала давайте посмотрим, что произойдет, если мы извлечем батарейку и заменим ее на другую, пока Arduino не подключен к USB. Подождите 3 секунды и извлеките батарейку. В результате чип на часах реального времени перезагрузится. После этого вставьте код, который приведен ниже (код также можно выгрузить в меню Examples→RTClib→ds1307 в Arduino IDE) и загрузите его на Arduino.
Вам также понадобится библиотека OneWire.h, скачть ее можно здесь
// функции даты и времени с использованием часов реального времени DS1307, подключенные по I2C. В скетче используется библиотека Wire lib