Разрабатываем свои собственные буквенные часы

a5813955ed8eb8fa91b80d3d571ab812.jpg

Источник

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

Часы являются малодоступными широкому кругу людей, ввиду их дороговизны (это явилось одним из стимулов для разработки своих собственных). Часы имеются у производителя на разных языках.

И я подумал, почему бы не обдумать вероятность создания примерно таких часов, на русском языке?

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

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

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

Можно сказать, что задача создания буквенных часов может быть разделена на несколько этапов:

1 Этап: Так как нам будет необходимо предварительно создать матрицу из слов, весьма полезно использовать для этого дела свои навыки программирования. Так как, безусловно, возможно создать данную матрицу и просто вручную, Однако, программные методы генерации дают нам гораздо большую гибкость.

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

3 Этап: Необходимо разработать прошивку для соответствующего микроконтроллера, который будет заниматься управлением подсветкой матрицы из слов. Тут надо сделать пояснение: часы будут показывать время, включая соответствующие сочетания букв.

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

Таким образом получается, что программисту будет необходимо только предварительно настроить прошивку, введя в неё:

  • периодичность подключения к серверу;
  • логин и пароль для подключения к wi-fi точке доступа, находящейся в пределах досягаемости для часов.


Таким образом, самый простой и эффективный способ получения времени, — использование микроконтроллера с wi-fi модулем. В качестве такого микроконтроллера возьем esp32.

В качестве же средства подсветки букв — будем использовать адресную светодиодную ленту. Конкретно данный проект базируется на ленте WS2812B, с количеством светодиодов 30 шт/метр. Что такое адресная светодиодная лента, можно подробнее почитать тут, тут или тут.

Схема подключения адресной светодиодной ленты к esp32 видится такой:

3l1ua4l0jypzy5ru6fint7yh1sw.jpeg

Следуя вышеперечисленному алгоритму приступим к работе.

▍ Реализация 1 Этапа


Так как хотелось создать нечто максимально универсальное, ввиду того, что я не был совершенно уверен, какое количество слов и в каких комбинациях (сколько слов в строке) у меня получится, я решил написать генератор матрицы слов, который позволит достаточно гибким образом варьировать созданием матрицы и подобрать тот тип матрицы, который будет наиболее удовлетворять разработчика часов.

Для достижения цели я написал генератор на языке Java, в рамках среды IntelliJIDEA.

Вкратце пробежимся по его ключевым моментам.

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

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

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

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

Кроме того, генератор выводит непосредственно сверстанную матрицу слов, а также матрицу номеров, для данной длины строк.

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

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

Код генератора можно глянуть тут: github

Запустим программу заново, чтобы обновить вывод.
Например, для количества символов в строке, равному 41, вывод программы будет выглядеть следующим образом:

hb7sboyfdr-kdehwxlvcgmeynpu.jpeg

▍ Реализация 2 Этапа


После того, как у нас сформирован вывод программы, мы можем им воспользоваться в наших целях —, а именно, для предварительного формирования внешнего вида будущей матрицы, который мы собираем в программе Microsoft Word.

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

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

Для большего удобства, я раскрасил отдельные слова в таблице, в разные цвета (это можно увидеть в нижней таблице).

jmwm9mnzgsg5gyfnfyzv2cbtfem.jpeg

Далее мы начинаем обрабатывать получившуюся матрицу в программе CorelDraw.

Так как для подсветки будущих часов мы будем использовать ленту с количеством светодиодов в 60 штук на метр, и размером светодиода 5×5 мм, мы создаем соответствующий массив квадратиков в программе CorelDraw, копируем и вставляем из Ворда каждую строку со словами.

После того, как скопированная строка вставлена в CorelDraw, мы выделяем вставленную строку и нажимаем сочетание клавиш Ctrl+K.

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

image

Однако, данная работа была бы неполной, без преобразования получившихся букв — в буквы трафаретного типа. Так как будущую конструкцию часов мы оптимизируем под производство с применением лазерной резки, нам необходимо, чтобы каждая буква не содержала замкнутых объемов внутри (как например, буква О). Поэтому, все замкнутые объемы внутри букв мы соединяем перемычками с внешними объемами.

Для этого, мы предварительно выделяем все строки, вставленные в CorelDraw, с помощью комбинации Ctrl+A, затем переводим их в нередактируемый формат («в кривые») — комбинацией Ctrl+Q. Далее — вручную рисуем прямоугольничек и, передвигая его — прорезаем вручную каждую букву в матрице, чтобы превратить ее в трафаретный вид:

kwrmcq8xgcdy8c-5lcolbtewndw.jpeg

Далее нам остается только экспортировать получившуюся матрицу букв в ту программу твердотельного моделирования, которую вы предпочитаете, предварительно переведя её формат dxf.

Можно было бы всю работу проделать и в CorelDraw, — просто мне было так привычней и удобней.

После чего, я собрал следующую сборку, которая содержит:

  • лицевую панель с порезанной в ней матрицей слов;
  • панель с разделителями между буквами, — которая требуется для того, чтобы избежать паразитной засветки находящихся рядом букв, при их включении. Данная панель разделителя должна быть вырезана из-за какого-либо темного материала;
  • две панели-рассеиватели света, которые могут быть выполнены из белого пластика;
  • задняя часть часов закрывается пластиной-задником.
7g42twqz3sudxmjghc_to0jxcbu.jpeg

▍ Реализация 3 Этапа


И напоследок, следует сказать пару слов о электронной части проекта. Видится наиболее перспективным, в качестве микроконтроллера — использование платы esp32, ввиду встроенного в нее wifi модуля. Это позволит часам, с нужной периодичностью производить подключение к серверу, для синхронизации с мировым временем.

▍ Полезности и итоги


Прошивка проекта написана в среде Arduino IDE: github.

Скачать векторные файлы для лазерной резки, в формате pdf, можно по ссылке.

Для удобства, достаточно объемные функции void timeBurner (int hours, int minutes) и void timer ()  — выполнены в отдельных вкладках.

Логин и пароль, для подключения к вашей точке доступа wifi следует забивать в переменные: const char *ssid и const char *password.

Количество светодиодов в ленте — забивается в переменную NUMPIXELS. В моем случае это 164 пикселя (длина строки в символах, выводится программой-генератором матрицы слов на java, в самом начале статьи).

Периодичность подключения к серверу задается в переменной CheckPeriod, в миллисекундах.

Так как данный проект еще никем в реале не реализовывался, возможно, прошивка имеет некоторые погрешности и неочевидные ошибки — просьба отнестись с пониманием. В любом случае, наверняка, потребуется отладка.

Если Вам понравилась вся эта затея — у вас есть всё необходимое, чтобы реализовать свой собственный проект, основываясь на моем. Удачи в проектировании!


image-loader.svg

© Habrahabr.ru