Бинарные часы своими руками. Простые бинарные часы

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



Схема



RTC

Проблему сохранения текущих настроек прекрасно решают часы реального времени (RTC). Мой выбор пал на микросхему DS1307 .

По заверениям производителя, при отключении питания, она может сохранять время и дату в течении 10 лет, потребляя энергию одной лишь литиевой батарейки типа CR2032. Т.е часы продолжают тикать, сохраняя приемлемую точность хода. Время не сбивается, снова включив часы, мы получаем реальное время на циферблате, а не время на момент выключения. Микросхема общается с микроконтроллером через «квадратную шину» I 2 C, сообщая точное время и принимая новые его значения.

Сердце устройства

Выбор микроконтроллера Mega32a был продиктован следующими факторами:
Достаточное количество портов, чтобы не использовать динамическую индикацию, которую я не люблю, в первую очередь из-за того, что она раздражает зрение (мигание с высокой частотой в любом случае неестественно). С ней я познакомился, играясь с микроконтроллерами PIC на языке Proton PICBasic, и если есть возможность не использовать динамическую индикацию, я предпочту так и сделать.
Относительно низкая стоимость в 130 рублей (Mega16a, например, стоит столько же), а со скидкой так вообще 104 рубля.
Четкий QPF-44 корпус, с удобным расположением выводов


Порт «А» отображает секунды, порт «В» - минуты и порт «С» - часы. Очень удобно то, что можно присвоить портам значения времени, принятые из DS1307, без каких – либо изменений. К порту «D» подключены кнопки (пины 3 – 7), пины 0 и 1 работают как линия тактирования (SCL) и линия последовательной передачи данных (SDA) соответственно. Микросхема RTC настроена так, что выдает на своей седьмой ноге импульсы с частотой 1 герц. Эта нога подключена к 3-му пину порта «D». Сам этот порт сконфигурирован на вход, и на всякий случай включены внутренние подтяжки к плюсу питания, продублированные SMD резисторами снаружи. Такие действия в полной мере защищают от всяких неожиданностей.

Светодиоды


Светодиоды я выбрал в матовом корпусе с низкой светимостью. Сначала были опробованы яркие диоды в прозрачном корпусе, но даже при токе в 3 мА они слишком ярко и неравномерно светили, что опять таки вызывало дискомфорт. При падении напряжения на диоде в 2 вольта, напряжении питания 5 вольт и резисторе 1 кОм, значение тока, текущего через диод будет равно (5 – 2)/1000 = 3 мA. Это значение было подобрано эмпирически, а яркость свечения отлично подходит для полутемной комнаты. Если планируется устанавливать часы под прямой солнечный свет, то номинал резисторов следует уменьшить, вплоть до 200 ом, для более яркого свечения (спасибо кэп).

Кнопки

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

Софт

Код написан в среде CodeVisionAvr.
Программа начинается с того, что мы настраиваем периферию микроконтроллера.
Конфигурируем порты (A,B,C – выход, D – вход)
На всякий случай предусмотрена пауза 300 мс, чтобы DS1307 успела «очухаться»
Инициализируем «квадратную шину»
Настраиваем микросхему RTC так, чтобы она выдавала прямоугольные импульсы каждую секунду на выводе SQW/OUT
Проверяем, нажата ли кнопка CLR. Если да, то сбрасываем все значения в 0
Разрешаем глобальные прерывания
Да, пару слов про них. Мы используем внешние прерывания INT0 на PD2 по спаду, т.е. каждую секунду программа будет уходить в обработчик прерываний, в котором мы считываем значения времени из DS1307 и выводим их на светодиодные индикаторы.
Уходим в бесконечный цикл, где опрашиваем кнопки
Если кнопка нажата, прибавляем (отнимаем) час (минуту) и посылаем новое значение по I2C
Попутно проверяем, вписываются ли новые значения времени в 24-х часовой и 60-ти минутный диапазоны.

Печатная плата

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


Существует много вариаций этой технологии. На мой взгляд, вот этот самый лучший:
1. Выпиливаем нужного размера кусок текстолита.
2. Шкурим торцы, избавляясь от вредных заусенцев.
3. Смазываем будущую плату чистящим порошком или зубной пастой и жесткой стороной губки драим ее до блеска.
4. Окунаем наш кусок на пару десятков секунд в слабый раствор теплого хлорного железа, до появления равномерной, матовой, бардово-коричневой поверхности. При вытаскивании из раствора, жидкость должна полностью смачивать поверхность.
5. Смываем каку, аккуратно сушим, не прикасаясь к поверхности пальцами, или чем другим жирным. Сразу кладем на чистую бумагу медью вниз, чтобы избежать попадания пыли или волос.
6. Распечатываем отзеркаленный рисунок на тонкой(!) глянцевой бумаге, можно вырезать из журнала, например. Не прикасаемся к рисунку руками. Аккуратно вырезаем, кладем рисунком вниз.
7. Прикладываем к подготовленному куску текстолита, проглаживаем через 1-2 слоя чистой бумаги, выставив утюг на максимальную температуру. Секунд 10 должно быть достаточно, ибо если передержать, дорожки расплющатся и затекут друг на друга. Тонер должен полностью прилипнуть к меди.
8. Отмачиваем под струей теплой воды, можно оставить в воде на 10 минут. Аккуратно отдираем, соскребаем бумагу. Мне в этом помогает старая зубная щетка. Удаляем оставшиеся кусочки бумаги иголкой. Тонер остается на текстолите.
9. Нагреваем на водяной бане крепкий раствор хлорного железа, бросаем туда нашу плату и бултыхаем в течении нескольких минут (по правилу Вант-Гоффа, при увеличении температуры на 10 градусов, скорость реакции увеличивается в 2 раза. Медь исчезает прямо на глазах. Можно и не греть, но ждать придется дольше.
10. Как только вся ненужная медь исчезла, выключаем газ, вытаскиваем (например пинцетом) плату, пытаемся отмыть плиту и пальцы от хлорного железа. Смываем его с платы проточной водой.
11. Берем ацетон (жидкость для снятия лака) и оттираем тонер. Можно попробовать соскрести его шкуркой или губкой.
12. Сверлим отверстия.
13. Лудим. В качестве флюса использую ЛТИ, и вам советую, однако после лужения и пайки этот флюс нужно обязательно смыть (тем же ацетоном, а лучше смесью спирто-бензин 1:1), т.к. ЛТИшка обладает некоторой проводимостью.
Все работы обязательно проводить в проветриваемом помещении, в процессе
выделяется много вредных паров.


Платы соединяются между собой PBS и PLD разъемов. Первые соединяются с верхней платой при помощи тонкого монтажного провода, его можно выковырять, например, из старого LPT кабеля или переходника.


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

Печатные платы в формате SprintLayout5.0 прилагаются. На фотографиях есть пару косяков, но они уже исправлены в приложенных файлах.

Прошивка микроконтроллера

Для этого дела был собран программатор USBasp , который можно увидеть на фото сверху. Довольно приятная штука, прост в использовании и можно всегода носить его с собой в кармане(надеюсь, никто так делать не станет). Для прошивки mega32 придется установить джампер «Slow SCK».
Фьюзы:
Low fuse = 0xC4
High fuse = 0xD9
Наш микроконтроллер тактируется от внутреннего RC генератора с частотой 8 МГц. Пришлось отключить JTAG интерфейс на PortC, иначе некоторые светодиоды не будут светиться.
На плате предусмотрен ISP10 разъем, для быстрой прошивки/отладки.

Лицевая панель

Выполнена из алюминиевой пластины, шириной 40 мм и толщиной 1,5 мм. В ней просверлены 18 отверстий диаметром 5 мм, и 4 отверстия диаметром 3 мм для крепления стоек.


Сначала был распечатан шаблон и наклеен на пластину. Далее, были просверлены пилотные отверстия сверлом 1,5 мм, после чего уже сверлами нужных диаметров были просверлены основные отверстия.


В завершении, пластина была загнута, ошкурена мелкой шкуркой и отполирована пастой ГОИ.
Шаблон прилагается к приложенным файлам в виде файла layout5.0

Красный светодиод в левом верхнем углу

Повторяет импульсы, генерируемые DS1307 на 7-ой ноге, т.е. мигает каждую сегунду. Маленький p-канальный MOSFET транзистор работает в ключевом режиме, открываясь и закрываясь в такт импульсам. Сначала я хотел сделать фоновую подсветку (как Ambilight), для чего был слеплен КМОП инвертор на комплиментарной паре транзисторов(чтоб уж наверняка). Но мне не понравилось. Для одного светодиодика вполне достаточно одного транзистора, можно использовать даже pnp типа bc857. Я использовал бескорпусные mosfet irlml6402 или irlml6302.

Файлы

Исходники, hex-файл, печатные платы, схемы, схема в proteus и фьюзы заключены вот в эту картинку в виде архива. Я не доверяю файлохранилищам, своего сервера у меня пока нет, поэтому, на мой дилетантский взгляд, самым надежным местом для хранения будет Хабр. Пользователи windows могут добраться до файлов открыв сохраненную картинку с помощью WinRar.
Да, вот эта картинка.

Видео

Заключение

Источник питания можно использовать любой, способный выдать 5 вольт при токе в 70 мА. USB-порт вполне для этого подойдет. Главное, чтобы питание было «чистым», и не превышало 5 вольт. Питая часы от DC-DC преобразователя из на микросхеме mc34063 с уровнем помех ~50 мВ, я заметил глюки при установке времени. Сейчас устройство питается от свича, висящего рядом. Он выдает строго 5 вольт. По хорошему, нужно еще сделать защиту от дурака в виде диода, и какой-нибудь линейный стабилизатор на 3.3 - 5 вольт.
Отсутствие в часах функций будильника и отображения даты вполне обосновано: и то и другое присутствует в телефоне, а значит, пользоваться ими в бинарных часах с большой долей вероятности никто не будет (спасибо дядюшке Оккаму за этот вывод).

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

Чтобы понять, что такое двоичная система счисления, запустим в компьютере имеющуюся в операционной системе Windows программу "Калькулятор". Поскольку в различных версиях системы эти программы различаются, здесь будем рассматривать ту, которая входит в состав Windows XP Запустив программу, найдите в её окне и нажмите мышью экранную кнопку "Вид", затем в выпавшем списке выберите "Инженерный". После этого к прежним простейшим функциям калькулятора добавится множество других, позволяющих производить сложные вычисления. Слева под индикатором появится переключатель системы счисления: "Hex" (шестнадцатеричная), "Dec" (десятичная), "Oct" (восьмеричная) и "Bin" (двоичная). Сразу после запуска программы он находится в положении "Dec". Это означает, что все исходные данные для вычислений и их результаты будут представляться в привычной для нас десятичной системе счисления.

Наберите для примера число 58, нажав на соответствующие цифровые кнопки. Если теперь перевести переключатель в положение "Bin", щёлкнув мышью по соответствующей надписи, то в окне результата цифры 58 сменятся на 111010. Это то же самое число, представленное в двоичной системе счисления. Чтобы убедиться в этом, можно воспользоваться таблицей, поясняющей принцип формирования двоичных и десятичных чисел. Двоичные разряды, в отличие от десятичных, могут принимать только два значения — 0 и 1. Веса двоичных разрядов увеличиваются справа налево в два раза, а не в 10 раз, как в десятичной системе.

Двоичная система исчисления широко используется в цифровых устройствах, поскольку позволяет обойтись простыми логическими элементами, различающими только два значения — 0 и 1. Сегодня многие фирмы выпускают такие часы. Чтобы убедиться в этом, достаточно поискать в Интернете фразу "Часы двоичные".

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

Схема часов показана на рис. 1. Отсчёт времени ведёт и выводит его на светодиоды микроконтроллер DD1 . Его тактовая частота 32768 Гц стабилизирована низкочастотным "часовым" кварцевым резонатором ZQ1. Питается устройство от литиевого элемента G1 напряжением 3 В. Как известно, такие элементы отличаются минимальной саморазрядкой и способностью работать при пониженной температуре. Конденсатор С1 подавляет высокочастотные импульсы. Благодаря низкой тактовой частоте микроконтроллер потребляет небольшой ток, что делает возможной длительную эксплуатацию часов без замены элемента питания.

К выходам микроконтроллера RA0— RA4, RB5, RB6 через ограничительные резисторы R1—R7 подключены светодиоды HL1—HL7. Шесть из них (HL2— HL7) показывают время, на них можно отобразить числа от 0 (все выключены) до 63 (все включены). Это позволяет вывести по очереди число часов от 0 до 23 и минут от 0 до 59. Около светодиодов указаны веса двоичных разрядов, которым они соответствуют.

Включают индикацию часов или минут соответственно кнопками SB1 и SB2, соединёнными с входами RB0 и RB1 микроконтроллера. Так как индикация включается всего на несколько секунд, в течение которых кнопка удерживается нажатой, энергия элемента питания расходуется экономно, он служит длительное время. Кнопкой SB3, подключённой к входу RB7 микроконтроллера, производят корректировку времени. Это следует делать только в начале очередного часа, так как в процессе корректировки счётчики минут и секунд обнуляются.

Светодиод HL1 при нажатой кнопке SB1 или SB2 вспыхивает каждую секунду. Он служит индикатором активности устройства и позволяет убедиться в его работоспособности при нулевых значениях часов или минут. Если бы его не было, возникала бы неприятная ситуация, когда при нажатой кнопке ни один из светодиодов не подаёт "признаков жизни".

Вывод 4 микроконтроллера, обычно служащий входом его установки в исходное состояние MCLR, в данном случае сконфигурирован как обычный дискретный вход RA5. Начальная установка при включении питания производится внутренними средствами микроконтроллера. Для исключения случайных помех вход RA5 соединён с общим проводом. Остальные линии порта A программа конфигурирует как выходы.

Линии RB0, RB1, RB7 порта B она конфигурирует как входы и подключает к ним внутренние резисторы, поддерживающие на этих входах высокий логический уровень (при отпущенных кнопках). Остальные линии порта B конфигурируются как выходы. В завершение процедуры инициализации программа по очереди включает на секунду каждый светодиод. Это позволяет оценить правильность монтажа и убедиться в работоспособности программы.

Счёт времени в микроконтроллере DD1 ведёт встроенный таймер T1. Программа настраивает его так, что он каждую секунду генерирует запрос прерывания. Подпрограмма-обработчик прерывания формирует в оперативной памяти микроконтроллера значение текущего времени — секунды, минуты и часы.

Обработчик прерывания при каждом вызове проверяет также логические уровни на входах RB0, RB1 и RB7, зависящие от состояния кнопок SB1—SB3. При низких уровнях на входах RB0 или RB1 включается соответственно индикация часов или минут. При низком уровне на входе RB7, свидетельствующем о нажатой кнопке SB3, и одновременно низком уровне на одном из входов RB0 или RB1 производится корректировка времени. Так сделано для уменьшения вероятности сбоя хода часов в результате случайного нажатия на кнопку SB3.

Программа микроконтроллера небольшая по размеру и несложная. Без всяких изменений она может работать как в микроконтроллерах PIC16F628A, так и в PIC16F628. Исходный текст программы, приложенный к статье, снабжён подробными комментариями, позволяющими разобраться в алгоритме работы и даже усовершенствовать программу. Например, ввести индикацию секунд или режим секундомера. Для этого нет необходимости менять схему часов, так как можно организовать включение этих функций одновременным нажатием на кнопки SB1 и SB2.

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

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

Часы собраны на фрагменте макетной платы, как показано на рис. 2. Резисторы (для поверхностного монтажа) смонтированы на обратной стороне платы. Светодиоды FYL-3014SRC можно заменить другими. Чтобы убедиться в пригодности светодиода, подключите его к источнику напряжения 3 В через резистор 390 Ом и оцените яркость свечения.

Конденсаторы, резисторы, кнопки — любые малогабаритные. Желательно, чтобы кнопка SB3 была с укороченным толкателем. Его конец не должен возвышаться над поверхностью корпуса часов и даже быть утоплен, чтобы нажать на него было можно только каким-либо заострённым предметом. Такое конструктивное решение служит дополнительной к программной защитой от случайного нажатия на кнопку.

Идея

Началось все с того что захотелось сделать какое-нибудь полностью законченное устройство на микроконтроллере 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.

Началось все с того что захотелось сделать какое-нибудь полностью законченное устройство на микроконтроллере 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).

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

Результат

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

Файлы

Исходные коды прошивки, схематика и разведеная плата находятся в этом репозитории на GitLab .

В качестве заключения

В общем, для первого устройства, думаю, получилось весьма неплохо.

Если вы найдете какие-то неточности в этой статье, или по-вашему что-то следует описать более подробно - пожалуйста, пишите в комментариях.

Доброго времени суток. В сегодняшней статье мы изготовим необычные бинарные часы на базе Arduino своими руками . Разобравшись с процессом создания подобной поделки , в дальнейшем вы сможете повторить бинарные часы любой конструкции.

Шаг 1: Что же такое бинарные часы?

Для начала вспомним, что же такое бинарное (двоичное) число – это число представленное в двоичной системе исчисления, числовыми значениями, что используют всего два символа: 0 (ноль) и 1 (единица).

Бинарные часы – это часы, что отображают время в двоичном формате. В проекте используются 6 колонок светодиодов для отображения нулей и единиц. Каждая колонка отображает одну цифру/разряд, такой формат известен, как двоично-десятичное число (ДДЧ). Каждая линия отображает степень двойки, от 2^0 (или 1), до 2^3 (или 8). Поэтому всё, что нужно сделать при чтении информации с часов – просуммировать значения колонок с включенными светодиодами. Например, в первой колонке включены 4-й и 1-й светодиоды. Прибавляем 8 к 1 и получаем 9 (количество секунд равное 9). Следующая колонка десятые секунды, в ней светится только 3-й светодиод, поэтому общее значение будет равно 49 секундам, точно также с минутами и часами. Пожалуйста, отметьте следующее, что часы отображают время в 24-х часовом формате.

Шаг 2: Составные части

  • Arduino Pro Mini 328 5 V использовал такую плату, но фактически можете использовать любую другую. Если вы ни разу не использовали Pro Mini, то наверняка вам будет нужен CP 2102 (программатор) для подключения платы к компьютеру;

  • DS 1302 — модуль часов реального времени ;

  • 20-ть 10 мм диффузных «тёплых» светодиодов (советую брать с запасом);

  • 20-ть резисторов с номиналом сопротивления 10Ω;

  • 2 тактовые кнопки;

  • 2 резистора с номиналом сопротивления 10kΩ (используются, как нагрузочные резисторы).

Шаг 3: Изготавливаем прототип

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

Шаг 4: Корпус

Корпус самоделки (состоит из двух половинок) будет изготовлен из дерева. Оно будет контрастно смотреться на фоне бинарных часов и придаст поделке ретро стиль.

Шаг 5: Схема

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

Шаг 6: Код

За основу кода взят пример с Arduino Playgroud post для модуля часов DS1302. После чего были внесены изменения для отображения времени на светодиодной матрице.