Разработка больших цифровых часов на светодиодной ленте
Когда-то давно в детстве, когда я ещё только начинал заниматься электроникой, у меня была мечта изготовить огромные часы на семисегментных индикаторах. Точнее, изготовить большой индикатор и подключить его к электронной плате уже имеющихся маленьких электронных часов. Для изготовления самих семисегментных индикаторов в качестве сегментов я рассматривал люминесцентные лампы дневного света. Других идей на тот момент мне не приходило. А на таких лампах делать часы — не очень хорошая задумка.
По прошествии многих лет в обиход вошли другие более практичные источники света, в частности, светодиодные ленты. Именно они и послужили стимулом воплотить свою старую задумку в реальность. Имея возможность и опыт программирования микроконтроллеров, я решил, конечно же, самостоятельно изготовить электронную плату для часов со своими функциональными возможностями. Кроме отображения часов и минут я задумал сделать отображение даты и температуры. В данной статье я не буду подробно описывать принципиальную схему и прошивку МК. Напишу лишь краткий обзор и историю разработки своей конструкции.
Конструированием больших часов из светодиодной ленты я начал заниматься ещё 7 лет назад. Было приобретено 3 рулона дешёвой светодиодной ленты по 5 метров в каждом (4.8 Вт/м, синий цвет). Исходя из имеющегося количества ленты (3×5=15 м) я определился с длиной одного сегмента: 50 см. Всего сегментов 28 (4 по 7) плюс две точки по центру (одна внизу и одна вверху), разделяющие часы и минуты. Итого — 30 сегментов. То есть, планировалась израсходоваться вся имеющаяся светодиодная лента. Точки представляют собой 5 отрезков по 10 см каждый, что по длине и по мощности эквивалентно одному сегменту. Они сложены в квадрат 10 на 10 см.
Все отрезки светодиодной ленты уложены в специальный алюминиевый профиль. Данный профиль, предназначенный для светодиодной ленты, также можно свободно найти в продаже. Вовнутрь профиля приклеивается светодиодная лента, а сверху закрывается пластиковым матовым материалом для рассеивания света. Все профили скручены в единый каркас, размером 320 на 105 см. Края смежных профилей я соединил через металлические кружочки. Для усиления жёсткости всей конструкции в некоторых местах я прикрутил дополнительные алюминиевые уголки.
Рис. 1. Эскиз конструкции часов
Электронная плата сделана на базе микроконтроллера Atmega8. Часовая микросхема DS3231 в виде модуля (с обвесом и батарейкой CR2032) втыкается в разъём на плате. Датчик температуры DS1621 подключен к плате коротким кабелем и выведен наружу снизу коробки. Также на плате предусмотрены три кнопки для настройки и конфигурации часов. С практической точки зрения они не очень удобны, так как находятся внутри коробки. Поэтому со временем я дополнил плату модулем Bluetooth HC-06, подключенным к UART интерфейсу МК.
Рис. 2. Структурная схема электроники часов
Рис. 3. Основная плата
Рис. 4. Подписи на основной плате
Через Bluetooth можно подключаться с ноутбука или смартфона, используя в качестве программы любой терминал. В свою очередь внутри программы МК предусмотрен набор текстовых команд для управления с таких терминалов. Имеется возможность не только настраивать дату и время, но и менять режимы и продолжительность отображения времени, даты и температуры по очереди. Вывод информации на сегменты реализован через сдвиговые регистры 74HC595 и транзисторные ключи структуры NPN. В качестве последних сначала применялись четыре 8-канальных ключа ULN2803. Было 4 одинаковых дочерних плат, которые втыкались в основную плату с МК. На каждой из них размещались регистр, 8-канальный ключ и выходные клеммы для подключения проводов к сегментам. Кстати, именно они и послужили в дальнейшем непрямому соответствию нумерации бит и сегментов из-за удобства монтажа.
Рис. 5. Печатные платы с регистрами 74HC595 и ключами ULN2803
Рис. 6. Платы в процессе изготовления
Данные ключи от нагрузки перегревались и со временем вышли из строя (немножко не рассчитал). Поэтому я решил изготовить плату с транзисторами помощнее. На ней я разместил 32 транзистора BC139 (2 — в резерве) и 4 регистра. Эту плату с платой МК я соединил проводами.
Рис. 7. Плата с транзисторами
Рис. 8. Конструкция часов (ключи на BC139)
В качестве общего провода всех сегментов (общий плюс) применяется сам каркас. Провода к каждому сегменту идут от электроники (коробка 3) через промежуточные коробки, в которых спрятаны разъёмные соединения (коробки 1 и 2). В коробке 3 кроме электроники также находится блок питания на 12В. Такая конструкция надёжно проработала несколько лет. Часы висели в большом помещении.
Рис. 9. Коробка с электроникой (ключи на ULN2803)
Рис. 10. Промежуточная коробка с разъёмами
Рис. 11. Отображение времени
Рис. 12. Отображение даты
Рис. 13. Отображение температуры
Со временем возникло желание повесить часы на улицу. Для этого в первую очередь нужно было обеспечить защиту конструкции от влаги и осадков. Для этой цели я решил полностью обновить светодиодную ленту на влагозащищённую. Заодно хотелось, чтобы часы светили гораздо ярче и были видны даже в светлое время суток. Я нашёл в продаже крутую влагозащищённую яркую светодиодную ленту белого свечения мощностью 24 Вт/м. На ней светодиоды расположены более плотно, чем на предыдущей ленте, и они более яркие. В конструкцию каркаса я также внёс небольшие дополнения — добавил 2 дополнительных сегмента. В первой «восьмёрке» — диагональный сегмент в нижней части, а в последней — наклонный сегмент в нижнем правом углу. Подключены они к оставшимся двум резервным каналам выходных ключей (всего у меня 4 регистра по 8 бит, или же 32 канала). Эти дополнительные сегменты нужны для возможности отображения на часах своего ника на хабре радиолюбительского позывного R3EQ: на первой «восьмёрке» — буква «R», а на последней — «Q».
Рис. 14. Обновлённый эскиз часов
После обновления светодиодной ленты некоторые места я промазал герметиком, особенно места пайки проводов, чтобы ещё больше исключить попадание влаги. От общей шины питания в виде самой конструкции я отказался и решил подводить к каждому сегменту отдельную пару проводов. Это полностью исключает возможные проблемы с просадкой напряжения.
В электронику я также ввёл существенные изменения. Из-за умощнения нагрузки пришлось обновить блок питания. Точнее, я поставил их два: один на первую половину циферблата, другой — на вторую и на питание электронной платы. Плату с регистрами и транзисторными ключами я также обновил, расположив транзисторы в один ряд с целью их монтажа на теплоотвод. В качестве теплоотвода применён кусок алюминиевого уголка соответствующей длины. Ведь при такой новой нагрузке (1А на сегмент) транзисторы стали греться довольно неплохо.
Рис. 15. Обновлённая плата с транзисторами
Рис. 16. Размещение транзисторов на теплоотводе
Все вышеперечисленные потроха я разместил в новый корпус — герметичный металлический электрошкаф. Он получился довольно тяжёлый, и поэтому я не стал его крепить к каркасу часов и повесил рядом. Соединения между электрошкафом и индикацией выполнены множествами пар проводов, уложенных в гофре, через два круглых 32-пиновых герметичных разъёма на дне шкафа.
Рис. 17. Распределение пар проводов на пинах разъёма
Из промежуточных распределительных коробок провода разводятся на сегменты через кабель-каналы позади конструкции. Вместо модуля Bluetooth я решил поставить самодельный преобразователь UART-TCP/IP (Telnet сервер) для управления часами с терминала на любом расстоянии через локальную сеть или Интернет. Данный преобразователь описан в моей самой первой публикации на Habr.
Рис. 18. Шкаф с обновлённой электроникой для часов
Рис. 19. Вид обновлённых часов в дневное время суток
Ещё в прошивку добавил новую полезную функцию — регулировку яркости. Технически это реализовано на таймере МК с режимом ШИМ. Соответственно, с помощью ШИМ за счёт изменения скважности импульсов регулируется напряжение, подаваемое на все сегменты. Сигнал ШИМ с соответствующего вывода МК идёт на выводы «OE» регистров. Кстати, эту реализацию я придумал уже после того, как изготовил печатные платы. Поэтому пришлось городить костыли (можно увидеть на рис. 15). Предусмотрено 10 градаций яркости, включая нулевую яркость, когда часы не горят. Команды терминала — «y0», …, «y9». Как известно, зависимость видимого свечения светодиодов от приложенного к ним напряжения не линейна, а имеет «выпуклую» характеристику в пользу потребителя. То есть, к примеру, 50% приложенного напряжения соответствует 75% яркости. Тем самым, в частности, можно снизить напряжение на светодиоды примерно на 10–20%, при этом почти ничего не потеряв в яркости. Именно на предпоследней градации яркости («y8») я и эксплуатирую часы. Стоит понимать, что ШИМ сама по себе создаёт мерцание светодиодов на определённой частоте, типа не видимой для глаз. Частоту ШИМ я выбрал действительно высокой (1.35 кГц), которая глазам практически не мешает. Но я предусмотрел переключение частоты ШИМ специальными командами «f1», …, «f5» с экспериментальной целью. При этом в прошивке переключаются предусмотренные в МК делители таймера. Получились частоты 10.5 Гц (мерцание однозначно видно всем), 42.2 Гц, 168.75 Гц, 1.35 кГц, 10.8 кГц. На самой высокой частоте ШИМ 10.8 кГц при одной и той же средней яркости часы светятся чуть-чуть бледнее. Видимо, на этой частоте светодиоды уже перестают успевать набирать полную яркость. Самая оптимальная частота — 1.35 кГц. Недостаток ШИМ на этой частоте — тихий свист из электрошкафа с той же частотой. Но он слышен в комнате при идеальной тишине (при подключенной нагрузке, само собой).
Спустя год мне снова захотелось модернизировать конструкцию. А именно, было желание, чтобы часы отображали атмосферное давление. Самый распространённый, дешёвый и довольно точный в показаниях датчик — BMP280. Совместно с датчиком в моей конструкции применён модуль схемы согласования уровней I2C 3.3В-5В, так как датчик работает от 3.3В, а моя схема — от 5В. Эти модули применяют в своих конструкциях ардуинщики.
Рис. 20. Датчик давления и согласователь уровней
Избегая Ардуино, на данный датчик имеется подробная документация (даташит). Для получения информации о давлении необходимо внести в прошивку МК кучу вычислений. Данные вычисления не поместились в память МК Atmega8. Поэтому я нарисовал и изготовил новую плату для МК Atmega32, и перенёс всю прошивку на неё. На данной плате я предусмотрел схему подключения распространённого аналогового температурного датчика NTC (термистора) на 10 кОм для возможности измерения и отображения температуры на более длинном расстоянии от часов. Попутно с этим я решил отказаться от самодельного переходника UART-TCP/IP, приобретя на Алиэкспрессе по дешёвке аналогичное устройство в отдельной небольшой коробочке. Но у него UART интерфейс выполнен на разъёме DB9 с электрическими уровнями компьютерного COM-порта (RS-232). Поэтому на новой плате я предусмотрел микросхему преобразователя уровней MAX232, через которую и подключается новый переходник. Кнопки на новой плате я ставить не стал, и их функционал исключил из прошивки.
Рис. 21. Обновлённая схема электроники
Рис. 22. Новая плата часов на Atmega32
Рис. 23. Вид новой платы со стороны пайки
Рис. 24. Вид новой платы со стороны подключений
Рис. 25. Обновлённая начинка электрошкафа
Кроме того, прошивку я дополнил другими новыми функциями и командами терминала. В автопрокрутку, кроме времени, даты и температуры, добавились атмосферное давление и произвольная комбинация. Данную комбинацию можно составить самостоятельно посегментно или побайтно специально предусмотренными для этого командами.
Рис. 26. Команда »76: C7: E7:48» выводит слово «УРА!»
Калькулятор для расчёта HEX-кода комбинации сегментов я сделал в Excel.
Рис. 27. Калькулятор для расчёта кода комбинации сегментов в Excel
Продолжительности страниц автопрокрутки также по-прежнему гибко настраиваются через терминал. Имеется возможность переключаться между датчиками температуры для отображения (DS1621 или NTC). По команде «info» в терминал выводится вся информация с датчиков.
Часами можно управлять командами с терминала по TCP не только вручную, но и в автоматическом режиме. Существуют терминальные программы, поддерживающие программирование сценариев и скрипты. Но я поступил проще — создал простейший Telnet клиент в среде разработки «Visual Studio 2022» с применением библиотек
Рис. 28. Планировщик Windows для управления часами
Учитывая то, что на часах предусмотрен режим отображения произвольной информации (произвольной комбинации сегментов), которая посылается к ним по TCP специальной командой, имеется возможность использовать часы в качестве индикатора. В частности, реализовать программу отображения на часах времени и даты полностью на компьютере. К сожалению, скорость обновления информации не сильно высокая. Чаще, чем 3 раза в секунду, у меня не получилось обновить информацию на циферблате. Это связано с неоптимальной реализацией алгоритма приёма информации по UART в прошивке МК. Тем не менее, для некоторых приложений такой скорости вполне хватает. В одной из следующих статей речь пойдёт как раз об одном из таких приложений.
Напоследок — ещё несколько фотографий часов.
Рис. 29. Вечер 1 марта 2023 г.
Рис. 30. По команде «r3eq» на часах высвечивается R3EQ
Рис. 31. По команде «all» на часах горят все сегменты
Рис. 32. Вид часов с расстояния 700 метров
За полтора года эксплуатации часов не было ни единого сбоя в их работе. Хотя нет, один сбой всё-таки был 31 мая этого года. Об этом я как раз и хотел написать. С утра я заметил, что часы периодически то потухнут, то погаснут. То есть, примерно 10 минут горят и 5 минут не горят. Не помогала даже перезагрузка. Но при параметре полной яркости они горят постоянно, и всё нормально. Я весь день выяснял, в чём причина. Оказалось, что сбился параметр делителя таймера, отвечающего за ШИМ (регулировку яркости), хранящийся в EEPROM МК. То есть, параметр частоты ШИМ, управляющийся командами «f1», …, «f5». Он каким-то образом ушёл за свои пределы, переключившись на непредусмотренный «f0». А согласно регистру конфигурации таймера в МК AVR нулевой делитель соответствует переключению таймера T1 на внешний источник тактирования по пину T1. А данный пин в моей схеме совпал с пином строба второго регистра. Получается, что мой таймер, отвечающий за ШИМ, стал тактироваться сигналом строба на регистр, который формируется не чаще, чем раз в секунду. Тем самым частота пульсации ШИМ значительно упала, и задание яркости превратилось в периодическое включение и отключение часов.