Найти тему
Пикабу

Часы-будильник на Ардуино

Здравствуйте.

Пост для любителей сделать что-то на Ардуино. Обычно сразу после проекта мигания светодиодиком наступает кризис жанра. Хочется сделать что-то эдакое, а что – непонятно. Я сделал часы. Хотя в моем случае сначала был проект с GPS-меткой, но не важно. Далее будет много скучного технического текста.

Итак, однажды у меня на столе одновременно оказались ардуинка Nano 3.0 Atmega328 и цифровой индикатор от мертвой мультиварки. Картинки из интернета просто для информации:

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

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

Для настройки сделал одну кнопку. Долгое нажатие – включает редактирование разряда, и он начинает мигать, короткое – инкремент разряда.

Всю схему упаковал в пластиковую коробочку. Туда же добавил небольшой аккумулятор и платку с контроллером заряда. Примерно такие, только АКБ у меня на 130 мАч:

.
.

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

Часы завелись практически сразу и порадовали меня индикацией времени.

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

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

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

-3

Оказалось, что эта штучка и от 5 вольт нормально работает. Вот только частота импульсов там какая-то не до конца понятная, связанная с редуктором механизма, а не с секундами. На тот момент мне нечем было ее точно измерить, поэтому опять пришлось заниматься косвенными расчетами. Немного поэксперентировав, я добавил делить частоты на К155ИЕ5 и запустил прерывания на ардуинке. Получилось примерно 5 Гц. Но и коэффициент поправочный тоже остался. В целом вышло не так уж плохо. В таком варианте ручная коррекция времени требовалась не чаще раза в месяц. Часы работали на тумбочке у кровати не меньше полугода. Я до сих пор использую их как основной будильник.

Но точность хода не давала мне покоя. Я решил прокачать часы еще раз. Теперь я выкинул генератор от часов и добавил еще одну ардуинку, точнее ESP8266-01S:

-4

Этот малыш на самом деле круче чем Nano. Умеет в Wi-Fi и все такое. Но пинов слишком мало, чтобы заменить Nano в этом проекте.

Идея была в том, что Nano будет считать секунды без всяких поправок как получится, а ESP будет время от времени присылать точное время для корректировки часов. Для передачи информации используется один проводок com-порта – только в одну сторону. В схему пришлось добавить еще и модуль питания на 3.3В, т.к. эта ESP только так может работать, а запитать ее от Nano не получится – слишком слабый там источник. Каждые 30 минут ESP сообщает Nano сколько секунд прошло от начала суток, и Nano корректирует свой счетчик.

Информацию о точном времени ESP запрашивает у Яндекса, который предоставляет сервис Яндекс.Время. Когда я посмотрел на json, который присылает Яндекс в ответ на запрос, то нашел там еще и температуру в том городе, для которого идет запрос. Естественно, что идея показывать еще и температуру была сразу же реализована.

В итоге получилась такая конструкция:

-5

Тут видно еще два выключателя питания: общий и для ESP. Иначе возникает конфликт при прошивке ардуинок через ком-порт.

Ну и сами часы:

-6

На будильнике 6: 30. Точка сверху - будет звонить.

А это температура. +3 было.

-7

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

Вышло прикольно. Но у меня в часах теперь есть web-сервер. Удобная удаленная настройка сама просилась под реализацию. Простенькое мобильное приложение родилось за час и теперь мой супербудильник можно настраивать удаленно в пределах локальной сети квартиры:

-8

У приложения есть некоторые недостатки по коду, но работает стабильно. Если честно, то нижняя кнопка синхронизации ничего не делает. Я просто поленился ее «прокодировать». Часы и так сами нормально справляются.

Вот такая получилась история. У китайцев, кстати, можно за примерно 100 рублей заказать комплект для сборки похожих часов. Но там только платка с микроконтроллером и индикатором и даже двоеточие не мигает между часами и минутами.

Кому прямо очень интересны детали, может посмотреть на проект поближе: https://github.com/viktand/clock

-9

Читайте также.