Звісно, можливо, ваш годинник має резервну батарею, але мій має конвеєр розгортання!
Швидке прототипування! Автор: Lee Hutchinson
Я хотів годинник, якого, на моє роздратування, здавалося, не існувало.
З дитинства моїми настільними годинниками були серії дешевих, простих і довговічних червоних LED-годинників-радіо з семисегментним дисплеєм від Walmart або Target. Вони незмінно вимагали ручного втручання на початку та в кінці переходу на літній/зимовий час, а також щоразу, коли відбувалося мерехтіння живлення. Після нещодавнього короткочасного зникнення електроенергії, стоячи біля тумбочки, я тримав кнопку «TIME» і натискав кнопку «HOUR», як у мене вибухнула фрустрація, і я подумав: «Ми пройшли чверть 21-го століття. Має бути кращий спосіб!»
Мій ідеальний годинник мав би автоматично встановлювати час. Він би забезпечував автоматичне налаштування літнього/зимового часу (або ні, залежно від того, як пройде цей законопроєкт!). Він би керував дрейфом і завжди показував точний час із субсекундною точністю. Він би відображав цей час на червоному семисегментному дисплеї — не синьому, не зеленому, не жовтому, і вже точно не білому. І мені не довелося б встановлювати жодних шкідливих програм, що порушують конфіденційність, щоб він працював.
Просто? Ні. Хоча багато настільних годинників відповідають одній або, можливо, двом із цих вимог, я не зміг знайти нічого, що відповідало б усім. Годинники з резервним живленням і автоналаштуванням, що отримують оновлення через космічний ефір, існують вже багато років і майже задовольняють мої потреби, але біс мене поплутав знайти такий із червоним семисегментним дисплеєм, який би мені сподобався (можливо, чийсь пошуковий «кунг-фу» кращий за мій?).
Деякий час панував відчай. Але коли я закривав десятки вкладок браузера з марними пошуками та майже ідеальними, але все ж таки недосконалими сторінками продуктів, я подумав: «Зачекайте хвилинку. У мене є 3D-принтер. Я, наче, розумний і все таке. Чому б не купити семисегментний дисплей і не зробити власний годинник?»
І ось, стоячи на плечах гігантів, складених так високо, що я майже міг торкнутися Місяця, я це зробив.

О, новий чудовий світ, у якому є такі годинники!
Для тих, хто не зацікавлений у кількох тисячах нескінченних слів про процес, ось готовий репозиторій. Він містить список матеріалів із цінами та місцями придбання, програмне забезпечення та файли для 3D-друку.
Цей сміховинно переобтяжений вихідними проєктом, що маскується під годинник, міг би піти двома шляхами. Один, не обраний, починався з Arduino або мікроконтролера, подібного до Arduino. Інший почався з Raspberry Pi або комп’ютерного пристрою, подібного до Pi. Я обрав Pi, використовуючи як Raspberry Pi Zero W, так і Zero 2 W.
Моїм обґрунтуванням було те, що Pi надавав мені «заспокійливу ковдру» операційної системи на базі Debian, включаючи Wi-Fi та NTP для вимоги «годинник встановлює та оновлює себе сам», а також звичайний для Linux віддалений менеджмент, який я вже знаю.
Вибір семисегментного дисплея був простим: Adafruit виготовляє чудові дисплеї з LED-цифрами висотою 1,2 дюйма, схожими на циферблат годинника, і продає комплект, який поєднує потрібний мені дисплей із платою-«рюкзаком», що містить контролер HT16K33, необхідний для керування світлодіодами. Я замовив три й зрештою використав їх усі для тестування, складання та вивчення паяння.

Ах, так, паяння. Я ніколи раніше цього не робив, але семисегментний дисплей довелося припаяти до його плати-«рюкзака», тому я взяв набір «паяльник для першого класу» з Amazon і моток припою 60/40. (Мені також довелося купити настільну лупу, тому що, як я з’ясував, коли заглибився в це, мої старі очі вже не можуть так добре фокусуватися на близькій відстані, як раніше.)
Відклавши питання корпусу годинника — я був впевнений, що хтось інший уже розробив 3D-друкований корпус, сумісний із дисплеєм Adafruit, і я мав рацію — я сів зі своїм новим Pi Zero і почав досліджувати програмне забезпечення, яке йому доведеться запускати, щоб «говорити» мовою годинника. Я швидко зрозумів, що це виходить за межі моїх можливостей. Як я часто казав на цих сторінках, я — «оператор» у «devops»… хтось інший має принести «dev».
Годинник, що перевищує людський розум
Завантажувач образу RPi допоміг мені почати, і я зміг увійти до свого Pi Zero. Подумавши трохи, я скоротив свої програмні вимоги до такого списку:
- Хост годинника має бути доступний лише в локальній мережі і не мати доступу з Інтернету.
- Хост годинника має отримувати оновлення з дзеркала apt лише в локальній мережі.
- Хост годинника має синхронізувати NTP з NTP-сервера лише в локальній мережі.
- Служба годинника має бути службою systemd, що працює без привілеїв у контексті виділеного облікового запису служби.
- Служба годинника має використовувати системний час, тому ОС хоста керує NTP і підтримує нас у синхронізації, незалежно від того, чи діє літній/зимовий час, чи ні.
- Служба годинника має мати можливість вмикати та вимикати дисплей за розкладом, щоб він був вимкнений більшу частину дня, коли я не в спальні.
- Служба годинника також має мати можливість збільшувати/зменшувати яскравість дисплея за розкладом.
- Служба годинника має мати спосіб керування через CLI для термінальних з’єднань.
- Дисплей має бути керованим через HomeKit, оскільки я живу в екосистемі iOS.
- Служба годинника та її залежності мають бути встановлювані за допомогою одного скрипта.
- Після встановлення все має бути розгортається, щоб я міг надсилати оновлення за потреби, а не входити та перевстановлювати.
Багато з цих пунктів були легкими та цілком відповідали моєму звичному досвіду роботи з операційною системою. Я знову звернувся до добрих старих таймерів і служб systemd для значної частини завдань — мені насправді починає подобатися systemd, хай допоможе мені Бог. Джерела NTP та дзеркал apt у локальній мережі вже існували (знаю, знаю, замість цього слід було б використовувати apt-cacher-ng). Конвеєр розгортання використовував би Gitea actions і був би більш-менш таким самим, як той, який я вже налаштував для іншого проєкту, тому я запозичив у «минулого Лі». Інтеграція з HomeKit виглядала так, ніби це буде просто додаток завдяки HAP-python.
Але я почав хвилюватися, коли шукав приклади того, як спілкуватися з дисплеєм годинника через I2C. Мої сильно атрофовані м’язи Python вже напружувалися, і я абсолютно не зміг би впоратися з цим викликом. Саме в цей момент проєкт перестав бути веселим і почав здаватися неймовірно складним.
Тому я переклав завдання кодування на LLM.
«Ти навчив мене мови; і мій зиск від цього: я знаю, як писати код»
Звернення за допомогою до LLM, коли ви не можете реально перевірити результати, може бути ризикованим, але, на щастя, я пам’ятаю достатньо Python, щоб розібратися в результатах, з допомогою коментарів у коді. Claude Code виявився більш ніж достатньо здатним для вирішення цього проєкту — спочатку з Opus 4.8, а потім пізніше з новою вдосконаленою моделлю Fable, чиї руйнівні сили я приборкав і використав на проєкті, який, імовірно, насправді є завданням рівня стажера.
Це було схоже на застосування повної потужності «Зірки Смерті» для знищення комара, але це точно спрацювало. Результатом стала акуратна колекція файлів Python та невелика тестова програма. LLM зробила настільки хорошу роботу, що я також доручив їй інтеграцію з HomeKit, процедуру встановлення, деякі специфічні моменти щодо конвеєра розгортання та більшу частину документації репозиторію.
Я знаю, що це зізнання може бути анафемою для багатьох серед коментаторів Ars, але це як є — без LLM я б не завершив проєкт. Я б роздратувався, розлютився або просто втомився б від нескінченного читання постів на StackOverflow, які критикують те, що я намагаюся зробити, як дурне і неправильне.

Додаток є повноцінною службою systemd і слухає команди з HomeKit; його також можна керувати локально через Unix-сокет, якщо ви хочете, щоб дисплей робив щось із термінальної сесії. Служба працює під обліковим записом служби без привілеїв. Розгортання працює через дію Gitea, де я надсилаю тег до свого локального репозиторію Gitea, а виконавець створює артефакт випуску та надсилає його на Pi через окремий локальний обліковий запис служби, який може виконувати лише дії, пов’язані з розгортанням. (Робочий процес розгортання включено до репозиторію проєкту GitHub як адаптивний шаблон, на випадок, якщо хтось матиме точне таке ж налаштування, як у мене, і захоче скористатися цим.)
На всю глибину п’ять Autodesk лежить
З фізичного боку я справді знайшов 3D-друкований корпус із ліцензією Creative Commons, розроблений для того ж дисплея Adafruit, який я використовував, але він був не зовсім правильним.
Модифікація моделі означала битву з абсурдно недружнім до користувача кошмаром Autodesk Fusion, тому я зібрався з духом і занурився — і натрапив на ще одну стіну. Параметричне моделювання, особливо обтяжене десятиліцями дурних виборів UI/UX AutoCAD, було ще складнішим, ніж програмування.

Але Fusion тепер постачається з MCP-сервером, тому я потенційно міг би дозволити LLM віддалено керувати програмою та внести зміни за мене. Чи може бути так просто?

Відповідь виявилася як «так», так і «не зовсім». Спочатку я спробував свої модифікації з квантованою версією Qwen 3.6-35B (саме цією), що працює локально на Acer Veriton GN100 з GB10, про який я пишу довгостроковий огляд для Ars.
Qwen 3.6 майже впорався із завданням, зробивши одну з моїх змін, але з іншою помилився; я знову звернувся до Claude Code та Fable, щоб вони зробили більшість коригувань моделі. Тим не менш, локальна модель була інтригуючою, і я повернуся до неї в майбутній статті.
З чого зроблені прототипи
Як тільки програмне забезпечення почало набувати форми, а посилки були доставлені, настав час розпочати прототипування. Я зайняв кухонний стіл, встановив свій новий паяльник і спробував зібрати свій перший дисплей Adafruit і «рюкзак», не знищивши їх обох — і мені це майже вдалося!

Натхненний тим, що не надто зіпсував паяння, і маючи тепер робочий дисплей для експериментів, я продовжив. Наступне, що потрібно було вирішити, це те, що хоча дисплей Adafruit має можливість затемнення, навіть при мінімальному затемненні він все одно виявлявся занадто яскравим для темної спальні. Це означало, що мені знадобиться щось перед ним, щоб блокувати світло.

B&H Photo прийшов на допомогу, оскільки він має рулони матеріалу для нейтрального світлофільтра за відносно низькою ціною. Однак це виявилося крихким і дуже схильним до збору відбитків пальців, тому я поєднав NDF із затемненим акрилом, що означало пошук постачальника, який би продав мені невеликі кількості акрилового матеріалу, вирізаного за розміром. (Я знайшов двох — це місце і це місце.)
Один акриловий шматок плюс одна смуга 12-відсоткового NDF зменшили яскравість дисплея приблизно до ідеального рівня, порівнянного з моїм існуючим дешевим настільним годинником.
Наступною проблемою була ітерація через усі необхідні зміни моделі для інтеграції акрилу та NDF у корпус годинника. Я (за допомогою магії LLM MCP) розбив існуючий дизайн на кілька окремих частин і вирізав кишеню для акрилової панелі; я також попросив LLM додати направляючі штифти та отвори для кожної частини. Це все було можливо зробити без створення будь-яких нависань, тому все це друкувалося без необхідності опор.

Я переглянув щонайменше три основні версії всього, і я дуже задоволений кінцевим результатом. Остаточна версія в основному тримається разом, хоча передня рамка потребує або трохи електричної стрічки, або кількох крапель суперклею, щоб залишатися прикріпленою. Я міг би виправити це, змінивши направляючі штифти так, щоб вони защіпалися, а не просто сиділи там, але стрічка мені підходить.
Година настала
Кінцевий результат точно відповідав моїм очікуванням — найкращий критерій успіху, який я можу собі уявити. З LLM, що виконувала основну роботу з кодуванням та CAD, я думаю, я витратив більше часу на очікування поставок, ніж на будь-що інше — це можна пояснити моєю відсутністю планування та легкістю доставки наступного дня.
Ось готовий пристрій, спочатку по частинах, а потім зібраний:
Годинник до збирання… Автор: Lee Hutchinson
…і після!
І, дивіться! Підтримка HomeKit!

І він розгортається!

Для тих, хто, можливо, думає наслідувати мій приклад і створити власне 3D-друковане втілення нестримного, необмеженого годинникового надмірності — можливо, тому, що поруч немає дорослих, які б сказали вам цього не робити — існує багато різних способів підійти до цього завдання. Використання коду LLM, очевидно, є вибором, і ви можете зробити інший. Пристрої Raspberry Pi будь-якого типу зараз надзвичайно дефіцитні, тому хтось із кращими навичками програмування або з надмірним почуттям пригод може спробувати це з мікроконтролером ESP32 замість Pi Zero. Насправді, ESP32, ймовірно, є кращим вибором для керування дисплеєм Adafruit, і він постачається з підтримкою Wi-Fi та I2C без необхідності завантажувати Debian.
У будь-якому разі, це був чудовий хобі-проєкт. Мені вдалося паяти, що було і складніше, і легше, ніж я очікував. Я використав кілометри філаменту, друкуючи та передруковуючи різні версії корпусу. І я багато чому навчився.
Я витратив… ну, значно більше грошей, ніж планував, між кількома помилковими спробами, паяльником і набором, а також додатковими витратними матеріалами для резерву та повторних спроб. І я міг би піти на компроміс і придбати звичайний годинник, який робить більшу частину того, що я хочу. Але досвід був веселим, а радість від отримання саме того, що я хочу, безцінна.
Для тих, хто хоче побачити, як працює код, або адаптувати щось із нього для власних потреб, ось репозиторій. Насолоджуйтесь! Я буду тут, займатися CI/CD з моїм настільним годинником, що є абсолютно нормальним і правильним заняттям для нормальних людей!
Лі Хатчінсон
Старший редактор з технологій
Лі — старший редактор з технологій, який відповідає за розробку матеріалів для розділів про гаджети, культуру, ІТ та відео Ars Technica. Багаторічний член Ars OpenForum з великим досвідом роботи в галузі корпоративного зберігання даних та безпеки, він живе в Х’юстоні.
Оригінал статті: arstechnica.com
