Бинарные часы своими руками (Mega32, DS1307). Бинарные часы с будильником и таймером на Arduino Uno

Бинарные часы своими руками (Mega32, DS1307). Бинарные часы с будильником и таймером на Arduino Uno
Бинарные часы своими руками (Mega32, DS1307). Бинарные часы с будильником и таймером на Arduino Uno
Оценка 1 Оценка 2 Оценка 3 Оценка 4 Оценка 5

Идея

Началось все с того что захотелось сделать какое-нибудь полностью законченное устройство на микроконтроллере AVR. Выбор пал на бинарные часы, т.к. они просты в изготовлении и достаточно эффектно смотрятся. А еще потому что мне всегда нравился плазмоид бинарных часов из KDE который выглядит вот так:

Что такое бинарные часы?

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

Бинарные часы бывают разные (как в общем-то и обычные часы) - с разным количеством и расположением индикаторов, с секундами или без, с 24-х или 12-и часовым форматом времени и т.д. Я решил остановиться на варианте максимально похожем на вышеупомянутый плазмоид из KDE:

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

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

Проще всего понять какое время показывают часы анализируя "циферблат" слева на право, снизу вверх. Запишем значение двоичного числа представленного самым левым столбцом часов изображенных на картинке выше (условившись что горящий индикатор обозначает единицу, а потухший - ноль): 0010 в двоичной системе счисления это 2 - в десятичной. Аналогичным образом запишем значение второго столбца: 0001 в двоичной системе счисления (как и в десятичной), или просто единица. То есть на часах 21 час. Точно так же можно прочитать что часы показывают 35 минут и 28 секунд. Немного практики и читать время с бинарных часов будет получаться почти так же быстро как и с обычных.

Реализация

Итак, с идеей понятно, приступим к реализации.

Начнем с индикатора ("циферблата") - который представляет собой решетку из светодиодов.
Поскольку в часах 4 горизонтальных и 6 вертикальных рядов, общее количество необходимых светодиодов - 6 * 4 = 24. На самом деле, можно обойтись меньшим количеством светодиодов, т.к. не все разряды будут задействованы - например старшая цифра часов (самый левый столбец), может показывать число не больше двух (при двадцати часовом формате времени), а значит можно сэкономить целых два светодиода. Но я этого делать не стал и поставил все 24 светодиода, т.к. хотел (в будущем) использовать эти часы для показа простых текстовых сообщений.

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

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

Схема и печатная плата

Схема достаточно стандартная: микроконтроллер, питание, сброс, разъем для подключения программатора. К TOSC1 и TOSC2 подключен часовой кварц от которого будут тикать часы. Кнопки настройки времени подтянуты к напряжению питания. Десять выходов на светодиоды (6 столбцов+ 4 строки). На каждую горизонтальную строку подключен резистор для ограничения тока через светодиод.

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

Корпус

Наверное, это самая неинтересная часть. Но, в то же время, именно она заняла большую часть времени.

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

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

К передней части часов приклеено двустороннее матовое стекло. Заднюю часть закрывает крышка на шурупах, из которой торчат кнопки настройки времени.

Программная часть

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

Весь код описывать не буду, т.к. он достаточно подробно откомментирован. Опишу только ключевые моменты.

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

Смена времени происходит раз в секунду по прерыванию переполнения таймера Timer/Counter2. Поскольку частота кварца равна 32768Гц, а предделитель таймера установлен на 128, то переполнение однобайтового таймера будет происходить раз в секунду (32768 / (128 * 256) = 1) , что очень удобно.

Обработка нажатий на кнопки происходит в процедурах button_stop_pressed для кнопки перевода часов в режим настройки и обратно, button_set_pressed для кнопки установки времени и button_switch_pressed для кнопки переключения столбца. Обратите внимание, что в процедуре button_stop_pressed текущее время сохраняется в EEPROM. Это сделано для того что бы время не сбрасывалось если нужно, например, переключить часы в другую розетку (при включении часов время считывается из EEPROM).

Class="eliadunit">

Вся основная "работа", такая как - опрос состояние кнопок, переключения активного столбца развертки и вывод времени происходит в main. Начальная инициализация выполняется в reset.

Результат

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

И продолжая тему публикуем следующий материал. Эти часы настоящего радиогика (radiogeek - радиофанат, англ.) и отображают время в двоичном коде, в момент когда кнопка нажата. Устройство показывает часы и минуты путём мигания двух светодиодов в последовательности и представляют собой два 4-разрядных двоичных числа. Вот описание того, как читать двоичные числа.

Первое число представляет час, а второе - количество минут. Например, если часы мигают 0010 - 0110, это соответствует 2 - 6, что означает часов "2" и минут "6". То есть 2:30. В устройстве отсутствует индикация "am" или "pm", но, думаем, всем понятно - это 2:30 ночи или дня. Проект предполагает также, что вы имеете опыт работы с поверхностного монтажа электронных компонентов, и, что вам знакомы навыки пайки SMD деталей.

Схема часов

Как определить время

Было сделано много вариантов и экземпляров этих часов - вы видите их на фотографиях. В архиве имеются версии 2.5 и 3.1, которая использует для поверхностного монтажа контроллер ATtiny и мини-USB порт для программирования. В контроллере ATtiny 8 контактов. Этот чип может быть запрограммирован для выполнения различных функций. У ATtiny есть внутренние часы, и подключенные светодиоды запрограммированы на мигание для отображения времени.

Электронные компоненты схемы

  • Atmel микроконтроллер ATtiny85
  • 2 SMD светодиода поверхностного монтажа
  • 2 SMD резистора 50 Ом
  • Маленькая SMD кнопка
  • CR2032 3-х вольтовая батарея типа "Таблетка"
  • Минидержатель для аккумулятора

Пайка часов

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

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

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

Обсудить статью ЧАСЫ РАДИОГИКА

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

Что такое бинарные часы?

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

На своем экране, в отличие от механических или электронных, бинарные наручные часы имеют не стрелки и цифры, а разноцветные светящиеся точки (которые в некоторых моделях мигают).

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

Как они появились?

Первый раз часы бинарные вышли в свет в 2008 году. Именно тогда фирма Anelace представила свою инновационную разработку всему миру. Однако появлению стильных наручных часов с LED-экраном предшествовали годы усовершенствований, проб и ошибок.

Модели-прототипы бинарных часов, созданные еще в начале 20-го века, были огромными махинами с электронными лампами (как, впрочем, и первые компьютеры). Тогда для человека они почти не представляли практического интереса.

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

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

Зачем такие сложности?

Первый вопрос, который возникает при взгляде на бинарные часы: как пользоваться ими? Поначалу таким вот странным способом может показаться глупой причудой, которая понравится только или совсем уж сдвинутым на почве технологий фрикам, или гениям. Обычно ведь часы нужны для того, чтобы лишь мельком взглянуть на них и узнать время, а с бинарными хронометрами такой фокус не пройдет. Можно даже опоздать на встречу, пока пытаешься считать с них показания.

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

Преимущества

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

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

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

Настройка

Бинарные наручные часы не имеют в своем механизме ни циферблата, ни стрелок. Вместо этого вся информация о и времени выводится на LED-экран с помощью светодиодов. Из-за этого перед пользователем встает насущный вопрос: а как настроить бинарные часы?

Система кодировки может различаться в разных моделях бинарных часов, однако есть некоторые основные моменты, о которых стоит помнить. Обычно у таких хронометров есть 1 или 2 режима: время и, реже, дата, переключающиеся кнопкой. Для настройки нужной величины чаще всего сначала нужно нажать кнопку Set ("Установка"). Мигающие индикаторы покажут, что вы делаете все правильно. Кнопка Select ("Выбор") позволяет переключиться от установки часов к минутам и секундам, а также от месяца к числу.

Чтобы правильно выставить на часах нужные значения, стоит освоить основной принцип двоичной системы счисления. «Вес» каждого разряда можно определить, умножив предыдущий на 2. Получим следующий ряд: 1, 2, 4, 8, 16, 32. Например, чтобы число 110101 перевести в привычный нам вид, нужно сложить «вес» каждого из значимых разрядов. Получим 32 + 16 + 0 + 4 + 0 + 1 = 53.

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

Какие бывают бинарные часы?

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

  • Хронометры с двумя рядами светодиодов. Один ряд показывает часы, второй - минуты. Кроме того, на экране есть 2 индикатора времени суток (AM и РМ).
  • Часы со светодиодами, расположенными в 6 рядов (по 2 на часы, минуты и секунды). Показывают время в формате HH:MM:SS. Чтобы узнать по ним время, нужно записать показания каждого столбика по порядку, предусмотренному этим форматом.

  • Экран часов может напоминать спидометр с двумя окружностями: внешней, показывающей часы, и внутренней, которая определяет минуты.
  • В некоторых часах имеется по 2 дорожки - справа (часы) и слева (минуты).

Есть и более навороченные варианты бинарных часов. Какой из них выбрать, зависит только от вашего желания и финансовых возможностей.

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

Конструкция собрана на микроконтроллере и часов реального времени DS1307 . В качестве индикатора текущего времени использован четырехразрядный семисегментный светодиодный индикатор (ультраяркий, голубого цвета свечения, что неплохо смотрится в темное время, и, заодно, часы играют роль ночника). Управление часами происходит двумя кнопками. Благодаря использованию микросхемы часов реального времени DS1307, алгоритм программы получился довольно простым. Общение микроконтроллера с часами реального времени происходит по шине I2C, и организованно программным путем.

Схема часов:

К сожалению, в схеме есть ошибка:
— выводы МК к базам транзисторов нужно подключать:
РВ0 к Т4, РВ1 к Т3, РВ2 к Т2, РВ3 к Т1
или поменять подключение коллекторов транзисторов к разрядам индикатора:
Т1 к DP1 ….. Т4 к DP4

Детали, используемые в схеме часов:

♦ микроконтроллер ATTiny26:

♦ часы реального времени DS1307:

♦ 4-разрядный семисегментный светодиодный индикатор – FYQ-5641UB -21 с общим катодом (ультраяркий, голубого цвета свечения):

♦ кварц 32,768 кГц, с входной емкостью 12,5 пф (можно взять с материнской платы компьютера), от этого кварца зависит точность хода часов:

♦ все транзисторы — NPN-структуры, можно применить любые (КТ3102, КТ315 и их зарубежные аналоги), я применил ВС547С
♦ микросхемный стабилизатор напряжения типа 7805
♦ все резисторы мощностью 0,125 ватт
♦ полярные конденсаторы на рабочее напряжение не ниже напряжения питания
♦ резервное питание DS1307 – 3 вольтовый литиевый элемент CR2032

Для питания часов можно использовать любое ненужное зарядное устройство сотового телефона (в этом случае, если напряжение на выходе зарядного устройства в пределах 5 вольт ± 0,5 вольта, часть схемы — стабилизатор напряжения на микросхеме типа 7805, можно исключить)
Ток потребления устройством составляет — 30 мА.
Батарейку резервного питания часов DS1307 можно и не ставить, но тогда, при пропадании напряжения в сети, текущее время придется устанавливать заново.
Печатная плата устройства не приводится, конструкция была собрана в корпусе от неисправных механических часов. Светодиод (с частотой мигания 1 Гц, от вывода SQW DS1307) служит для разделения часов и минут на индикаторе.

Установки микроконтроллера заводские: тактовая частота — 1МГц, FUSE-биты трогать не надо.

Алгоритм работы часов (в Algorithm Builder):

1. Установка указателя стека
2. Настройка таймера Т0:
— частота СК/8
— прерывания по переполнению (при такой предустановленной частоте вызов прерывания происходит каждые 2 миллисекунды)
3. Инициализация портов (выводы РА0-6 и РВ0-3 настраиваются на выход, РА7 и РВ6 на вход)
4. Инициализация шины I2C (выводы РВ4 и РВ5)
5. Проверка 7-го бита (СН) нулевого регистра DS1307
6. Глобальное разрешение прерывания
7. Вход в цикл с проверкой нажатия кнопки

При первом включении, или повторном включении при отсутствии резервного питания DS307, происходит переход в первоначальную установку текущего времени. При этом: кнопка S1 – для установки времени, кнопка S2 – переход к следующему разряду. Установленное время – часы и минуты записываются в DS1307 (секунды устанавливаются в ноль), а также вывод SQW/OUT (7-й вывод) настраивается на генерацию прямоугольных импульсов с частотой 1 Гц.
При нажатии кнопки S2 (S4 — в программе) происходит глобальный запрет прерываний, программа переходит в подпрограмму коррекции времени. При этом, кнопками S1 и S2 устанавливаются десятки и единицы минут, затем, с 0 секунд, нажатием кнопки S2 происходит запись уточненного времени в DS1307, разрешение глобального прерывания и возвращение в основную программу.

Часы показали хорошую точность хода, уход времени за месяц — 3 секунды.
Для улучшения точности хода, кварц рекомендуется подключать к DS1307, как указано в даташите:

Программа написана в среде «Algorithm Builder».
Вы можете, на примере программы часов, ознакомиться с алгоритмом общения микроконтроллера с другими устройствами по шине I2C (в алгоритме подробно прокомментирована каждая строчка).

Фотография собранного устройства и печатная плата в формате.lay от читателя сайта Анатолия Пильгук, за что ему огромное спасибо!

В устройстве применены: Транзисторы — СМД ВС847 и ЧИП резисторы

Приложения к статье:

(42,9 KiB, 3 038 hits)

(6,3 KiB, 4 058 hits)

(3,1 KiB, 2 500 hits)

(312,1 KiB, 5 833 hits)


Второй вариант программы часов в АБ (для тех у кого нескачивается верхний)

(11,4 KiB, 1 842 hits)

И разные радиодетали для ознакомления с микроконтроллерами автор решил сделать что-то интересное и одновременно полезное. Имея в запасе большое количество светодиодов, пришла идея создать бинарные часы.

Со стороны электроники бинарные часы не являются особо сложными, но автор усложнил задачу и решил не экономить кнопки и светодиоды. Изначально в проекте должно было использоваться 22 светодиода, 6 кнопок, и одна пищалка. Также была идея собирать часы на Arduino Mega из-за большего количество пинов, но спасением оказались сдвиговые регистры 74HC595.

Материалы:
- Arduino Uno
- 2 полноразмерные макетные платы
- Светодиоды красные 7 шт
- Светодиоды зелёные 7 шт
- Светодиоды синие 6 шт
- Светодиоды жёлтые и белые по 2 шт
- Резисторы 220 ом 25 шт
- Пьезопищалка 1 шт
- Тактовые кнопки 6 шт
- Сдвиговые регистры выходные 74HC595 в корпусе DIP-16 3 шт
- Соединительные провода 90 шт
- Модуль часов реального времени на базе RTC-чипа DS1307

Как всё будет работать.
Существует около 10 видов бинарных часов. Одни показывают время в двоично-десятичном (BCD) формате, другие в виде двоичных чисел. Так как автору не особо нравятся BCD-часы, он решил сделать свои чисто двоичными. Некоторым их сложнее читать, но разница в них невелика, потому что переводить числа из двоичных в десятичные несложно. Также обязательным условием создателя часов являлась индикация секунд на часах.

Вдобавок часы имеют 6 кнопок:
Set - отвечает за режим настройки часов/будильника и сохранение параметра в режиме настройки.
Mode - отвечает за переключение между режимами часов, будильника и таймера.
Up - в настройке часов/будильника/таймера, повышает параметр на один. В будильнике и таймере отвечает за активирование и выключение выбранного режима. При срабатывании сигнала - отключит сигнал будильника/таймера.
Down - в настройке часов/будильника/таймера, уменьшит параметр на один. В таймере приостановит его без сброса отсчёта. При срабатывании сигнала будильника - перенесёт сигнал на 5 минут.
24/12 - изменение формата времени.
Dim - отвечает за включение и отключение светодиодов (когда светодиоды отключены остальные кнопки перестают работать).
Схема положения светодиодов:

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


Распиновка сдвигового регистра 74HC595:
Q0-Q7 - это выводы регистра, к которым будут подключать светодиоды.
Vcc - пин питания на него подадут 5В.
GND - земля соединяемая с GND на Ардуино.
OE - пин отвечает за инвертированную активацию выводов, но использоваться он не будет, его просто замыкают на землю.
MR - инвертированная очистка регистра, управлять им не нужно, поэтому подключатся будет к питанию 5В.
ST_CP - пин отвечает за обновление состояния регистра. При записи состояния на него нужно подать LOW, после записи - HIGH, для обновления состояния выводов. Его нужно подключат к пину на Arduino. Соединить этот пин трёх регистрах можно параллельно.
SH_CP - пин, отвечает за сдвиг на 1 бит регистра. Его нужно подключат к пину на Arduino. Соединяются на микросхемах также параллельно.
DS - на этот пин подаются данные, он подключается к пину на Arduino.
Q7" - этот пин используется для каскадного соединения с остальными регистрами 74HC595.

Схема подключения:

Пьезопищалка будет подключена к третьему пину Arduino последовательно с резистором. Перед включением пищалки в схему автор посмотрел какие пины поддерживают ШИМ, так как для неё это обязательно. На Arduino Uno ШИМ поддерживают 3, 5, 6, 9, 10 и 11 пины.

В подключении кнопок используются резисторы, встроенные в Arduino, при этом одна сторона кнопок подключается к земле, а другая к пинам Arduino.

Так, выглядит итоговая конструкция:

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

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

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

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

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

Изучив эту проблему, было выяснено что оригинальная Arduino Uno использует керамический резонатор, а ему не хватает точности для измерения времени в длительных сроках. Наиболее рациональным решением была покупка часов реального времени, плюс из-за этого модуля время на часах не будет сбиваться при отключении. Автором был приобретен модуль Grove RTC от Seeed Studio. Он представляет из себя готовую плату с чипом часов. Пины модуля SDA и SCL автор подключил к Arduino на пины A4 и A5, GND к земле. Так как питание 5В занято платой часов подключать модуль было некуда. Автор решил запитать модуль от одного из цифровых пинов, который будет находиться постоянно под напряжением. Также автору потребовалось дорабатывать исходный код и добавить библиотеку часов реального времени.

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

Производство печатной платы было заказано в Китае. Seeed Studio имеет сервис по производству плат Fusion PCB. Через Fritzing был произведён экспорт файла в формат Extended Gerber, с ним работают многие производители плат. Через две недели автор получил долгожданную плату на почте.

Оставалось только припаять уже немного запылённые детали на плату. Готовый результат после пайки выглядел намного лучше макета на Breadboard.

Автор проекта долго трудился и получил то что хотел - уникальные бинарные часы с таймером и будильником. Используя батарейный отсек часы можно поместить куда угодно. Arduino оправдала ожидания и полностью справилась с поставленной задачей.