Предлагаемые Вашему вниманию часы являются, по сути, побочным продуктом изучения свойств и повадок популярного зверя по кличке ESP8266. Думаю, любой человек, знакомящийся с каким-либо микропроцессором, рано или поздно реализует на нем свою версию часов.
Единственно, что отличает мои часы – у них нет кнопок. Вообще. Они просто показывают точное время.
— И все же, где же у него кнопка? © Приключения Электроника.
Описание ниже — это что-то вроде записок натуралиста, надеюсь, интересующиеся этой системой на кристалле, найдут для себя что-то интересное.
Для экспериментов, я выбрал самый малоножечный вариант платы, а именно ESP-01. Это чуть более дешевая чем другие, но главное, единственная “нативная” (то есть не обремененная переходником, от предприимчивой третьей стороны) плата к которой можно подключиться без пайки. Справедливости ради надо сказать, что из-за двухрядности выводов эту плату нельзя воткнуть непосредственно в бредборду, так что приходиться использовать проводочки.
Из восьми выводов платы только два являются портами ввода вывода. В момент старта МК в работу на обоих портах должна присутствовать логическая единица. Процессы включения, прошивки и подключения к WiFi подробно описаны на профильном одноименном русскоязычном сайте. Лишь поделюсь опытом, что не стоит использовать один pull-up резистор для нескольких выводов, иначе возникают непредсказуемые эффекты.
Необходимость наличия высокого уровня на портах в момент старта устройства приводит к тому, привычный ключ на n-p-n транзисторе во время инициализации МК (сброс / включение) открыт током, протекающим через pull-up резистор, что может оказаться неприемлемым для некоторых применений.
Эту проблему можно разрешить, если использовать ключ на p-n-p транзисторе:
Здесь транзистор открывается низким уровнем, соответственно в момент старта нагрузка обесточена.
Заметим, что ключ (и тот и другой) является инвертором входного сигнала: когда на выходе МК ноль, коллекторе транзистора единица и наоборот.
Я использовал прошивку NodeMcu, и считаю, что не прогадал, так как использовать язык Lua для того, что бы “пощупать” МК оказалось удобно и приятно. Да и сам язык оказался оригинальным и симпатичным.
Для доступа к RTC микроконтроллера (если так можно назвать 31-битный регистр инкрементируемый кварцем платы) в Lua используются фукции tmr.time() и tmr.now(). Что возвращает функция tmr.time() понять так и не удалось. А вот функция tmr.now(), возвращает количество микросекунд прошедших с момента перезагрузки микропроцессора. Приблизительно, раз в 35 минут (2^31 микросекунд) счетчик переполняется, поэтому непосредственно использовать этот регистр для отсчета времени нельзя. Однако отслеживая моменты переполнения, можно рассчитывать реальное время. Этим занимается скрипт “v2_utime.lua” порождающий замыкание, которое можно использовать для получения времени. Для того чтобы не потерять ход часов, достаточно обращаться к замыканию за текущим временем не реже чем раз в 35 минут.
Опыты показали, что ошибка внутреннего счетчика составляет единицы секунд в сутки, что является весьма приличным результатом.
Для получения реального текущего времени используется скрипт “v2_ntp.lua”, который формирует UDP запрос к NTP-серверу и извлекает время из полученного ответа. Я встречал и альтернативное решение — обращение к какому-либо проверенному http-серверу с целью получения текущего времени из заголовка полученного ответа.
Обращение к серверу NTP производится первый раз после перезагрузки контроллера, а затем каждые 15 минут. Полученное время корректируется на заданное количество часов сообразно указанному часовому поясу.
Все настроечные переменные можно найти и откорректировать в скрипте “v2_config.lua”. Для редактирования и загрузки Lua-скриптов удобно использовать программу ESPlorer.
Отображение текущего времени производится четырьмя 7-сегментными индикаторами. Всего пара доступных портов ввода вывода и некоторая медлительность Lua-скриптов не позволяет использовать динамическую индикацию. Поэтому, для получения достаточного количества управляющих сигналов используется четыре микросхемы 74HC595 – восьмиразрядные сдвиговые регистры. Работа с регистрами производится тремя сигналами: DS — определяет записываемый бит, SH_CP — запись бита (по фронту) и ST_CP — сигнал передачи записанных данных на выходы (тоже по фронту). Для передачи данных в сдвиговый регистр используется порт GPIO2. Порт GPIO0 формирует ST_CP, и через уже описанный инвертор SH_CP. Такое включение приводит в “смаргиванию” индикации при смене значений, что будем считать не багой, а милой фичей. Наличие смаргивания — одна из главных причин отсутствия индикации секунд в этих часах. Уверен, желающие без труда добавят секунды и избавятся от смаргивания использовав еще один порт более продвинутой платы для формирования сигнала ST_CP.
Помимо увеличения количества выводов микросхемы 74HC595 выполняют роль драйверов сегментов LED индикаторов, 35mA допустимой нагрузки на выход вполне достаточно для этого, даже при использовании больших индикаторов.
Сегменты больших индикаторов составляются из нескольких, включенных последовательно, светодиодов. Для их включения необходимо напряжение больше 3.3V используемого для микроконтроллера и микросхем логики. Так, для трех-диодных индикаторов красного цвета необходимо напряжение порядка 5.5V для четырех-диодных уже около 7V. Поэтому используются два источника напряжения: 3.3V для питания микроконтроллера и логики и отдельный источник для индикаторов. Я использовал регулируемый, компактный модуль dc-dc конвертер “mini-360”.
Использование dc-dc позволяет использовать практически произвольный не стабилизированный источник напряжения. Например, я использую, 12ти-вольтовый блок питания от старого радиотелефона. Потребляемый ток при использовании 12-вольтового источника не превышает 200mA. Регулировкой напряжения достигается комфортная яркость свечения индикаторов.
Используются индикаторы с общим анодом на который подается питание от dc-dc модуля. Включение сегмента осуществляется подачей земли на соответствующий катод. Идея в том, что пока на выходе регистра логическая единица (то есть 3.3V так как на регистр подается это напряжение) разности потенциалов анод-катод на сегментах индикатора недостаточно для открытия светодиодов. Когда же на выходе ноль – сегмент загорается.
Общая схема устройства, несмотря на кажущуюся громоздкость достаточно проста.
Здесь: U1 – источник напряжения индикаторов, стоящий за ним линейный стабилизатор U2 формирует 3.3V для питания модуля ESP8266 и регистров. Резисторы R7, R8, R17 подтягивают выводы контроллера к питанию для корректного запуска. Резисторы R10,R18,R16 служат для подключения контроллера к пятивольтовому конвертору USB-UART. Транзистор Q1 — ключ инфракрасного светодиода D4 и заодно инвертор сигнала GPIO0. Инфракрасный светодиод – на перспективу, в данной конструкции не используется и его можно заменить резистором 3k. Теперь про диоды D1-D4, D6-D9 — они нужны для обеспечения падения на точках индикатора. Дело в том, что в точках индикаторов используется один светодиод в отличие от сегментов, в которых их несколько.
Сегменты минут перевернуты, что позволяет использовать точки как разделители часов и минут.
Часы собраны на двусторонней печатной плате, одну сторону которой занимают исключительно индикаторы.
Плата разведена под два типоразмера индикаторов, имеющих одинаковую распиновку.
Вот так выглядит плата с большими индикаторами в сборе.
И наконец, для тех, кто дочитал до этого места – вишенка на торте!
В преддверии Нового Года часы, помимо текущего времени, показывают еще и количество часов до этого радостного события. Количество часов до нового года показываются с 5-той по 11-тую секунду каждой минуты. Почему с 5-той по 11-тую? Потому, что так написан Lua-скрипт и любой желающий может изменить это поведение на любое другое по своему усмотрению. Для этого понадобится только текстовый редактор и в этом я вижу особое достоинство прошивки NodeMcu.
А с 23:00 31 декабря запустится посекундный обратный отсчет!
Кстати, вполне реально успеть собрать часы до НГ, хотя бы и на бредборде (здесь для ESP-01 используется переходничок, но это не обязательно).
Схема и печатная плата в формате DipTrace, Lua-скрипты
Единственно, что отличает мои часы – у них нет кнопок. Вообще. Они просто показывают точное время.
— И все же, где же у него кнопка? © Приключения Электроника.
Описание ниже — это что-то вроде записок натуралиста, надеюсь, интересующиеся этой системой на кристалле, найдут для себя что-то интересное.
Для экспериментов, я выбрал самый малоножечный вариант платы, а именно ESP-01. Это чуть более дешевая чем другие, но главное, единственная “нативная” (то есть не обремененная переходником, от предприимчивой третьей стороны) плата к которой можно подключиться без пайки. Справедливости ради надо сказать, что из-за двухрядности выводов эту плату нельзя воткнуть непосредственно в бредборду, так что приходиться использовать проводочки.
Из восьми выводов платы только два являются портами ввода вывода. В момент старта МК в работу на обоих портах должна присутствовать логическая единица. Процессы включения, прошивки и подключения к WiFi подробно описаны на профильном одноименном русскоязычном сайте. Лишь поделюсь опытом, что не стоит использовать один pull-up резистор для нескольких выводов, иначе возникают непредсказуемые эффекты.
Необходимость наличия высокого уровня на портах в момент старта устройства приводит к тому, привычный ключ на n-p-n транзисторе во время инициализации МК (сброс / включение) открыт током, протекающим через pull-up резистор, что может оказаться неприемлемым для некоторых применений.
Эту проблему можно разрешить, если использовать ключ на p-n-p транзисторе:
Здесь транзистор открывается низким уровнем, соответственно в момент старта нагрузка обесточена.
Заметим, что ключ (и тот и другой) является инвертором входного сигнала: когда на выходе МК ноль, коллекторе транзистора единица и наоборот.
Я использовал прошивку NodeMcu, и считаю, что не прогадал, так как использовать язык Lua для того, что бы “пощупать” МК оказалось удобно и приятно. Да и сам язык оказался оригинальным и симпатичным.
Для доступа к RTC микроконтроллера (если так можно назвать 31-битный регистр инкрементируемый кварцем платы) в Lua используются фукции tmr.time() и tmr.now(). Что возвращает функция tmr.time() понять так и не удалось. А вот функция tmr.now(), возвращает количество микросекунд прошедших с момента перезагрузки микропроцессора. Приблизительно, раз в 35 минут (2^31 микросекунд) счетчик переполняется, поэтому непосредственно использовать этот регистр для отсчета времени нельзя. Однако отслеживая моменты переполнения, можно рассчитывать реальное время. Этим занимается скрипт “v2_utime.lua” порождающий замыкание, которое можно использовать для получения времени. Для того чтобы не потерять ход часов, достаточно обращаться к замыканию за текущим временем не реже чем раз в 35 минут.
Опыты показали, что ошибка внутреннего счетчика составляет единицы секунд в сутки, что является весьма приличным результатом.
Для получения реального текущего времени используется скрипт “v2_ntp.lua”, который формирует UDP запрос к NTP-серверу и извлекает время из полученного ответа. Я встречал и альтернативное решение — обращение к какому-либо проверенному http-серверу с целью получения текущего времени из заголовка полученного ответа.
Обращение к серверу NTP производится первый раз после перезагрузки контроллера, а затем каждые 15 минут. Полученное время корректируется на заданное количество часов сообразно указанному часовому поясу.
Все настроечные переменные можно найти и откорректировать в скрипте “v2_config.lua”. Для редактирования и загрузки Lua-скриптов удобно использовать программу ESPlorer.
Отображение текущего времени производится четырьмя 7-сегментными индикаторами. Всего пара доступных портов ввода вывода и некоторая медлительность Lua-скриптов не позволяет использовать динамическую индикацию. Поэтому, для получения достаточного количества управляющих сигналов используется четыре микросхемы 74HC595 – восьмиразрядные сдвиговые регистры. Работа с регистрами производится тремя сигналами: DS — определяет записываемый бит, SH_CP — запись бита (по фронту) и ST_CP — сигнал передачи записанных данных на выходы (тоже по фронту). Для передачи данных в сдвиговый регистр используется порт GPIO2. Порт GPIO0 формирует ST_CP, и через уже описанный инвертор SH_CP. Такое включение приводит в “смаргиванию” индикации при смене значений, что будем считать не багой, а милой фичей. Наличие смаргивания — одна из главных причин отсутствия индикации секунд в этих часах. Уверен, желающие без труда добавят секунды и избавятся от смаргивания использовав еще один порт более продвинутой платы для формирования сигнала ST_CP.
Помимо увеличения количества выводов микросхемы 74HC595 выполняют роль драйверов сегментов LED индикаторов, 35mA допустимой нагрузки на выход вполне достаточно для этого, даже при использовании больших индикаторов.
Сегменты больших индикаторов составляются из нескольких, включенных последовательно, светодиодов. Для их включения необходимо напряжение больше 3.3V используемого для микроконтроллера и микросхем логики. Так, для трех-диодных индикаторов красного цвета необходимо напряжение порядка 5.5V для четырех-диодных уже около 7V. Поэтому используются два источника напряжения: 3.3V для питания микроконтроллера и логики и отдельный источник для индикаторов. Я использовал регулируемый, компактный модуль dc-dc конвертер “mini-360”.
Использование dc-dc позволяет использовать практически произвольный не стабилизированный источник напряжения. Например, я использую, 12ти-вольтовый блок питания от старого радиотелефона. Потребляемый ток при использовании 12-вольтового источника не превышает 200mA. Регулировкой напряжения достигается комфортная яркость свечения индикаторов.
Используются индикаторы с общим анодом на который подается питание от dc-dc модуля. Включение сегмента осуществляется подачей земли на соответствующий катод. Идея в том, что пока на выходе регистра логическая единица (то есть 3.3V так как на регистр подается это напряжение) разности потенциалов анод-катод на сегментах индикатора недостаточно для открытия светодиодов. Когда же на выходе ноль – сегмент загорается.
Общая схема устройства, несмотря на кажущуюся громоздкость достаточно проста.
Здесь: U1 – источник напряжения индикаторов, стоящий за ним линейный стабилизатор U2 формирует 3.3V для питания модуля ESP8266 и регистров. Резисторы R7, R8, R17 подтягивают выводы контроллера к питанию для корректного запуска. Резисторы R10,R18,R16 служат для подключения контроллера к пятивольтовому конвертору USB-UART. Транзистор Q1 — ключ инфракрасного светодиода D4 и заодно инвертор сигнала GPIO0. Инфракрасный светодиод – на перспективу, в данной конструкции не используется и его можно заменить резистором 3k. Теперь про диоды D1-D4, D6-D9 — они нужны для обеспечения падения на точках индикатора. Дело в том, что в точках индикаторов используется один светодиод в отличие от сегментов, в которых их несколько.
Сегменты минут перевернуты, что позволяет использовать точки как разделители часов и минут.
Часы собраны на двусторонней печатной плате, одну сторону которой занимают исключительно индикаторы.
Плата разведена под два типоразмера индикаторов, имеющих одинаковую распиновку.
Вот так выглядит плата с большими индикаторами в сборе.
И наконец, для тех, кто дочитал до этого места – вишенка на торте!
В преддверии Нового Года часы, помимо текущего времени, показывают еще и количество часов до этого радостного события. Количество часов до нового года показываются с 5-той по 11-тую секунду каждой минуты. Почему с 5-той по 11-тую? Потому, что так написан Lua-скрипт и любой желающий может изменить это поведение на любое другое по своему усмотрению. Для этого понадобится только текстовый редактор и в этом я вижу особое достоинство прошивки NodeMcu.
А с 23:00 31 декабря запустится посекундный обратный отсчет!
Кстати, вполне реально успеть собрать часы до НГ, хотя бы и на бредборде (здесь для ESP-01 используется переходничок, но это не обязательно).
Схема и печатная плата в формате DipTrace, Lua-скрипты