
Это история о том, к чему привело моё желание иметь часы, которые в магазине не купишь.
Ещё с детских лет у моей кровати всегда стояли какие-нибудь дешёвые часы с красными семисегментными индикаторами и функцией радио, купленные в Walmart или Target. Это всегда были дешёвые, простые и живучие модели — вот только все они неизменно требовали ручной подстройки при переходе не летнее/зимнее время и при сбое питания. И после недавнего такого сбоя, когда я в очередной раз стоял у тумбочки, зажав кнопку «TIME» и лихорадочно нажимая кнопку «HOUR», моё терпение лопнуло: «Мы прожили уже четверть 21-го века. Должен же быть какой-то более совершенный способ!»
В моём представлении идеальные часы должны уметь сами настраивать время. Они должны автоматически переходить на летний/зимний режим (или нет, в зависимости от того, чем закончится этот законопроект) и компенсировать погрешность хода, всегда показывая точное время вплоть до миллисекунд. Плюс они должны показывать это время на семисегментном дисплее именно с красными цифрами — не синими, не зелёными, не жёлтыми и уж точно не белыми. И всё это не должно требовать установки всяческих мусорных шпионских приложений.
Просто? Как бы не так. Несмотря на то, что многие прикроватные часы отвечают одному или двум из этих критериев, я не смог найти такие, которые бы отвечали всем. «Атомные» самонастраивающиеся модели с батареей, которые получают обновление информации из «космического эфира», являются передовым достижением уже многие годы и обеспечивают максимум из моих запросов. Но вот проклятье — найти такие с нужной мне красной индикацией оказалось нереально (может, среди читателей есть более матёрые сенсеи поиска?)
Какое-то время я пребывал в отчаянии. Но когда я в очередной раз закрывал десятки вкладок браузера с безуспешными результатами поиска и страницами товаров из разряда «близко, но не то», меня осенило: «Стоп. У меня же есть 3D-принтер. Да и голова вроде неплохо варит. Почему бы мне не купить семисегментный дисплей и не собрать собственные часы?»
И вот, взобравшись на плечи титанов — причём так высоко, что можно было дотянуться до Луны — я это сделал.

О дивный новый мир, в котором есть такие часы
Для тех, кто не желает читать несколько тысяч слов моих пространных рассуждений о реализации процесса, вот итоговый репозиторий. В нём лежит список всех материалов с ценами и местами покупки, а также сопутствующее ПО и файлы для 3D-печати.
Всего было два пути, по которым мог пойти этот до смешного переусложнённый проект выходного дня, замаскированный под часы. Первый — от которого я отказался — должен был начинаться с микроконтроллера Arduino или ему подобного. Второй же опирался на Raspberry Pi или его аналог. В итоге я выбрал Pi и поочерёдно использовал Raspberry Pi Zero W и Zero 2 W.
Моя логика заключалась в том, что Pi станет для меня знакомой территорией за счёт своей операционки на базе Debian. Во-первых, здесь из коробки есть поддержка Wi-Fi и NTP, которые полностью закрывали потребность в «автоматической установке и обновлении времени». Во-вторых, работа в Debian позволяла использовать привычный мне процесс удалённого управления через Linux.
Выбрать семисегментный дисплей было несложно. Компания Adafruit выпускает прекрасные LED-дисплеи в стиле часового табло с цифрами высотой 1,2 дюйма. К тому же, она продаёт готовые наборы, где нужный мне дисплей комплектуется дочерней платой на базе контроллера HT16K33, необходимого для управления светодиодами. Я заказал три таких и в конечном итоге использовал их все для тестирования, сборки и отработки правильной пайки.

О да, пайка. Я этим никогда раньше не занимался. Но дисплей как-то нужно припаять к дочерней плате, поэтому я заказал на Amazon простейший стартовый паяльный набор и моток припоя 60/40. (Ещё мне пришлось купить настольную линзу, так как в моменте я осознал, что мои старые глаза уже совсем не те).
Вопрос с корпусом я поначалу отложил, так как был уверен, что кто-то уже наверняка разработал 3D-печатную модель под этот дисплей — и оказался прав. Первым делом я сел за стол со своим новеньким Pi Zero и начал ковыряться с софтом, который ему потребуется для управления часами. И здесь я быстро понял, что пытаюсь прыгнуть выше головы. Как я неоднократно писал в своём блоге, в концепции «devops» я отвечаю только за «ops», а за «dev» должен отвечать кто-то другой.
Часы, непостижимые для человеческого ума
С помощью Raspberry Pi Imager я записал образ на свой Pi Zero и смог в нём авторизоваться. Немного поразмыслив, я собрал все свои требования к ПО в список:
Система должна работать только в локальной сети и быть недоступной из интернета.
Система должна получать обновления только из локального зеркала репозитория APT.
Часы должны синхронизировать время исключительно с локальным NTP-сервером.
Служба часов должна быть реализована как сервис systemd и запускаться без привилегий в среде отдельной сервисной учётной записи.
Служба часов должна использовать системное время, чтобы ОС хоста сама рулила NTP-синхронизацией и следила за всеми переходами (или непереходами) на летнее/зимнее время.
Служба часов должна уметь включать и выключать дисплей по расписанию, чтобы он был погашен большую часть дня, пока меня нет в спальне.
Она также должна уметь менять яркость дисплея по расписанию.
Необходима возможность управления службой часов через CLI при подключении через терминал.
Дисплей должен управляться через HomeKit, так как я обитаю в пространстве iOS.
Служба часов и её зависимости должны устанавливаться одним скриптом.
После первичной установки весь процесс обновления должен быть автоматизирован, чтобы я мог просто пушить необходимые обновления по сети без необходимости каждый раз подключаться к плате и вручную переустанавливать софт.
Многие из этих пунктов оказались в моей типичной компетенции админа, и реализовать их было несложно. Значительную часть я воплотил с помощью старых-добрых служб и таймеров systemd — как ни странно, мне этот демон даже начинает нравится. Локальный NTP-сервер и зеркало APT у меня уже были (да, знаю, нужно было использовать apt-cacher-ng). Пайплайн деплоя я решил запустить через Gitea Actions, и он был примерно похож на тот, который я ранее настроил для другого проекта. Так что здесь я просто списал у себя из прошлого. Ну а интеграция HomeKit должна была вообще пройти гладко, благодаря библиотеке HAP-python.
Но я не на шутку обеспокоился, когда взглянул на примеры того, как взаимодействовать с дисплеем часов через I2C. Моя изрядно атрофированная «мускулатура» Python уже напряглась до предела и явно не была готова к этому испытанию. На этом этапе проект перестал казаться мне увлекательным и перешёл в разряд крайне сложных.
Тогда я решил переложить задачи по программированию на плечи LLM.
«Вы обучили меня языку, и моя выгода в том, что теперь я умею программировать»
Обращаться за помощью к LLM, когда ты сам не можешь проверить её результаты — дело рисковое. Но, к счастью, я помнил Python достаточно, чтобы с горем пополам продираться через выдачу ИИ, опираясь на встроенные в код комментарии. Claude Code оказалось вполне по силам осуществить этот проект — сначала на базе Opus 4.8, а затем и с помощью новой навороченной Fable, чью колоссальную мощь я задействовал для задачи, которую наверняка решил бы и джуниор.
Складывалось ощущение, будто я пытаюсь убить комара лучом Звезды смерти. Но главное сработало! На выходе я получил опрятную коллекцию файлов Python и небольшой тестовый набор. ИИ так хорошо постарался, что я даже поручил ему интеграцию HomeKit, написание скрипта установки, некоторые детали деплоя и основную часть документации.
Я понимаю, что это признание может послужить поводом для анафемы со стороны многих участников Ars Technica, но что есть, то есть — без ИИ я бы просто не закончил проект. Я бы испытал кучу смешанных чувств — от раздражения и злости до банальной усталости — читая бесконечные ответы на StackOverflow, где мой замысел и действия критиковали бы как тупые или неправильные.

Итоговое приложение представляет собой полноценную службу systemd, которая принимает команды от HomeKit. Если вы хотите управлять дисплеем через терминал, то это тоже можно делать локально через Unix-сокет. Служба запускается от имени непривилегированной учётной записи. Развёртывание происходит через Gitea Action: я пушу тег в свой локальный репозиторий Gitea, а раннер создаёт итоговый артефакт и отправляет его на Pi через отдельную локальную служебную учётку, которая может выполнять только действия по развёртыванию. (Этот воркфлоу включён в репозиторий проекта в виде адаптируемого шаблона — на случай, если у кого-то окажется такая же конфигурация, и он решит его использовать).
На глубине пяти саженей Autodesk лежит
Теперь пришло время заняться корпусом. Я действительно нашёл подходящую модель для 3D-печати, спроектированную как раз под выбранный мной дисплей Adafruit. Правда, она всё же требовала доработки.
И здесь для изменения этой модели требовалось вступить в схватку с невероятно враждебным для пользователя кошмаром под названием Autodesk Fusion. Так что я подпоясал чресла и ринулся в бой! Но тут же наткнулся на очередное препятствие — параметрическое моделирование, особенно отягощённое десятилетиями дурацких решений по организации UI/UX, оказалось ещё сложнее программирования.

Но Fusion теперь поставляется со встроенным MCP-сервером, поэтому я мог позволить LLM удалённо управлять приложением и вносить изменения от моего лица. Неужели всё может быть настолько просто?

И ответ оказался неоднозначный — вроде бы и да, но с оговорками. Сначала я попробовал внести изменения с помощью квантованной Qwen 3.6-35B (конкретно этой), запущенной локально на мини-ПК Acer Veriton GN100 с суперчипом GB10. Про этот аппарат я как раз готовлю большой долгосрочный обзор для Ars.
И Qwen 3.6 почти справилась, решив одну мою задачу, но провалив другую. Тогда для внесения в модель необходимых корректировок я решил снова прибегнуть к Claude Code и Fable. И всё же локальная модель меня заинтриговала, так что я планирую вернуться к ней в одной из будущих статей.
Как рождаются прототипы
Как только программное обеспечение начало обретать завершённую форму, и я получил все необходимые компоненты, пришло время приступать к прототипированию. Я расположился за кухонным столом, подготовил свой новенький паяльник и попытался аккуратно соединить первый дисплей Adafruit с дочерней платой, не угробив и то, и другое. У меня почти получилось!

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

Выручил меня магазин B&H Photo, где рулоны нейтрально-серого светофильтра продаются относительно дёшево. Правда, они оказались довольно хрупкими и маркими для отпечатков пальцев, поэтому в итоге я совместил NDF с тонированным акрилом, для чего пришлось найти поставщика, который бы продал мне небольшой отрез этого материала. (Нашёл даже двух: вот и вот).
Одного акрилового слоя и одной полоски 12% NDF как раз хватило, чтобы достичь оптимальной яркости дисплея, близкой к яркости моих текущих прикроватных часов.
Следующей сложностью стало поэтапное внесение всех изменений, необходимых для встраивания акрилового стекла и NDF в корпус часов. В итоге (с помощью той же магической связки LLM-MCP) я разделил схему часов на большее число частей и вырезал пространство под акриловую лицевую панель. Я также попросил LLM добавить направляющие штифты и пазы для каждой детали. Всё это удалось реализовать без нависающих элементов, так что добавлять в исходную конструкцию поддержки не пришлось.

Я прошёл через как минимум три значительных ревизии корпуса, и очень доволен полученным результатом. Итоговая конструкция собирается достаточно плотно — разве что переднюю рамку нужно будет зафиксировать изолентой или парой капель суперклея. Я мог бы исправить это, изменив направляющие штифты так, чтобы они защёлкивались, а не просто вставлялись, но меня вполне устраивает изолента.
Вот и пробил час
Конечный результат полностью соответствовал моим ожиданиям, что для меня является лучшим критерием успеха. С учётом того, что ИИ решил все основные задачи с кодом и CAD, я в итоге дольше прождал доставки необходимых компонентов. Думаю, всё дело в недостатке навыка планирования и привычке полагаться на быструю доставку следующим днём.
Вот готовый девайс — сначала по частям и затем в собранном виде:


А ещё и поддержка HomeKit!

И никаких проблем с деплоем!

Если вы пойдёте по моим стопам и решите создать собственное 3D-печатное воплощение часового сибаритства — возможно, потому что рядом не окажется кого-то разумного, чтобы вас остановить — то сделать это можно по-разному. К примеру, вы вполне можете решить не использовать код от ИИ. Малинок на рынке нынче немного, поэтому люди с более уверенными навыками программирования или выраженной тягой к приключениям могут попробовать реализовать затею на ESP32, а не на Pi Zero. Честно говоря, ESP32, пожалуй, станет более грамотным выбором для управления дисплеем Adafruit, так как он по умолчанию поддерживает Wi-Fi и I2C, не требуя тащить прицепом Debian.
Как бы то ни было, хобби-проект получился зачётный. Я попрактиковался в пайке, что с одной стороны оказалось труднее, чем я ожидал, а с другой — проще. Я использовал километры филамента для печати и повторной печати разных вариантов корпуса. Да и в целом я узнал много нового.
Денег, конечно, ушло больше, чем я рассчитывал — это и первые неудачные попытки, и покупка паяльника с набором, и куча запасных частей на случай переделок. Плюс я мог пойти на компромисс и приобрести обычные часы, которые умеют почти всё, что мне нужно. Но процесс получился увлекательным, а удовольствие от получения именно того, что я хотел — бесценно.
Для тех, кто хочет посмотреть, как работает код, или адаптировать его под свои нужды, вот ссылка на репозиторий. Пользуйтесь на здоровье! Ну а я пойду понастраиваю автодеплой для часов в своей спальне — ведь именно так и делают все нормальные люди.
Комментарии (9)

x89377
09.08.2026 10:03ДВЕНАДЦАТЬДВАТРИ
ЧЕТЫРЕПЯТЬВОСЕМЬ
ОДИННАДЦАТЬШЕСТЬ
ЧАСАДЕВЯТЬДЕСЯТЬ
ЧАСОВ ПЯТНАДЦАТЬ
ПЯТЬДЕСЯТЬ СОРОК
ДВАДЦАТЬТРИДЦАТЬ
ПЯТЬ РОВНО МИНУТ
Я себе такие сделал. 16х8 white led. Точность 5 минут

tklim
09.08.2026 10:03В любом Лидле или воллмарте всегда можно купить часы с dcf77 или их американским аналогом. И оно "работает как часы".
А если надо вай-фай и NTP - хватит как писали выше WeMos d1. Ну или любую другую плату с esp. Малина тут не то что избыточна, просто дичь.

quarus
09.08.2026 10:03Я очень долго искал часы с NTP синхронизацией... очень доволен этими, с AliExpress: https://ali.click/bumwi1p

7octaprog7
09.08.2026 10:03Автор мог бы сделать цифры красными для вечера, ночи и зелеными для утра и дня.

xSVPx
09.08.2026 10:03Если открыть для себя RTC, то проблему можно решить гораздо надёжнее гораздо более простыми правильными и дешевыми способами.

586
09.08.2026 10:03всегда показывая точное время вплоть до миллисекунд
Как это согласуется с индикатором на 4 цифры? Он же даже секунды не показывает!
В результате получилась маленькая коробочка. А как и от чего она запитана? Её ещё к чему-то подключать надо?

Sly_tom_cat
09.08.2026 10:03Так время смены младшей цифры - это вполне себе миллисикундно измеримая метрика.

Sly_tom_cat
09.08.2026 10:03Складывалось ощущение, будто я пытаюсь убить комара лучом Звезды смерти.
... ну почему ощущение, так оно и получилось. Причем даже ESP32 тут - возможно перебор.
darwin_usb
Так такие часы давно уже входят в комплект примеров. Wemos mini самое то для этого проекта.