[Перевод] Разработка ведущих часов для Pragotron PJ 27 базе ESP32 с синхронизацией времени по NTP

Мне удалось раздобыть старые ведомые часы, которые, если судить по их серийному номеру, выпущены в 1960-х годах. Это — Pragotron PJ 27, версия на 12В. Они были сделаны в Чехословакии, в них используется механизм PS-1.

0ca6d9a1a1843a6d79988c29759f126d.jpg


Ведомые часы

Такие часы обычно применялись в организациях, где использовалась система единого времени. Например — в школах, на заводах и в других подобных местах. Изначально работу таких часов обеспечивали большие механические ведущие часы. Позже механические часы заменили на электронные.

fd3d2a319249fc86b9bf64ed3779c199.jpg


Ведущие часы

Часовой механизм ведомых часов устроен очень просто. Он управляется разнополярными минутными импульсами. Существуют, помимо версий на 12В, версии этих часов на 6, 24 и 60В.

Я решил дать Pragotron PJ 27 вторую жизнь.

Аппаратная часть проекта


Я почистил старые часы и проверил их, используя источник питания на 12В. Они, как оказалось, всё ещё работоспособны. У меня нет ведущих часов, которые могли бы управлять Pragotron PJ 27, поэтому я решил сделать такие часы сам. У меня уже был контроллер ESP32 с OLED-дисплеем, он выглядел подходящим для нового проекта. Кроме того, я нашёл блок питания, подключаемый к электросети и выдающий 12В, который раньше использовался в одном из моих экспериментов.

Для того чтобы генерировать разнополярные 12В-импульсы, я решил приобрести двухканальный модуль L298N DC Motor Driver. Я подумал, что он будет надёжнее, чем набор реле. Управлять его выходами можно, пользуясь TTL-входами, а сам этот модуль стоит очень недорого (пару долларов). Кроме того, в нём есть конвертер 12В-5В, поэтому с него можно подавать питание на контроллер ESP32. При этом для подачи сигналов на часы используется лишь один канал L298N, поэтому ещё один можно использовать для управления чем-то вроде будильника, или для организации работы ещё одних ведомых часов, показывающих время в другом часовом поясе.

Собрать всё то, что у меня было, оказалось очень просто. 12В подключается напрямую к L298N. 5В-выход L298N и контакт GND подключаются, соответственно, к контактам 5В и GND контроллера ESP32. Контакты IN1 и IN2 L298N подключаются к GPIO-пинам 12 и 13 ESP32. Часы подключаются к выходу OUT1 L298N, выводы которого предназначены для подачи питания на двигатель.

Программная часть проекта


В ESP32 нет настоящего RTC-модуля, поэтому я решил получать сведения о точном времени по протоколу NTP, подключив ESP32 к сети по Wi-Fi. Это избавило меня от необходимости использовать отдельный RTC-модуль с батарейкой. Данные о состоянии ведомых часов я решил хранить во флеш-памяти ESP32. Программу для контроллера я написал, пользуясь Arduino IDE. Вот некоторые из её возможностей:

  • При загрузке осуществляется подключение к Wi-Fi-сети, после чего устройство получает сведения о текущем времени по NTP. После первоначальной синхронизации данные о времени обновляются, опять же, по NTP, каждые 5 минут.
  • Поддержка разных часовых поясов реализована на базе Timezone.
  • Текущее время, данные о ведомых часах, сведения о NTP-синхронизации выводятся на OLED-дисплее.
  • Существует особый «режим инициализации», который включается в том случае, если взяться за сенсорный контакт GPIO15 и перезагрузить ESP32. В этом режиме импульсы, управляющие ведомыми часами, генерируются каждую секунду. Когда стрелки часов будут установлены на 12:00, контакт нужно отпустить. Этот режим удобно использовать для первоначальной настройки часов или для их тестирования.
  • Сведения о состоянии системы каждую минуту сохраняются во флеш-памяти ESP32 с использованием библиотеки Preferences. Данные хранятся в NVS-разделе флеш-памяти. Он поддерживает постоянное энергонезависимое хранение данных. Для обеспечения долгосрочной работы памяти используются возможности API Wear Levelling. Я, чтобы было удобнее, установил размер этого раздела в 1 Мб.
  • Для того чтобы предотвратить деградацию OLED-дисплея, система устроена так, что дисплей, если устройство не трогать 10 минут, уходит в режим защиты экрана. Для вывода устройства из этого режима надо коснуться контакта GPIO15.


adcd7cd4da5d7232c990910f33a4c961.jpg


ESP32 с OLED-дисплеем

→ Код проекта можно найти здесь

Итоги


465be9d3d228f2687ae3253679b93fba.jpg


Готовый проект

Мне интересно было заниматься этим проектом, в котором NTP и Wi-Fi встретились с устройством, созданным в 1960-е годы. Я, к тому же, смог найти корпус от старого реле и приспособил его под контроллер, играющий роль ведущих часов для Pragotron PJ 27. Возможно, в будущем я подключу к этому контроллеру что-нибудь ещё.

А вы создавали какие-нибудь проекты на базе ESP32?

oug5kh6sjydt9llengsiebnp40w.png

3piw1j3wd_cgmzq9sefgferaumu.png

© Habrahabr.ru