Бинарный часы на Arduino (скетч) (видео)
Не прекращая осваивать Ардуинку, более ради собственного интереса, в голову пришла очередная не более чем бредовая идея, — сделать бинарные часы. В доме вполне хватало и самый обычных часов, будь то стрелочные или цифровые, но вот стационарных бинарных пока не было.
Ну решено и решено, надо пробовать. А да, вначале пару слов о том, что такое бинарные часы, хотя для многих это вовсе не будет открытием, они в этом случае могут опустить свой взгляд сразу на один абзац ниже.
Что такое бинарные часы и какой у них цикл работы
Весь наш мир состоит из каких-то условностей. Именно так мне хотелось бы начать рассказывать о бинарных часах. Ведь мы привыкли считать в десятичной системе исчисления, при этом в минутах у нас 60 единиц, а часов в сутках — 24! Все это весьма странно, если только начать задумываться об этом. Однако если жить каждодневным и неизменным, то использование каких-либо величин на подсчета у нас не вызывает внутренних напряжений по поводу определения примерного времени суток. Ведь мы сами уже услышав что сейчас 18 часов понимаем, что это вечер. Если бы скажем бинарные часы использовались повсеместно, то можно было с таким же успехом сказать 2 и 4, что подразумевало бы что горит 2 светодиод указывающий на прошедшие 2 часа и 4 — на 16 часов. Мы бы даже не складывали, просто знали, бы что сейчас вечер.
Так вот, в бинарных часах время идет примерно следующим образом. Есть ряд светодиодов, пусть это будут условно светодиоды, хотя нам подойдет любой источник света, звука, чего-то иного, что раздражает наши органы чувств, для снятия информации с них. И вот, каждый второй час первый светодиод загорается, а на третий час гаснет, при этом разряд переполняется и начинает гореть второй светодиод. Далее по прошествии трех часов загорается вновь первый, вместе с уже горевшим вторым и так происходит для последующих светодиодов. В общем я четко осознаю, что все это можно представить себе в уме, но не так ясно, как можно было бы этого увидеть.
Я сам когда начал писать скетч впал в некую прострацию, так как держать в голове 6 переменных, было делом весьма нелегким. В итоге на свет появился такой вот рисунок, он станет нам помощником в написании и понимании скетча, а также еще рас визуально расскажет как же работают бинарные часы.
Смотрим на циклы свечения светодиодов привязанных к пройденному времени. Все об этом более не буду, перехожу к подключению.
Схемотехника подключения Arduino к светодиодам и кнопкам управления для бинарных часов
Микроконтроллеры весьма удивительные устройства. Вначале, чтобы их освоить надо приложить пусть незначительные, но все же усилия. После, когда ты понимаешь насколько легко и просто можно переназначить ножку, то есть съехать с одного подключения на другое, то это несколько расслабляет. Именно поэтому я считаю, что микроконтроллеры весьма полезные и нужные «штуки», но их универсальность совсем требует помалкивать о какой-либо схемотехнике со строгими подключениями. Ведь переиграть это все можно за пару минут. Что относительно моего скетча, то выходы на светодиоды и кнопки управления я приведу в таблице.
Примечание | выход, ножки | вход, ножки |
использовать с резистором 10 кОм | 1 | |
2 | ||
ножки для выхода минут | 13 | |
12 | ||
11 | ||
10 | ||
9 | ||
8 | ||
ножки для выхода часов | 7 | |
6 | ||
5 | ||
4 | ||
3 |
Теперь о скетче, что более важно!
Скетч для бинарных часов на Arduino
Чтобы скетч был у вас под рукой, лучше его открыть в отдельном окне, а о его принципе я расскажу далее.
Начинается все с того, что необходимо организовать циклы. Именно по ним можно будет ориентироваться сколько же времени прошло. При этом есть одно важное условие, так как будет происходить постоянное сравнение условий, то есть если вдруг наша переменная со временем меняется нам надо будет зажигать какой-либо из светодиодов, то в скетче надо применять не delay, а функцию millis.
Ну, а далее все по накатанной, зная чему равен у нас цикл и ориентируюсь на алгоритм работы из рисунка выше, можно обозначит условия для свечения светодиодов. Все вроде как даже просто. Еще одно НО, что в скетче есть входы 1 и 2, которые подают положительный импульс для изменения значения переменной минут или часов соответственно. Так вот, для подключения кнопок обязательно используем сопротивления по 10 К, дабы не словить дребезг контактов.
На этом все, будут пожелания и вопросы, пишите!
Источник
Бинарные часы с будильником и таймером на Arduino Uno
Получив пару плат Arduino, и разные радиодетали для ознакомления с микроконтроллерами автор решил сделать что-то интересное и одновременно полезное. Имея в запасе большое количество светодиодов, пришла идея создать бинарные часы.
Со стороны электроники бинарные часы не являются особо сложными, но автор усложнил задачу и решил не экономить кнопки и светодиоды. Изначально в проекте должно было использоваться 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 оправдала ожидания и полностью справилась с поставленной задачей.
Источник