Предлагаемые Вашему вниманию часы являются, по сути, побочным продуктом изучения свойств и повадок популярного зверя по кличке 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-скрипты

Комментарии (25)


  1. veprbl
    17.12.2015 07:21

    Идея с переворотом точек гениальна. Браво!


    1. veprbl
      17.12.2015 07:26

      Вместо обычного сдвигового регистра лучше, наверное, использовать специальный регистр с led драйвером, который обеспечит равномерное свечение восьмёрки по сравнению с единичкой и точкой.


      1. vladimir_open-dev
        17.12.2015 09:33

        stp08dp05 например. Иначе будет светиться по разному.


      1. IronHead
        17.12.2015 11:19
        +1

        Или поставить ток ограничительные резисторы на каждый сегмент индикатора, а не один общий как в статье.


      1. Dioniss81
        17.12.2015 15:08

        поддерживаю, есть много драйверов в стоимость четырех отдельных сдвиговых корпусов, причем вывод до 10ти цифр если не ошибаюсь. Управление правда посложнее, там идет i2c или spi обмен… Ну еще недостаток — будет динамическая индикация.
        Кстати когда делал свои часы, использовал сдвиговые без защелки 74hc195- они дешевле в разы, в случае с индикаторными лампами накаливания самого заполнения не было видно, а вот светодиодные заметно мерцали.


      1. sav13
        17.12.2015 16:28

        MAX7219 отлично работает с индикаторами 1.8" (каждый сегмент из двух диодов)
        Написал функции к ESP8266 со своим знакогенератором
        И яркость регулируется


  1. sfrolov
    17.12.2015 08:47

    Один резистор на общий провод индикатора не будет приводить к тому, что единица из двух сегментов будет светиться ярче, чем восьмерка из семи сегментов?


    1. Tomasina
      17.12.2015 11:02

      Если там динамическая индикация, то нет, т.к. всегда светится только один из сегментов, просто они быстро чередуются.


      1. sfrolov
        17.12.2015 11:07

        Там на каждый индикатор по регистру


  1. Kidar
    17.12.2015 10:06

    Много интересных идей реализовано в данном проекте, часы однозначно понравились!
    Идея с переворотом одного центрального индикатора для использования разделительных точек великолепна!
    В своих часах, я тоже перевернул индикаторы, но для того, чтобы использовать точки для отображения 15-секундных интервалов (но пришлось использовать «костыль» в виде двух отдельных светодиодов). Вот бы как-то объединить эти две идеи…
    Не заметил реализацию яркости индикаторов и как закрыта задняя стенка часов?


    1. KonstantinSoloviov
      17.12.2015 15:34

      Вот бы как-то объединить эти две идеи…

      А почему именно 15-секундные интервалы?
      Вот 20-ти секундные: нижняя точка, верхняя точка, две точки

      Если мигающая точка, то вообще уйма вариантов. Каждая точка может быть: погашена, гореть, мигать 1/2 — 1/2, вспыхивать 1/3 — 2/3, пригасать 2/3 — 1/3, а их две.

      Человеческий глаз очень точно различает различные подмигивания


      1. Kidar
        17.12.2015 16:18

        Сразу напишу, чтобы не было путницы в обсуждении, что речь в данной ветке обсуждения идет не о тех, часах, которые описаны в статье «Бескнопочные часы».

        Отвечу по порядку:

        1. А почему именно 15-секундные интервалы?

        Использовано четыре индикатора, у каждого имеется своя точка. 60/4=15 сек.
        Если помимо этих точек использовать нижнюю/верхнюю/средние (для варианта индикации 20 секунд), то нарушается система и будет затрудненное восприятие, так как люди в основном консервативны. Некоторые люди в комментариях считали даже вариант с верхними точками не очень приемлемым.
        2. Если мигающая точка, то вообще уйма вариантов.

        От всех мигающих вариантов лучше отходить. Хотя в часах реализован режим, когда разделительные точки мигают, но он не используется, так как при хорошем боковом зрении, он не очень хорош для зрения.
        Поэтому не являюсь сторонником такого варианта, хотя это на «любителя», и кто-то вполне может реализовать предложенный способ отображения секунд миганием.
        3. Человеческий глаз очень точно различает различные подмигивания.

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

        Но в любом случае, спасибо за предложенные варианты!


  1. KonstantinSoloviov
    17.12.2015 10:52

    Про анодные резисторы
    У меня тоже были серьезные опасения по поводу разной яркости свечения цифр из-за одного анодного резистора и в первоначальном варианте резисторы стояли на каждом сегменте. Но, критерий истины — практика:


    ( вот, пришлось дожидаться удачного сочетания цифр, выставить время-то нельзя :) )

    Не буду утверждать, что разницы нет совсем, но я решил что она не принципиальна.

    Дело, думаю, в том, что питание индикаторов точно выставляется под падение напряжения на сегментах и на резистор приходится всего-ничего 0.2V, он там вообще больше для «порядка» — 15 ом всего — нельзя же совсем без него.

    Про специальные м/с драйверы LEDов
    Специализированные конечно лучше, но:
    1. эти регистры у меня были
    2. мне было интересно попробовать
    3. 74HC595 чуть дороже песка из которого сделаны, а те — нет

    Про корпус
    Его нет.
    И скорее всего не будет. Собираюсь залить плату жирным слоем лака. Никогда так не делал, вот и попробую.

    Про переворот индикатора
    Идея не моя — подсмотрел, но рад, что понравилось


    1. Dioniss81
      17.12.2015 15:14

      советую при оформлении использовать упаковку антистатическую под куском оргстекла. Так не видно не засвеченных сегментов. Ну можно просто пленку для тонировки :-)


      1. KonstantinSoloviov
        17.12.2015 15:46

        Согласен, подумываю об этом.
        Я вообще видел часы просвечивающие сквозь стенку шкафа, но у меня, с сожалению, нет такого подходящего места куда можно встроить часы :)


  1. Tomasina
    17.12.2015 11:02

    Насколько яркие эти большие индикаторы? И какая у них высота?


    1. KonstantinSoloviov
      17.12.2015 15:13

      Индикаторы, те что побольше ( CPD-23011SR2/A ) 7см габарит по высоте, 5.5см — цифра, поменьше ( KEM-18102BR ) 5.5 / 4.5.

      Максимальная яркость достаточна для светлого времени и чрезмерна для темноты.
      Подобранная, компромиссная яркость далека от максимальной.


  1. past
    17.12.2015 11:45
    +1

    В NodeMCU уже довольно давно добавлены модули rtc и ntp. github.com/nodemcu/nodemcu-firmware/wiki/nodemcu_api_en#sntp-module. Кроме этого есть lua модуль для ds3231.
    Я сейчас подобную штуку делаю, но на oled, с погодой и прочимим свистелками, тоже без кнопок.
    Может быть выложите на гитхаб?


    1. KonstantinSoloviov
      17.12.2015 14:51

      Спасибо — интересно. Обязательно попробую эти модули. Что до ds3231 — именно без подобных «лишних» деталей и хотелось обойтись.


    1. sav13
      17.12.2015 16:35

      Реализовал на ESP8266+ DS3231 (DS1307) + NTP + MAX7219
      Только LUA я не люблю — очень много памяти жрет и тормозной
      Сделал все под Arduino IDE
      image


      1. KonstantinSoloviov
        17.12.2015 17:36

        Обычно WiFi-роутер работает круглые сутки, в таких условиях отдельный RTC — просто лишняя сущность.

        В защиту Lua: eсли взять фотографии ваших и моих часов и кому-нибудь показать, то никто не скажет в каких именно часах живет «жрущий память и тормозной» Lua. :)


        1. sav13
          17.12.2015 17:44

          Сбой электроэнергии обычно вызывает сбой интернета. Получается, часы могут и «не загрузить» время. Если это ночью случиться, может и будильник не сработать. Может для вас RTC и лишняя сущность, но не все так думают.

          По внешнему виду никто и WiFi модуль в часах заподозрит. А вот когда начнете расширять возможности часов с дополнительными библиотеками, да WEB-сервер в часах реализовывать, тут и проявится сущность LUA. Да и лично я не вижу я никаких преимуществ LUA перед Си++.


          1. IronHead
            17.12.2015 18:07

            Не, лишнее это все. Ну сбойнет инет — ну отстанут часы на 2 миллисекунды за ночь из за нестабильности внутреннего тактового генератора ESPшки, потом подстроятся. А так автор молодец — простые часы с синхронизацией, все, тут больше ничего и не надо, какой извините WEB сервер — это часы, основная их задача: точно показать время.


            1. sav13
              17.12.2015 18:15

              Простые часы на мощном микроконтроллере с WiFi — это из пушки по воробьям. Поэтому в аналогичном проекте я добавил настройку точки доступа и IP-адреса, (не зашивать же это в текст программы), настройку NTP-серверов (тоже бывает, что глючить они начинают), таймзону, если вдруг переду с часами в другой город, настройку яркости и времени перехода в ночной/дневной режим, чтобы ночью спать не мешали, ну и несколько будильников,
              Логично, что в часах без кнопок настраивать всю эту роскошь нужно через WEB-интерфейс.
              В принципе, сюда еще напрашивается прогноз погоды и пр. «вкусности».


              1. KonstantinSoloviov
                17.12.2015 18:33

                Простые часы на мощном микроконтроллере с WiFi — это из пушки по воробьям.
                Не агрумент. Я думаю вам все равно, что вычислительные возможности микропроцессора стиральной машины используются не на все 100%, а программа стирки написана (о ужас!) на Форте.
                В принципе, сюда еще напрашивается прогноз погоды и пр. «вкусности».
                Не напрашивается. По той же причине.
                Имхо: показывать время — должны часы, погоду — погодная станция, телефон — звонить, кофеварка — варить кофе и т.д.

                А для всего остального уже придумали планшет :)
                Но, я признаю ваше право считать по другому.