Концепция проекта
Концепция этого изделия состоит в удовлетворении потребности смотреть на настоящее пламя. Тлеющий разряд в газе строго говоря не совсем пламя, хотя и похож на настоящее пламя.
Мне нравится его цвет и это было единственной побудительной причиной заняться созданием таких часов для себя в единственном экземпляре.
Задачи создать прибор для массового производства не ставилось.
Поэтому бюджет проекта заметно больше разумного. Решения принимались исходя из собственных представлений о красоте, стоимость комплектующих не учитывалась. Реально ограничения конечно есть всегда и, например, покупать большие ГРИ (газоразрядные индикаторы) типа ИН18 я не стал – цена их больше интуитивно определенной границы и они не вписывались в мою концепцию внешнего вида изделия. Я использовал ГРИ типа ИН-12.
ИН12 наполнены смесью неона (либо смесью инертных газов) и паров ртути. Пары ртути обеспечивают значительный рост долговечности прибора и придают синеватый оттенок свечению плазмы. Другие ГРИ могут не содержать ртути и давать чистое неоновое свечение.
Основная функция часов – показывать точное время (КЭП, привет!). Очень желательно, чтобы время при включении устанавливалось автоматически и не требовало никаких манипуляций от пользователя. С моей личной точки зрения кнопки на таких приборах не нужны совсем. Подобные приборы с десятком кнопок и сотнями функций, вызываемых разнообразными комбинациями нажатий и времен нажатий, вызывают у меня тихую грусть. Во-первых – ГРИ хорошо приспособлены для отображения только чисел. Ничего другого не предусмотрено и попытки отобразить пункты меню и пр. на мой взгляд – применение негодного инструмента. То же самое относится и к дополнительным функциям типа будильника и пр.
Во-вторых, очевидно, что запомнить какой комбинацией нажатий кнопок включается та или иная заложенная функция – нереально. Писать программы для таких устройств весело и приятно, но пользоваться потом невозможно.
Этот вопрос прекрасно рассмотрен в книге Donald A. Norman Дизайн привычных вещей. Процитирую один пассаж:
«Во время поездок я пользовался несколько раз диапроектором фирмы Leitz. Первый раз был самым кошмарным. Я начал читать лекцию и показал первый слайд. Когда нужно было перейти к следующему слайду, ответственный за показ студент осторожно нажал на кнопку и с ужасом начал наблюдать, как подставка поехала в обратную сторону, выскользнула из диапроектора и упала со стола на пол, перемешав все слайды. На то, чтобы расставить слайды по порядку, ушло 15 минут. В произошедшем был виноват не студент, а этот элегантный диапроектор. Как может одна кнопка выполнять две противоположные функции? Никто не смог бы сделать все правильно с первого раза.»
Проблема была в том, что одна кнопка выполняла две противоположные функции – короткое нажатие выполняло смену слайда вперед, длинное – назад.»
Продолжим обсуждение настройки часов. Такие устройства оптимально настраивать с их собственной веб страницы с использованием компьютера, планшета или смартфона.
Будильник для часов с ГРИ на мой взгляд не нужен – во-первых, рядом всегда есть сотовые с такими функциями и гораздо более удобным интерфейсом. Во-вторых – часы на ГРИ не могут использовать автономный источник питания поскольку типичная мощность потребления (200 Вольт * 7 мА = 1400 мВт или 1.4 ватта) довольно велика и выходит за разумные пределы для химических источников тока. Следовательно, часы с ГРИ будут питаться от сети, и функция будильника окажется зависимой от надежности сети.
Из вышеприведенных рассуждений вырисовывается следующая система:
Часы на ГРИ с питанием от сети, имеющие возможность брать точное время из интернета, с настройкой с собственной веб страницы. Никакие дополнительные возможности не требуются.
Строгость этого правила я тем не менее нарушил, добавив следующие возможности:
Часы могут показать уличную температуру, влажность и давление атмосферы. Эта функция реализует мою личную потребность в знании наружной температуры, когда я утром собираюсь на работу. Я застегиваю рубашку каждый день в одном и том же месте и когда часы обнаруживают меня там – показывают последовательно наружную температуру, влажность и давление воздуха в миллиметрах ртутного столба. Функция оказалась удачной и весьма востребована как мной, так и членами моей семьи. Данные об уличной температуре, давлении и влажности принимаются автоматически и запоминаются на время между посылками от внешнего источника. При превышении таймаута (данные устарели) часы показывают текущую дату. В моей домашней системе данные о параметрах внешней среды поступают с интервалом 10 минут, таймаут «данные устарели» установлен на 30 минут. При проектировании часов предполагалось, что внешнюю команду можно будет отдать голосом, например, сказать: «Часы, погода!». Однако при макетировании оказалось, что этот способ ненадежен и неудобен. Поэтому в дальнейшем голосовое управление было заменено на метод определения присутствия человека перед часами по данным времяпролетного лазерного локатора. Часы должны показать данные погоды, если перед ними постоять примерно секунду.
Часы по внешней команде через HTTP интерфейс могут отобразить полученные в этой команде данные. В команде передаются как сами данные, так и время их демонстрации на дисплее. Задумывалась как возможность отображать нечто от компа по событиям, например, перегрев процессора домашнего сервера или еще какие-нибудь параметры. Заложенный интерфейс позволяет вывести семизначный код извне, включая две точки. На практике не применяется совсем.
Обязательные требования включили в себя также эффект плавной смены цифр. Именно этот эффект, единственный из всех, мне очень нравится!
Яркость свечения индикаторов должна подстраиваться под внешнюю освещенность, сохраняя неизменным контраст изображения.
Часы должны отображать шесть цифр и одно вспомогательное значение перед цифрами для индикации, что именно отображается в текущий момент.
Реализация задуманного, аппаратное решение
Выбор ГРИ
Для отображения времени и др. данных применены четыре ГРИ ИН-12А, две ИН-12Б и одна ИН-15А.
ИН-12Б содержат точки, которые я использовал для разделения часов-минут-секунд.
ГРИ ИН-15А может показывать ряд спецзнаков “+”, “-“, “%”, “P” и др., размещен в начале строки.
Оптимальное расстояние между индикаторами.
Чтобы часы смотрелись гармонично, следует обеспечить определенное расстояние между индикаторами, как между буквами в строке. Изучение вопроса дало следующую информацию: оптимальное расстояние между цифрами 4 мм, между словами 8 мм. Оптимальное расстояние между цифрами обеспечивается при плотном прилегании индикаторов в панельках. Полагаю, это не случайно, советские инженеры думали головой при разработке и сделали правильное расстояние.
Синхронизация с серверами точного времени
Рассмотрим способы автоматического получения точного времени:
- Запрос по интернету на сервер точного времени.
- Глонасс\GPS приемник. К сожалению, в ряде случаев не работает: например, в моей квартире в глубине комнаты сигнал от спутников пропадает, сказывается неудачная конфигурация окружающих строений, в которой чистое небо видно только непосредственно у окна.
- Сотовая сеть. В теории можно запросить время у сотовой станции без регистрации (т.е. без симкарты). Я не пробовал. Теоретически наиболее универсальный способ, не требующий ничего от пользователя.
- Сигналы точного времени на длинноволновых диапазонах. Сложен для применения, нет портативных готовых решений.
На мой взгляд, оптимальным является способ запроса точного времени через интернет. Надо отметить, что встроенные функции хранения текущего времени у ESP8266 оказались достаточно точны: за месяц случайного отключения точки доступа в сеть, через которую связывались с интернетом в том числе и описываемые часы, уход составил менее минуты. Я определил это по совпадению показаний часов и времени компьютера. После восстановления питания точки доступа время синхронизировалось автоматически.
Выбор процессора и микросхем управления ГРИ
Для управления часами требуется процессор с возможностью выхода в инет. Из доступных – это платы на основе ESP8266. Изучение вопроса показало, что плата дешева, распространена, имеет богатое готовое программное обеспечение, созданное энтузиастами, может программироваться в среде Ардуино.
Выбор системы (микросхем) управления ГРИ
ГРИ питаются от достаточно высокого напряжения около 200 вольт. По паспорту (см рис 1) ИН12 требуется не менее 170 вольт для нормального возникновения тлеющего разряда при токе до 2 мА. Система управления должна быть способна коммутировать ток в несколько миллиампер и выдерживать напряжения в районе 200 вольт. В Советском Союзе выпускались микросхемы К155ИД1 (133ИД1 и т.п.) (высоковольтный двоично-десятичный дешифратор). Они прекрасно работали в статическом режиме, на одну лампу требовался 1 дешифратор. Сейчас эти микросхемы доступны из старых запасов и даже выпускаются малыми партиями минским заводом Интеграл. В принципе – неплохой выбор для часов на микросхемах-счетчиках. Однако их сложно использовать в системе на микропроцессоре из-за ограниченности количества выводов у микропроцессоров. Так, у принятого за основу часов ESP8266 всего с десяток выводов, при этом часть имеет определенные ограничения. Для 7 дешифраторов требуется 28 выводов, либо промежуточный регистр, в который надо последовательно выводить данные и затем выдавать параллельно на К155ИД1, что резко усложняет схему.
![](https://habrastorage.org/webt/99/81/ve/9981vejezvjuviohr0l_8xauc_8.gif)
Рис 1. Паспорт индикатора тлеющего разряда ИН-12
![](https://habrastorage.org/webt/ij/w7/dv/ijw7dvvzivci68gogd0tcyjigfe.jpeg)
Рис 2. Паспорт индикатора тлеющего разряда ИН-15
При использовании 155ИД1 эффект плавной смены цифр требует динамической индикации. Дело в том, что ГРИ – резко нелинейный прибор и управлять его яркостью аналоговым способом изменением напряжения – очень сложно из-за высокой крутизны характеристики ток – приложенное напряжение. В области малых яркостей газовый разряд становится неустойчивым. Также на устойчивое включение лампы влияет внешняя освещенность – при уменьшении внешней освещенности возрастает как напряжение пробоя, так и время включения индикатора. Внешние фотоны служат своеобразной зажигалкой, инициаторами разряда. Кстати сказать, высокая крутизна зависимости тока через газоразрядный прибор от приложенного напряжения используется для получения стабильного напряжения, фактически такой газоразрядный прибор является стабилизатором напряжения. Поэтому для управления яркостью ГРИ требуется применение импульсного режима питания, в котором яркость пропорциональна среднему току через ГРИ, который в свою очередь пропорционален ширине имульса.
Динамическая индикация при использовании 155ИД1 + ГРИ вполне возможна, но имеет ряд ограничений. Так, из-за особенности схемотехники 155ИД1 (относительно низковольтные ключевые элементы – всего 60 вольт), возможны засветы соседних цифр и другие нежелательные эффекты. С этими эффектами борются разнообразными ухищрениями – как аппаратными, так и программными. На сайте RADIOKOT.RU есть огромная тема (https://radiokot.ru/forum/viewtopic.php?f=3&t=3210), посвященная NIXIE CLOCK, я прочел ее всю и сделал для себя выводы – динамическая индикация непригодна для моих целей.
Поиск по интернету дал отличный заменитель 155ИД1 – это микросхема HV5622, представляющая 32-х битный сдвиговый регистр с высоковольтными выходами. Структурная схема показана на рис 3.
![](https://habrastorage.org/webt/rb/nu/xc/rbnuxc9pdbdqrtxg5epadxwbtg8.png)
Рис 3. Структурная схема HV5622, Supertex inc. ©
HV5622 способна коммутировать напряжения до 230 вольт, принимать данные по последовательному интерфейсу с тактовой частотой до 8 МГц. Микросхемы можно включать последовательно в цепочку. Для управления потребуется всего 4 вывода от МК: данные, тактовый сигнал, сигнал записи в выходной регистр и сигнал включения. Единственное, что вызывало некоторые сомнения – питающее напряжения. По мануалу оно должно быть не менее 8 вольт. А мне хотелось бы питать микросхемы от 5 вольт, да еще управлять ими логическим сигналом с уровнем 3.3в. В инете я нашел пару примеров использования таких микросхем и питания их от 5 вольт. Поэтому при разработке я на всякий случай предусмотрел возможность установить преобразователь логических уровней и питания 5622 более высоким напряжением, но устанавливать эти узлы сразу не стал. Практика показала, что и так все отлично работает от 5 вольт.
Питание часов
Для питания часов на ГРИ требуется источник питания с двумя выходами: на 5 вольт с током в районе полуампера и на 180-200 вольт с током около 10 мА. Стандартно авторы схем подобных часов решают вопрос питания так: используется внешний импульсный блок питания 220 ->12 вольт, из которых внутри часов делается 5 вольт, а 180 вольт для питания ГРИ получаются вторым импульсным преобразователем из входных 12в. Т.е. по сути в общей цепи питания используется 2 импульсных преобразователя, первый из которых делает 220 – 12, а второй 12 – 180. На мой взгляд – неэффективно. Поэтому я выбрал очень традиционный путь использования готового тороидального трансформатора TorAN15. Внешний вид этого трансформатора представлен на рис 4.
![](https://habrastorage.org/webt/1e/uv/f_/1euvf_52xjsdpo-m64pa5dgxqwy.jpeg)
Рис 4. Трансформатор TorAN15
Я купил этот трансформатор на сайте ISTOK2.COM. У трансформатора есть две вторичные обмотки – одна на 170 вольт, вторая на 6.3 в. Это дало возможность обойтись простейшей схемой источника питания. Высокое для питания ГРИ выпрямляется диодным мостом и фильтруется на конденсаторах. Эти детали использованы из ненужной люминесцентной лампы-сберегайки. Низкое для питания микросхем также выпрямляется диодным мостом, фильтруется на электролитическом конденсаторе и стабилизируется на интегральном стабилизаторе 7805. КПД такой схемы существенно выше системы с двумя преобразованиями, надежность системы гораздо выше. Плюс полное отсутствие высокочастотных помех. Минус – немодно и трансформатор тяжелый. Но тяжесть трансформатора в данном случае скорее плюс – мне хотелось, чтобы часы были брутально массивными.
Итак, схема часов определена: это готовый модуль на базе ESP12E, три микросхемы HV5622, датчик освещенности на базе MAX44009 и традиционный (я бы даже сказал консервативный) блок питания. В дальнейшем был добавлен узел определения человека перед часами на базе времяпролетного дальномерного лазерного модуля VL53L0X. Принципиальная электрическая схема часов приведена на рис 5.
![](https://habrastorage.org/webt/uo/n7/oy/uon7oyahasvsbxnkajvzm-bz0oi.jpeg)
Рис 5. Dronsky Nixie clock. Схема электрическая принципиальная
Я разделил коммутацию выводов так: первые три лампы – первая HV5622, вторые три лампы – вторая HV5622, оставшаяся HV5622 управляет лампой со спецсимволами и точками в двух ИН12Б.
На этапе проектирования было неясно, хватит ли быстродействия канала SPI для вывода данных для плавной смены цифр. То, что раз в секунду вывести 96 бит не составит труда для ESP12E – сомнений не вызывало. А вот хватит ли быстродействия для вывода эффектов? По расчетам должно хватить с запасом. Но как известно, гладко было на бумаге…
Поэтому поначалу был запланирован вывод данных в три этапа, в каждую микросхему отдельно. Практическая проверка показала, что быстродействия канала SPI хватает с огромным запасом на эффекты даже при тактовой 4 МГЦ. Даже возможность повысить быстродействие вдвое оказалась невостребованной. В результате все микросхемы соединены в цепочку и вывод 96 бит производится одной командой. По расчетам время вывода 96 бит должно составить 24 мкс. На рис 6 представлена запись логического анализатора вывода семи знаков на ГРИ. Суммарное время вывода, с учетом генерации сигнала LE, составляет менее 30 мкС.
![](https://habrastorage.org/webt/my/iw/-m/myiw-mjjwbqh8sghcw2no7obnzo.png)
Рис 6. Запись логического анализатора вывода 96 бит каналом HSPI c тактовой частотой 4 МГц
Выводы CLOCK всех микросхем объединены. Вывод DI (Data Input) второй и третьей микросхемы присоединены к выводам DO (Data Out) первой и второй микросхемы соответственно. Выводы LE (Latch enable) объединены, на них подается импульс, переносящий данные из сдвигового в выходной регистр. До момента переноса лампы выводят то, что запомнено в выходном регистре. Выводы BLOCK объединены, присоединены к земле через резистор 1к, чтобы удерживать выходные каскады HV5622 в выключенном состоянии до запуска программы в МК. Мануал рекомендует подать питание, сделать первый вывод данных и затем включить выходные каскады.
Управление яркостью
Для управления яркостью ГРИ с целью поддержания постоянного оптимального контраста индикаторов используется вывод BLOCK, на который подается ШИМ сигнал частотой 2500 Гц. Использована достаточно высокая частота ШИМ сигнала управления, что гарантировало отсутствие эффектов стробоскопа и др. В соответствии с нормами (СНиП (Строительные Нормы и Правила) 23 — 05 — 2010 (актуализированная редакция СНиП 23 — 05 — 95) и Санитарным правилам и нормам СаНПиН 2.21/2.1.1.1278-03) считается, что человек не воспринимает частоту пульсаций освещенности выше 300 Гц. В данном случае превышение частоты ШИМ почти на порядок обеспечивает должный уровень зрительного комфорта.
Эффект плавной смены цифр
Для того чтобы получить зрительный эффект плавной смены цифр нужно в течение времени смены одной цифры на другую (обычно 200-250 мС) включать попеременно старую и новую цифры, причем время горения старой цифры должно уменьшаться, а новой – увеличиваться. Алгоритм смены цифр (подпрограмма change()) выполняет 60 циклов. При запуске алгоритма смены цифр первая цифра включена 100% времени цикла, а вторая 0%. По мере прохождения циклов время включения первой цифры уменьшается со 100% до 0%, а время включения второй – увеличивается с 0% до 100%). Таким образом, алгоритм плавной смены цифр в течении 200 мС и 60 циклов уменьшает яркость первой цифры до погасания, а второй – до полной яркости.
Остальное время секундного интервала цифры включены непрерывно и статично, их общая яркость понижается путем управления общим включением\выключением индикации ШИМ сигналом на выводах BL.
На рис 7 показаны сигналы, записанные логическим анализатором при смене цифр. Видно, что в начале выполнения подпрограммы смены старая цифра включена максимальное время, а новая – минимальное и за время смены (примерно 250 мС) время горения старой цифры уменьшается до 0, а новой нарастает до максимума. Зрительно это проявляется как плавное уменьшение яркости старой цифры с одновременным «протаиванием» новой.
![](https://habrastorage.org/webt/q9/ic/db/q9icdb570c3qwwi3cdxxpoji5tk.png)
Рис 7. Запись сигналов управления при плавной смене цифр
Видеозапись эффекта приведена тут
и тут
и тут:
Синхронизация с серверами точного времени
Изучив вопрос в интернете, я сделал вывод, что в основном авторы программ сами пишут (или используют готовые сторонние) подпрограммы для протокола NTP. Меня это несколько удивило, поскольку в SDK от Espressif упоминается встроенные функции для работы с реал тайм. Встроенный функционал обеспечивает запрос серверов времени (до трех), коррекцию времени (по моим наблюдениям – раз в 4-6 часов проходит запрос к тайм серверу), преобразование значения в виде юникс тайм в человеко-читаемый вид, коррекцию в соответствии с заданной тайм-зоной.
Из особенностей использования встроенной функции реал-тайм: на первый и несколько последующих запросов времени возвращается ноль и выдается диагностика «запустите rtc сначала» Как это сделать – я не нашел и поэтому просто ожидаю (пару секунд) пока не появится время, отличное от нуля.
Алгоритм запуска часов
При включении часов система включается в режиме клиента и производится попытка подсоединиться к точке доступа с запомненными реквизитами.
ESP8266 запоминает эти реквизиты после успешного предыдущего присоединения самостоятельно в служебной памяти. Это функция, реализованная в SDK. Если это присоединение не удалось – выполняется следующая попытка, но имя и пароль к точке доступа используются прочитанные из EEPROM. В EEPROM также сохраняется и временная зона (число в диапазоне -12 — +12), которое в дальнейшем используется для правильного преобразования времени в локальный формат.
Если и это присоединение не удалось, то режим работы меняется на «точка доступа» и веб-страничка часов становится доступной по стандартному адресу 192.168.4.1 для любого устройства, присоединенного к этой точке доступа. В моем случае имя точки доступа ESP_D. Со смартфона, планшета или ноутбука надо зайти на страничку устройства, выбрать точку доступа и ввести пароль. Пока включен режим «точка доступа» — режим «клиент» выключен. Это связано с особенностями поведения системы в ситуации, когда присоединение к точке доступа не удалось. Систему будет непрерывно повторять попытки присоединиться, будет занята только этим и ни на что другое ресурсов практически не останется. Внешне это будет проявляться как неприятное торможение интерфейса. Внешний вид страницы представлен на рис 8.
![](https://habrastorage.org/webt/8o/am/ie/8oamiekijplb_n_aoqwaj6o9l_a.png)
Рис 8. Внешний вид WEB интерфейса часов и командная строка, демонстрирующая ответ на команду ping
На этой страничке отображаются все найденные точки доступа. Точки доступа отсортированы по силе сигнала, верхняя строка – точка доступа с самым сильным сигналом и highly likely самая близкая (т.е. та, к которой надо присоединяться). Надо ввести пароль, выбрать тайм зону и нажать ОК. Система включит режим «клиент» (одновременно с «точкой доступа»), попытается присоединиться. Если присоединение удалось – то параметры будут запомнены в EEPROM. Если присоединение не удалось – появится соответствующее сообщение на страничке и можно еще раз попытаться ввести пароль и т.д.
После удачного входа в сеть режим «точка доступа» будет выключен и останется только режим «клиент», т.е. страничка часов становится доступной только из внутренней сети.
Чтобы можно было обращаться к часам по имени (в моем случае «esp») запускается библиотека NBNS, обеспечивающая отклик по протоколу NetBios. Работа библиотеки позволяет часам откликаться на команды типа ping esp и обращаться к ним можно будет просто по имени esp
По неясной для меня причине эта замечательная библиотека, формирующая отклик на широковещательный запрос типа «на каком адресе «имя»?» и позволяющая забыть о муторной процедуре определения IP адреса прибора по внутренним данным рутера (коммутатора), используется очень редко. Практически все описанные в инете устройства на ESP8266 не используют этот простой и удобный механизм. Лень должна двигать прогресс – но в данном случае не двигает.
Далее запускается основной цикл программы, в котором происходит следующее:
- Опрашивается текущее время и при переходе секунд запускается смена отображения времени.
- Производится опрос датчика освещенности и подстройка скважности ШИМ сигнала, которым управляется яркость часов. Целью подстройки является сохранение неизменной контрастности цифр при изменении освещенности в помещении.
- Производится опрос датчика VL53L0X. Этот датчик представляет собой времяпролетный лазерный дальномер, способный измерять дистанции до предмета до 2 метров.
Эксперименты показали, что 2 метра – это в идеальных условиях, когда в качестве отражателя используется лист белой бумаги или алюминиевая фольга с коэффициентом отражения, близким к единице. Для обычных предметов с неидеальным коэффициентом отражения (ткань, кожа человека и т.п.) дистанция уверенного определения несколько более 1 метра. Если датчик показывает наличие предмета перед часами – запускается подпрограмма показа текущей температуры на улице, влажности и давления воздуха. Приняты меры к некоторому повышению помехоустойчивости – используется простейший алгоритм «более 50% срабатываний». Это значит, что за интервал 800 мС цель должна быть обнаружена на дистанции менее 1 метра более чем в половине измерений дальности. При отладке система показывала, что обычно получается 50-60 срабатываний при нахождении цели в поле зрения датчика.
Система обнаружения человека срабатывает только на появление цели в поле зрения. Чтобы еще раз запустить показ нужно отойти и подойти опять. Сделано это, чтобы убрать ситуацию, что пока стоишь перед часами все время показываются внешние параметры.
Лазерный датчик VL53L0X использует ИК лазерный диод, излучающий на длине волны 940 нм, безопасный для глаз.
На видео показана реакция системы на появление препятствия в поле зрения лазерного локатора:
Первоначальный план запуска индикации внешних данных состоял в использовании микросхемы распознавания голосовых команд. Для этого я использовал микросхему WTK6900B02 (распознаватель голосовых команд), любезно предоставленную фирмой Sound Technologies. По описанию, микросхема должна распознавать десяток звуковых команд и выдавать двоичный код, соответствующий принятой команде. Импульс с микросхемы был заведен на один из выводов ESP8266 и к нему был прицеплен обработчик аппаратного прерывания. По аппаратному прерыванию фиксируется факт распознавания голосовой команды. В полученной мной микросхеме были предзаписан ряд команд на английском языке. Я упорно тренировался в «правильном произношении» команд, так, чтобы они распознавались. Оказалось, что говорить надо вовсе не с оксфордским произношением, а с китайским акцентом :)), достаточно громко.
Несмотря на значительное потраченное время, мне не удалось добиться надежного распознавания голосовых команд. Лучшее, что я получил – примерно 50% правильного распознавания. Поэтому я был вынужден применить другой механизм запуска отображения внешних данных – лазерный измеритель дистанции VL53L0X.
В основной программе часов остались следы использования системы голосового управления.
Также в программе есть части, предназначенные для считывания данных их датчика ультрафиолета VEML6070. Дело в том, что я отлаживал программу часов попеременно дома и на работе, а датчик MAX44009 у меня был только один. Поэтому на работе к ESP8266 был подключен датчик ультрафиолета VEML6070 и написана часть программы, определяющая какой из датчиков подключен в текущий момент. Для отработки алгоритма регулировки контрастности этого оказалось совершенно достаточно, и я не стал ничего менять в окончательной версии программы.
Вывод данных в регистры HV5622
Как я уже упоминал выше, для управления газоразрядными лампами требуются микросхемы, способные коммутировать достаточно высокое напряжение. Я выбрал микросхемы HV5622, которые представляют собой 32-х разрядный регистр с последовательной записью и параллельным считыванием. Катоды ламп присоединены каждый к своему выводу HV5622. Для зажигания конкретной цифры необходимо на присоединенный вывод микросхемы вывести 0. К первым двум HV5622 присоединены катоды шести ГРИ, к третьей HV5622 – точки разделители часов-минут и минут-секунд и катоды седьмой лампы со спецсимволами. Для включения нужных цифр в лампах надо вывести в регистр 32-х битное число, в котором лог 1 (данные внутри HV5622 инвертируются) соответствуют нужным катодам ламп. В программе заведены массивы размерностью 10 32-х разрядных переменных. Каждый элемент такого массива содержит двоичное число с лог 1 на одной из позиций, вывод которого в регистр приведет к зажиганию нужной цифры. Так как каждая микросхема управляет несколькими ГРИ – то для вывода требуется предварительно сформировать из нескольких элементов одну 32-х разрядную переменную, состоящую в основном из логических 0, где лог 1 соответствуют нужным цифрам в каждой лампе.
Стоит упомянуть, что решение использовать массивы для управления катодами ГРИ обладает серьезным достоинством: если при пайке жгутов от панелек ГРИ к панелькам HV5622 была сделана ошибка и перепутаны выводы ГРИ – то для исправления достаточно поменять в программе константу, ничего не перепаивая. Значительное количество и тесная компоновка выводов HV5622 делают перепайку двух соседних проводов затруднительной операцией.
Для полного заполнения всех трех регистров требуется вывести 3 32-х разрядных переменных (суммарно 96 бит). Делать это «ногодрыгом» неразумно – слишком долго, затратно по времени.
К счастью, ESP8266 имеет в своем составе аппаратный механизм (HSPI) последовательного обмена данными, а в SDK имеются функции доступа к этому механизму. C запуском этого механизма пришлось помучиться. Трудность оказалась в том, что было неясно куда класть 32-х разрядные переменные для вывода в режиме HSPI. Чтобы разобраться с механизмом HSPI я использовал логический анализатор. После ряда экспериментов я понял, что 96 бит выводится, однако это нужное 32-х битное число вначале и два 32-х битных числа, содержащие произвольный мусор. Поиск в инете ничего не давал, но в какой момент я понял, что если есть инструкция вида WRITE_PERI_REG(SPI_W0(HSPI), d0); то можно попробовать написать WRITE_PERI_REG(SPI_W1(HSPI), d1); и далее WRITE_PERI_REG(SPI_W2(HSPI), d2); где d0, d1, d2 – 32-х разрядные переменные. Т.е. надо сначала разложить данные по регистрам SPI_W0 — SPI_W2, а затем выдать команду запуска обмена. Отмечу также, что модуль HSPI может выводить до 512 бит и регистров таких имеется всего 16 штук: W0 – W15.
Сигнал LE, по которому данные перемещаются в выходной регистр HV5622, генерируется программно.
Отладка системы
Я не рискнул отлаживать систему сразу с полноценным высоким напряжением (230 вольт) и сделал из десятка светодиодов отладочный индикатор с рабочим напряжением 5 вольт. После отладки, когда я убедился, что правильно включаются нужные светодиоды, были смонтированы ГРИ в панельки и подано высокое. В результате такой последовательности отладки не пострадала ни одна микросхема и ни одна индикаторная лампа :). Фотография узла, примененного для отладки, показана на рис 9.
![](https://habrastorage.org/webt/7r/k9/8v/7rk98vqof6l_pkxyrkgqkvrjkja.png)
Рис 9. Фотография отладочного светодиодного узла.
Короткое видео процесса отладки тут
Корпус
Изначальная задумка была сделать брутальный корпус из толстого металла типа меди, латуни или бронзы. Однако поскольку Wi-Fi соединению требуется корпус из диэлектрика – то в окончательном варианте осталась только лицевая панель из толстого металла. Беглый поиск в интернете фирм, выполняющих корпуса на заказ, дал цифру в районе 5000 р за корпус. На мой взгляд, это неразумная сумма в текущих обстоятельствах. Поэтому я подобрал готовый корпус (Gainta G2119C), купил его по дороге на дачу в Щербинском магазине Чипа-и-Дипа и остановился на этом, оставив на потом вопрос лицевой панели и возможно другого корпуса.
Несмотря на недоработку в части корпуса часов, я решил изложить в статье достигнутые результаты, считая, что обществу будут интересны разработанные и примененные схемные и программные решения.
Внешний вид корпуса на сегодняшний день представлен на рис 10.
![](https://habrastorage.org/webt/ze/bn/4v/zebn4v6lvphsgy-eovfqp6kdi9a.jpeg)
![](https://habrastorage.org/webt/rx/jo/gh/rxjoghkpz0xhrl5_j2fvlj0losm.jpeg)
Рис 10. Внешний вид корпуса часов
Заключение
Часы работают уже более года, сбоев не зафиксировано, поставленные задачи выполнены полностью. Перечислю еще раз отличительные особенности моего варианта часов:
- Режим статической индикации с одновременным эффектом плавной смены цифр
- Использование микросхем HV5622 для управления ГРИ
- Данные в HV5622 записываются с использование аппаратного механизма HSPI
- Точное время берется с серверов точного времени из интернета
- Обращение к часам возможно по имени из внутренней сети
- Настройка требуется один раз при первом запуске.
- Полное отсутствие кнопок, будильников и т.п.
- Плавная регулировка яркости свечения ГРИ с целью сохранения постоянной контрастности изображения в заданных границах изменения внешней освещенности
- Часы реагируют на приближение человека и показывают уличные температуру, влажность, давление воздуха.
Я доволен :)
→ Архив с программой лежит тут