Собираем не совсем обычные настольные часы с цветным дисплеем

Пост опубликован в блогах iXBT.com, его автор не имеет отношения к редакции iXBT.com

История создания этих часов довольно необычна и забавна. У меня есть знакомый, который занимается сьемкой всякого альтернативного кино в стиле «артхауc», «нуар», «ню» и так далее. Однажды он пришёл ко мне с проблемой – по сценарию, им в фильме нужны были электронные часы на 7-сегментных индикаторах, меняющих цвет, которые могут вести обратный отсчёт, типа бомбы с таймером. Готовых часов на 7-сегментных индикаторах полно, но практически у всех оказалась одна неприятная особенность – сегменты зажигаются попеременно, с достаточно низкой частотой, порядка 200-700 гц (так называемое мультиплексирование), и на видео это выглядит как сильное мерцание или вообще пропадание некоторых сегментов. Знакомый был настолько заинтересован часами с нужным функционалом, что пришёл ко мне не один, а в компании двух портретов Бенджамина Франклина, которые вскоре поменяли локацию с его бумажника на мой, и работа началась.


Так как было нужно, чтобы ничего не мерцало, надо делать статическую индикацию. Для этого можно применить что-то классическое, типа CD4511, SN74LS47, но так как эти чипы поддерживают отображение только цифр, а знакомому были нужны и другие символы, этот вариант не подходил. По этой же причине я решил взять МК в 40-ножечном корпусе и управлять сегментами напрямую, а для регулировки яркости и цветов использовать встроенный в МК ШИМ-генератор, который будет работать на частоте 32 кГц, и тем самым исключит мерцание.

Схема, сборка и комплектующие

Схему отдельно не рисовал, начал сразу рисовать плату, так что схема – только словами.

  • В качестве «сердца» часов я применил МК PIC16F887 в DIP-40 корпусе.
  • Отсчёт времени обеспечивает микросхема DS3231.
  • Автономность хода часов при отсутствии питания обеспечивается ионистором на 0,47 ф, 5,5 вольт. Его хватает приблизительно на 3-4 суток без внешнего питания.
  • В качестве индикаторов применены двухцветные LED-модули KYX12101BHG (Ярко-красный и зелёный цвета, общий анод: https://item.taobao.com/item.htm?id=590631082765). Выбор этих индикаторов, как и максимально компактный размер платы был обусловлен желанием заказчика поместить «новые» часы в уже имеющийся корпус.
  • Аноды модулей через транзисторы 2SB772 включены на выход встроенного в МК ШИМ-генератора.
  • В качестве разделительных точек выступают 5мм светодиоды оранжевого цвета.
  • Для управления и настройки часов применены две кнопки, подключенные через резисторы разных номиналов к входу АЦП МК.
  • Так как оставались неиспользованные выводы МК, то я решил добавить функции будильника – реализована на «активном» бипере и транзисторе BC547 — и измерения температуры с применением DS18B20. Термометр подключается к ICSP-коннектору на контакты, помеченные как DAT, GND, VCC, при этом между VCC & DAT также подключается резистор на 4,7К.
  • Для упрощения сборки количество SMD компонентов сведено к одной микросхеме — DS3231. Эта микросхема довольно крупная, расстояние между ножками тоже приличное, так что её вполне можно припаять и обычным паяльником.
  • Питание на плату поступает по порту USB Type-C, и при максимальной яркости сегментов потребление составляет порядка 80 мА.

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

Двухцветные индикаторы выбранного типоразмера бывают как с параллельным включением светодиодов (редко), так и последовательным (часто). И если в случае с красно-зелёными индикаторами особых проблем при последовательном включении не возникает (да, зелёный чуть тускловат, но это малозаметно), то если применить, скажем, красно-синие индикаторы, то при питании от 5 вольт получим что, красные сегменты будут гореть на полную яркость, а синие – вообще не будут гореть. Это происходит из-за разного падения напряжения на светодиодах – 2 вольта на красных, 3,3 вольта на синих, что в случае с последовательным включением сегментов даст 4 и 6,6 вольт соответственно.

Для исключения таких проблем надо или использовать индикаторы с параллельным включением диодов, или делать другой вариант платы, чтобы на диоды подавалось напряжение чуть повыше, приблизительно 6.3 вольта. Напрямую повышать напряжение питание нельзя — МК и микросхема часов могут сгореть. Здесь придётся использовать внешний блок питания на, скажем, 6 вольт. При этом 5 вольт, нужные для работы красных сегментов, логики и микросхемы часов, получаются с использованием стабилизатора типа 7805, а «высокое» напряжение напрямую подаётся на транзистор, который управляет яркостью синих сегментов.


Так как изначально плата не предусматривала такой функционал, её пришлось немножко доработать. В «новом» варианте платы я оптимизировал и общую разводку – теперь колодка ICSP имеет «правильный» вид, а не раскидана по плате, бипер отодвинут чуть в сторону и не мешает крепежному винту. Однако первый вариант платы был собран в нескольких экземплярах и проблем при работе с ним не было обнаружено – на фото далее именно он, так что не надо удивляться, что на рисунке одна плата, а на фото – другая.

Все детали на плате подписаны своими номиналами, допустимы вариации в пределах ±10%. Как можно видеть по фото, у меня вообще не было 100-Омных резисторов, поставил два по 220 Ом параллельно. Резисторы – 0,125 Вт. Можно и 0,25 Вт, но их придётся ставить «боком».

Если будете собирать вариант с точно теми же индикаторами, что использовал я, то микросхему 7805 ставить не надо. Вместо неё надо поставить перемычку на плату в отверстия для ножек 1 и 3 (крайние слева и справа) этой микросхемы. Если же применяем, скажем, индикаторы с сегментами с красным и синим свечением и последовательным включением диодов, то микросхему уже придётся ставить, а на часы подавать питание в пределах 6-7 вольт.

Последовательность сборки платы такая:

  1. Припаиваем DS3231
  2. Припаиваем все остальные компоненты, кроме индикаторов
  3. Продеваем в угловые отверстия 4 винта М3 с плоской головкой
  4. Припаиваем индикаторы

Я вот не последовал этому порядку — забыл вставить винты до индикаторов. В результате надо было либо выпаивать индикаторы, либо вклеить проставки в плату — я выбрал второе:

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


Дочки попросили часы для своей комнаты – мол, неудобно каждый раз в смартфон или планшет смотреть, особенно, когда в кровати лежишь. Можно было купить что-то готовое, но комсомольцы не ищут простых путей, и я решил, раз «железо» есть, то можно написать обычную прошивку для обычных людей и сделать часам простой корпус. Прошивку писал в свободное время, по настроению, в результате чего этот процесс растянулся почти на три месяца – да и программист я так себе. Но наконец-то прошивка доведена до состояния «можно использовать», и часы готовы.

Прошивка, настройки, баги и фичи

Программно часы работают следующим образом:

При включении сразу отображается надпись Hello, которая плавно меняет цвет. В это время происходит «загрузка» часов, опрашиваются микросхема таймера и инициализируется микросхема термометра. Если последняя не обнаружена, то индикация температуры пропадает из рабочего режима часов. После того как часы загрузились, на дисплее отображается текущее время и раз в минуту – текущая температура (если микросхема термометра была обнаружена), а кнопки обеспечивают следующие функции:

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

При нажатии же левой (красной) кнопки попадаем в меню настроек. Слева двумя буквами латинского алфавита отображается название пункта меню, а справа – текущее значение выбранного параметра. Всего в меню 13 пунктов:

  1. Yr (year) — Установка года, можно выбрать в диапазоне 2021-2099.
  2. tH (month) – Установка текущего месяца.
  3. dt (date) – Установка даты.
  4. dY (day) –Установка дня недели. 0 – Понедельник, 7 – Воскресенье.
  5. Hr (hour) – Установка часов.
  6. Ut (minute) – Установка минут.
  7. dF (display format) – Выбор формата отображения времени: 12 или 24-часовой формат.
  8. AH (alarm hour) – Установка часов срабатывания будильника.
  9. At (alarm minute) – Установка минут срабатывания будильника.
  10. AE (Alarm enable) – Выбор режима будильника: 00 –выключено. 01 – работает всю неделю, 02 – работает только по рабочим дням.
  11. Tr (time readjust) – Корректор времени (об этом подробнее ниже).
  12. Dh (display hue) – Выбор цвета дисплея. Всего доступно 16 значений, от чистого зеленого через лимонно-желтый и оранжевый до ярко-красного.
  13. tF (temperature format) — Формат отображения температуры — в Цельсиях или в Фаренгейтах.
  14. Ft (font type) – Выбор типа шрифта (подробнее – ниже).
  15. Rt (Return) – Выход в основной режим.

А теперь про Tr и Ft. Многие китайские клоны микросхемы DS3231 страдают проблемой отставания — такие микросхемы считают время хотя и стабильно, но медленно. Такие часы могут за сутки отставать на несколько секунд, что в итоге даёт заметное отставание за неделю и месяц. Значение Tr прибавляет к показаниям часов от 1 до 15 секунд в 23:59:30 каждый вечер, тем самым компенсируя отставание часов. Если же у вас нормальный чип, то этот параметр можно не трогать и оставить на дефолтном значении (30).

Настройкой Ft можно выбирать начертание отображаемых цифр. Многие, наверное, не знают, но для 7-сегментных индикаторов существуют 3 разных начертания цифр:

  • «Американская» — 6, 7 и 9 не имеют хвостиков.
  • «Европейская» — 6 и 9 с хвостиками, 7 – без.
  • «Японская» — 6, 7 и 9 с хвостиками.

При настройке начертания в меню в качестве пунктов отображаются ключевые отличия. Это 79 для «US», 67 для «EU», 76 для «JP». Была идея для «US» писать 69, но я решил отказаться, дабы избежать ненужных ассоциаций.

Для наглядности — фото вариантов.

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

Например: текущее время 11:05. Вы зашли в меню настройки часов, пролистали пункты и дошли до установки минут. Часы покажут «05». Вы в это время отвлеклись и отошли от часов на пару минут. Вернувшись к часам, вы решили минуты не трогать и нажали на кнопку перехода в следующий пункт меню. В это время в часы будет записано значение 05. Это происходит из-за того, что в момент входа в пункт выбирается текущее значение, и оно же пишется в момент выхода, если вы не меняли настройку. Если между «входом» и «выходом» прошло несколько секунд, то изменения незаметны. Если же прошло больше времени, а мы записали в часы «старое» значение, может появиться ощущение, что часы отстают.

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

В целом, индивидуальное управление сегментами даёт много возможностей для творчества – можно написать код, чтобы все сегменты имели свой цвет, цифры «переливались» одна в другую и еще много чего интересного. Например, я уже реализовал функцию измерения относительной влажности, сейчас работаю над барометром — в итоге будет у меня мини-метеостанция).

И да, насчёт отставания. Учтите: если будете подавать питание с ПК и программа-прошивальшик на ПК будет в этот момент активна (PicKit standalone softwareб MPLAB IDE), то часы будут сильно отставать. Это фича самого режима ICSP, а не баг прошивки. Я в свое время, пока не догадался о причине, много нервов потратил. С обычным питанием, естественно, никаких проблем не будет.

Корпус

Детали для корпуса часов я вырезал лазерным резаком из 3мм фанеры и прозрачного оргстекла. После того как я собрал и склеил корпус (использовал прозрачный эпоксидный клей), внешние поверхности обработал наждачной бумагой, скруглив углы, и обклеил самоклеящейся синтетической кожей розовато-красного цвета: как я уже говорил, эти часы делались для девичьей комнаты, а там похожие цвета уже применены в дизайне. По идее, светло-розовый бы подошёл больше, но кожзама такого цвета у меня не было. Корпус с внутренней стороны пришлось зачернить маркером, так как свет от сегментов индикатора подсвечивал его изнутри, и выглядело всё неряшливо. Также пришлось чернить и боковины индикаторов: изначально они были белые и тоже неплохо отражали свет.

Передняя панель часов изготовлена из дымчатого оргстекла толщиной 3мм. Из этого же материала цвета слоновой кости я сделал боковые ножки-упоры. Узел крепления ножек к корпусу получился простым, но тем не менее, он одновременно обеспечивает и плотный прижим, чтобы часы не прокручивались под своим весом, и возможность плавной регулировки угла наклона. Конструктивно узел состоит из нейлоновой шайбы, зажатой между ножками-упорами и корпусом часов декоративным винтом с круглой головкой. Сам винт вкручивается в предварительно вклеенную в фанеру граверную гайку и зафиксирован каплей эпоксидного клея, чтобы конструкция не раскручивалась.

На обратной стороне (тоже из 3мм оргстекла) размещены кнопки управления, порт USB Type-C и несколько вентиляционных вырезов. Основная плата часов крепится именно к задней панели, которую в случае необходимости можно быстро демонтировать, открутив четыре крепежных шурупа по углам.

Вроде все: часы собраны, фото сделаны, статья написана :) Все чертежи, схемы и прошивки бесплатны – пишите, если заинтересовались, выложу в открытый доступ.

P.S. Некоторые читатели спрашивают, как я делаю фото для обзоров: какую аппаратуру и как использую? Для конкретного случая ответ на фото ниже. Используются:

  • фотоаппарат Sony A77Mk2 с китовым объективом (18-50 мм)
  • синхронизатор Godox
  • внешняя вспышка Godox TT685S+Бустер

Настройки фотоаппарата – ISO 400, 1/25, F9.0, Rear sync, WB – 4800K. Фотоаппарат установлен на штативе, и используется ИК ПДУ, чтобы меня не было видно в зеркале. Вспышка работает в режиме ADI, направлена в потолок и обеспечивает заполняющий свет.

 По вашим просьбам, заново выкладываю прошивку и герберы:

  • http://www.tiktoki.ge/bicolor.rar — Герберы, подготовленные для изготовления в JLCPCB
  • http://www.tiktoki.ge/bicolor.firmware.rar — прошивка

Кстати, я немножечко улучшил прошивку, и теперь в ней будильник играет известный ритм от Casio VL-1 — VL Rock (Trio — Da da da). По ссылке выше — старая прошивка. Как новую докончу, тоже выложу.