Большие светодиодные часы на ардуино. Светодиодные часы Shadowplay на платформе Arduino Uno. Готовые часы на Arduino
Существует множество способов собрать электронные часы своими руками: схемы широко представлены в литературе и сети Интернет. Большинство современных реализаций построено на основе микроконтроллеров. Выполнение таких проектов зачастую требует обширных практических навыков и теоретических знаний в области электроники: умения пользоваться специализированным программным обеспечением, создавать в домашних условиях печатные платы методом травления в хлорном железе, хорошо паять. Также необходимо иметь множество инструментов и расходных материалов.
Однако существует простой и доступный способ собрать электронные часы своими руками в домашних условиях: использовать платформу Arduino. Она представляет собой программно-аппаратный комплекс, специально предназначенный для обучения основам программирования и электроники. C помощью Arduino любой человек, даже без специальной предварительной подготовки, сможет построить электронные часы своими руками: схемы принципиальные, инженерные программы и даже паяльник не понадобятся!
Соединение всех электронных компонентов проводится на специальной контактной («беспаячной») макетной плате, что исключает риск получения ожогов, порезов и других травм - поэтому заниматься с конструктором Arduino можно и вместе с детьми. А наглядный способ представления принципиальной схемы поможет не ошибиться при сборке устройства.
Шаг 1. Список компонентов
Чтобы собрать простые часы на светодиодных матрицах вам потребуется всего несколько дешёвых компонентов:
- платформа Arduino. Подойдут самые простые модели - или Micro;
- контактная макетная плата;
- соединительные провода для макетной платы;
- модуль часов реального времени Adafruit DS3231;
- светодиодный матричный модуль 32x8 MAX7219;
- две кнопки.
Также понадобится персональный компьютер и USB-mini-USB кабель для загрузки программы управления в память . Вот и всё - паяльник, щипцы для снятия изоляции, монтажные ножи и прочие профессиональные инструменты не нужны: все операции выполняются руками. Разве что в некоторых случаях удобнее использовать пинцет, но можно обойтись и без него.
Шаг 2. Сборка электронной схемы
Схема электронных часов с индикацией на светодиодах с применением Arduino даже для неопытных радиолюбителей покажется довольно простой. Для сборки требуется всего несколько проводников. Таблица подключений:
Модуль Arduino → светодиодная матрица 32x8 MAX7219
Модуль Arduino → часы реального времени Adafruit DS3231
Модуль Arduino → кнопки
D2 - кнопка 1
D3 - кнопка 2
Второй вывод кнопок соединяется с землёй GND.
Следует лишь обратить внимание и запомнить, каким образом замкнуты между собой контактные отверстия на макетной плате. Следующая схема иллюстрирует способ внутреннего соединения контактных отверстий:
Два ряда (1 и 4) с обеих сторон замкнуты горизонтально - обычно они используются как линия питания +5V и земля GND. Все внутренние контакты (2 и 3) замкнуты вертикально. При этом монтажная плата как вертикально, так и горизонтально разделена на две независимые друг от друга симметричные части. Это позволяет, например, собрать два разных устройства на одной плате.
Схема электронных часов с индикацией на светодиодах, а также расположение элементов на монтажной плате представлена на иллюстрации:
Тщательно проверьте соответствие всех соединений указанной схеме. Также убедитесь в том, что проводники хорошо закреплены в контактных отверстиях монтажной платы.
Шаг 3. Прошивка Arduino
После того как сборка и проверка схемы завершена, можно приступать к загрузке управляющей программы (или «прошивки») в память Arduino.
Для этого нужно установить бесплатную официальную среду разработки - . Также вам потребуется исходный код проекта, который вы можете скачать ниже в архиве со всеми библиотеками и скетчем, а если вам нужен просто скетч - его можно скопировать отдельно:
//include libraries: #include "LedControl.h" #includeТеперь для завершения работы над устройством потребуется выполнить лишь ряд простых операций:
Компиляция программного кода и дальнейшая загрузка в память микроконтроллера займёт некоторое время, обычно не более одной минуты. Об успешном завершении операции будет сообщено в консоли Arduino IDE. После чего остаётся лишь перезагрузить Arduino с помощью кнопки Reset на устройстве - простые часы на светодиодных матрицах готовы!
Готовые часы на Arduino
Настройка часов осуществляется с помощью двух кнопок. Устройство поддерживает 12- и 24-часовой формат вывода времени, показ даты и дня недели, отображение времени с секундами и без. Также имеется возможность менять яркость свечения светодиодов.
Вероятно, в дальнейшем вам захочется добавить больше функций (например, термометр), или же установить устройство в корпус собственного дизайна - хороших результатов можно добиться с помощью изготовления на станках с лазерной резкой. Но уже сейчас вы сможете смело сказать, что собрали полноценные электронные часы своими руками!
После создания множества прототипов Arduino на макетной плате, я решил сделать что-то полезное, то, что можно использовать дома. А что может быть полезнее, чем светящиеся часы, которые почему-то с 2010 года перестали выпускаться? Начал я сборку цифровых часов с поиска необходимых деталей. Одним из критериев, который помог быстрее насобирать необходимые компоненты, стала доступность деталей в местных магазинах и от производителей из Китая, Малайзии.
Arduino часы реального времени (RTC) на 7-сегментных индикаторах
При сборке часов, появилось несколько вариантов настройки на них точного времени. Первый: устанавливать время на Arduino , держа его все время под питанием. Но такой метод не очень целесообразный, так как каждый раз, когда понадобиться установить время, надо будет пустить питание на Arduino.
Вторым вариантом была идея подключения 7-сегментных LED -индикаторов к GPS модулю . Поскольку GPS сигнал дает очень точное время, этот вариант должен был решить проблему, и не пришлось бы настраивать часы каждый раз при их включении. Я взял свой карманный навигатор Garmin GPS 60 C, подключил его в последовательный разъем к Arduino и загрузил несколько библиотек GPS, получив таким образом сигнал очень точного времени.
Проблема GPS метода оказалась в том, что, поскольку я живу центре города, то каменные джунгли непроглядными высотками окружают мой дом, и понадобилось бы поставить внешнюю GPS антенну снаружи окна, чтобы получить GPS сигнал с чистого неба. Без спутникового покрытия, никакое устройство GPS не в состоянии получить сигнал с синхронизацией по времени. Или часы должны быть на окне, либо надо было вынести GPS-антенну и проложить 7-метровый кабель до них.
Третий способ настройки часов оказался наилучшим. Заключается он в работе Arduino совместно с DS1307 часами реального времени (RTC). Питание на них идет от таблеточной 3-вольтовой батарейки, которая сохраняет настройки, когда устройство выключено и во время отсоединения микроконтроллера.
Я пошел в местный «электронный рай», расположенный в центре города, чтобы испытать свою удачу в поиске необходимых компонентов. К моему удивлению, там я нашел все необходимые детали для сборки цифровых часов.
Необходимыми деталями являются:
- плата Arduino для макетирования и загрузки скетча в микроконтроллер;
- микроконтроллер ATmega328P для работы часов;
- четыре красных 7-сегментных LED-индикатора (или другие, более холодного цвета, которые найдете на местном рынке);
- часы реального времени DS1307;
- кварцевый резонатор на 32,768 кГц;
- держатель для батарейки таблеточного размера CR2025 или CR2032;
- четыре микросхемы 74HC595 сдвигающего регистра для управления 7-сегментными LED-индикаторами;
- резисторы 220 Ом по 0.25 Вт;
- однорядные штыревые разъёмы;
- гнезда для интегральных микросхем (IC);
- соединительные провода.
Если нет навыков в изготовлении печатных плат, то рекомендую использовать паечную макетную плату (текстолитовая пластинка с множеством отверстий для закрепления на ней пайкой компонентов, которую ошибочно называют монтажной платой ) и припаять на неё все IC гнезда микросхем и штыревые разъёмы. Благодаря таким быстроразъемным контактам все 7-сегментные LED-индикаторы и интегральные микросхемы могут быть легко заменены при необходимости.
Поскольку размер макетной платы весьма ограничен, то удалось разместить на ней только 35-миллиметровые LED-индикаторы, ведь должно было ещё остаться место для держателя таблеточной батарейки. Хотелось бы поставить гораздо большие 7-сегментные индикаторы, но более крупным из них надо повышенное напряжение, свыше 5 В, и уже потребовалось таки усложнить схему двойными цепями питания. Иметь дело со стабилизатором на два выходных напряжения не хочется, лучше сосредоточиться на более простой версии цифровых часов.
Разделительные керамические конденсаторы 100 нФ на ножке питания Vcc каждого регистра 74HC595 добавлены, чтобы предотвратить любые проблемы с низкочастотными помехами.
Собираемые цифровые часы используют только 5 пинов Arduino:
- 3 цифровых выхода для сдвигающих регистров 74HC595;
- 2 аналоговых выхода для часов реального времени, подключенных с использованием соединения I2C.
Преимущество собираемых цифровых часов на Arduino в сравнении с заводскими в том, что к ним можно легко добавить любые функции, какие только могут стать полезны.
Вот некоторые идеи доработки часов:
- Чередование отображения на индикаторах часов/минут и минут/секунд;
- Проигрывание мелодии каждый час;
- Установка датчика LM35, и использование часов в качестве термометра;
- Функция утреннего будильника;
- Даже управление другими электрическими приборами с помощью электромеханического реле, включающегося в соответствии с определёнными по времени событиями или показаниями подключенных датчиков.
Так как четыре индикатора довольно большие и яркие, их можно использовать также для отображения буквенной информации.
После того, как я припаял первую цифру 7 сегментного LED-индикатора с общим катодом к сдвигающему регистру 74HC595, открылась первая проблема. Я использовал только один резистор 220 Ом, соединенный с общим катодом LED-индикатора, чтобы сберечь резисторы, и обнаружил, что когда включается число 8, то все сегменты загораются очень тускло. Это нормально для прототипа, но не годится для действующих цифровых часов. Было бы очень неприятно иметь часы с по-разному светящимися цифрами. Так что пришлось разорвать отдельные провода и раздобыть побольше резисторов на 220 Ом, чтобы подключить их к каждому из семи сегментов LED-индикатора.
Вторая проблема была в том, что я забыл выделить место для двух светодиодов диаметром 5 мм, в качестве мигающего двоеточия индикатора секунд. А индикатор третьей цифры уже был припаян.
Поскольку слишком много труда уходит на пайку одного индикатора, вместе с присоединением всех резисторов к проводам, я решил сделать выносную платку с двумя светодиодами в качестве индикаторов секунд. Я найду способ установки двух точек между часовыми и минутными цифрами! На фотографии внизу, я просто снимаю по светодиоду на 13 выводе мигания с интервалом в 500 мс.
- Есть коды .
- Окончательный скетч
Вот несколько фотографий собранного, работающего устройства. Теперь мне всего лишь нужно что-то вроде акрила, чтобы закрепить макетную плату и скрыть часы Arduino в общем корпусе.
Эти часы запитаны от выносной платы Arduino в версии с FTDI кабелем и гнездом DC постоянного тока.
Сборка Arduino часов завершена после установки DHT11 датчика влажности и температуры.
Самодельный датчик температуры и влажности DHT11 и DHT22 – подключение к Arduino GPS часы на Arduino
Такие часы очень оригинально будут смотреться на стене, они имеют в наличии светодиодные стрелки имитирующие стрелочные часы, LED часы по центру и красивую фоновую RGB-подсветку. Выполнение такой самоделки сложно назвать простым, но потраченное время и силы не будут упущены зря.
Материалы для корпуса:
- Чёрные акриловые пластины 300х300х3 мм 3шт
- Прозрачная акриловая подсветка 300х300х3 мм 1шт
- Средство полировки акриловых пластин
- Клей
- Распорные втулки 15 мм с резьбой м3 20 шт
- Винты м3 с шайбами 20 шт
- Картинная рамка 300х300 мм 1шт
Электронные материалы:
- Сдвиговый регистр CD74HC595 8шт
- LED драйвер TLC5940 1шт
- Часы реального времени (RTC) DS1307 1шт
- Линейный регулятор LM317 1шт
- Биполярный транзистор BD139 8шт
- Электролитический конденсатор 1 мкФ 2шт
- Конденсатор 0.1 мкФ 1шт
- Резисторы 120 Ом 60шт
- Резисторы 10 кОм 9шт
- Резистор 2 кОм 1шт
- Резисторы 1 кОм 9шт
- Резистор 330 Ом 1шт
- Светодиоды 480шт
- 4-х разрядный светодиодный цифровой индикатор (с общими анодами) 1шт
- Светодиодная RGB-лента (с общим анодом) 1шт (длинной под окружность циферблата)
- Модуль Arduino Mega ADK (Rev3) 1шт
- Батарея питания 12 В 1шт
Шаг первый. Изготовление корпуса.
Для начала в акриловые пластины разрезают и просверливают по чертежу. Далее, происходит склеивание корпусной передней чёрной пластины с соединительной частью (прозрачной), и с пластиной под светодиоды.
Шаг второй. Окончание работы над корпусом.
Для лучшей устойчивости автор приклеивает одну акриловую пластину к задней части картинной рамки, стекло с рамки при этом предварительно вынимается и больше не понадобится.
Четыре втулки 15 мм прикручивают к пластине как на фото. Теперь, появилась возможность приклеить втулки от рамки к передней пластине. Потом эти приклеенные втулки выкручиваются для использования в будущем.
Шаг третий. Вставка светодиодов.
В первую очередь светодиоды вставляют в первый ряд отверстий (на 1 ряд ушло 60 светодиодов). Катоды спаиваются между собой вокруг пластины с помощью медного провода 0,8мм, а аноды отгибаются в сторону. Эта процедура повторяется для 7 остальных рядов. Теперь когда аноды расположились в один столбец, они тоже спаиваются между собой. Таким образом, получилась матрица из 8 рядов и 60 столбцов.
Шаг четвёртый. Припаивание кабелей к матрице.
Для этого шага используются 8-проводные кабельные разъёмы один из них припаяли к катодам на матрице. Восемь таких разъёмов были припаяны к 60 столбцам анодов. Поскольку автор использовал 8-проводные разъёмы, он получил кабель с 64 проводами, это значит что 4 осталось, они были замотаны изолентой. Также автор рекомендует использовать семь 8-проводных и взять один 4-проводной разъем для того, чтобы получилось ровно 60.
Шаг пятый. Прикрепление индикатора.
В акриловой пластине в виде диска делают отверстие и приклеивают индикатор с заранее припаянными проводами для удобства.
Шаг шестой. Плата.
Из куска макетной платы большего размера чем требуется, отрезают 2 куска, так чтоб они входили в картинную рамку. Далее, самостоятельно изготавливают несколько коннекторов, как видно на фото ниже.
Шаг седьмой. Сборка часов.
Дальше происходит установка всех деталей в корпус согласно схеме, прикреплённой ниже. В часы автор установил заряжаемый аккумулятор 1000мА/ч чтобы они могли работать без внешнего кабеля. На Arduino устанавливают программный код, прикреплённый внизу статьи. Так, устанавливаются библиотеки для модуля часов реального времени и LED драйвер TLC5940, которые также прикреплены под статьёй. Схема с хорошим разрешением:
(скачиваний: 302)
Итак, после небольшого технического перерыва, продолжаем наше знакомство с семейством МК ARDUINO. В этом уроке мы попробуем сделать часы работающие от внутреннего генератора МК (с внешним генератором будет один из следующих уроков) и выводящего информацию на ЖК индикатор типа 1602 (что означает 16 символов в 2 строки, есть еще тип 1604- 16 символов в 4 строки, вы уже поняли что первые 2 цифры указывают на количество символов индикатора а вторые- на количество строк). Не будем затягивать вступление, переходим к работе.
Для проекта нам понадобится:
- Arduino Uno
- ЖК индикатор 1602
- Макетная плата
- Провода
- Подстроечный резистор на 10 кОм
Для особо ленивых советую опустится в низ страницы и скачать готовый скетч, для тех кто хочет научится делать скетчи самостоятельно опишу более подробно все шаги проекта. Для правильной и быстрой работы над проектом необходим алгоритм работы. Практически любой проект лучше накидать на бумаге и потом следовать по алгоритму шаг за шагом. Мы поступим абсолютно так же. Итак составляем алгоритм. У нас есть несколько условий, выпишем их в порядке возрастания:
- Секунды, работают в пределе от 0 до 59 по циклу с секундным интервалом (это понятно).
- Минуты, работают в пределе от 0 до 59 по циклу, переключение происходит при достижении значения секундами значения 0.
- Часы, работают в пределе от 0 до 24 (здесь вы можете выбрать отображение как в зарубежном стиле от 0 до 12 со значениями AM и PM, это как вам больше нравится) по циклу, переключение происходит по достижении значения минутами 0.
- Вывести всю необходимую информацию на дисплей (например вы можете решить не выводить секунды а сделать просто мигающую точку между часами и минутами)
Собираем наши часы по вот такой схеме:
Подключение ЖК индикатора 1602 к ARDUINO
Советы по сборке. Индикатор 1602 обычно приходит из Китая в «голом» виде, т.е. никаких выводов не подпаяно, советую для этих целей использовать двухрядные компьютерные гнезда от материнских плат, один вывод гнезда вставляется в 1602, второй вывод оказывается за краем платы, запаиваете оба вывода на один контакт- так повышается механическая и электрическая прочность. На данной схеме не указана схема подключения подсветки, это следующие 2 вывода справа от D7. Вы можете их подключить к питанию 3,3В на ARDUINO, можете сделать плавное загорание/затухание если подключите плюсовой вывод (он подписан как А- анод) к выходу ARDUINO и будете управлять питание через этот вывод, это уже второстепенная задача, пока просто подключите вывод А на 1602 к 3,3V на ARDUINO, а вывод К 1602 к GND ARDUINO.
Теперь приступаем собственно к разработке часов. Запускаем оболочку ARDUINO на компьютере. Попробуем поиграться с 1602 для проверки правильности соединений схемы. Заходим Файл-Примеры-LiqidCrystal и выбираем любой из файлов. Заливаем скетч в ARDUINO и наблюдаем что происходит. Если вместо символов вы видите черные квадратики- подкрутите подстроечный резистор, это регулятор контрастности (так же поступите если вообще ничего не отображается). Информация должна отображаться корректно и никаких «кракозябров» быть просто не должно. Если они появились- проверьте схему соединений, где то собрали неправильно. Можете сразу посмотреть в скетчах как обращаться к ЖК- индикатору и поразится простоте работы с ним! Если все у вас заработало правильно переходим непосредственно к программированию.
Определимся что таймер у нас будет работать без оператора delay как написано . Поэтому вводим такой код:
#include
// Variables will change:
void setup
() {
lcd.begin(16, 2);
void loop
()
{
if
(currentMillis — previousMillis >= interval) {
Данный код уже будет работать но ничего отображать не будет. К переменной s каждую секунду будет добавляться 1. Т.е. мы уже получили точный интервал в 1 секунду! Теперь, следуя алгоритму, нам необходим предел переменной между 0 и 59. Делаем.
if
(s>
{
}
Добавляем этот код к программе. По описанию все понятно- если значение s больше 59 то присваиваем ей 0 и прибавляем 1 минуту в переменной m. На данный момент имеем полностью работающий секундный таймер и бесконечный (до 32768- максимальное значение типа integer) счетчик минут. Теперь нужно таким же образом рассчитать минуты. Пишем следующее:
if
(m>59) // если значения m больше 59
{
}
Добавляем строки к программе. Она уже должна выглядеть так:
int
h,m,s; // переменные для часов, минут, секунд
boolean
z; // переменная для отображения точки
// подключаем библиотеку индикатора
#include
// initialize the library with the numbers of the interface pins
LiquidCrystal
lcd(12, 11, 5, 4, 3, 2);
// Variables will change:
int
ledState = LOW; // ledState used to set the LED
unsigned long
previousMillis = 0; // will store last time LED was updated
const long
interval = 1000; // interval at which to blink (milliseconds)
void setup
() {
lcd.begin(16, 2);
void loop
()
{
Unsigned long currentMillis = millis();
if
(currentMillis — previousMillis >= interval) {
// save the last time you blinked the LED
previousMillis = currentMillis;
s++; // добавляем единицу, равносильно записи s=s+1;
// секция подсчета секунд
if
(s>59) // если значение s больше 59
{
s=0; // присваиваем значение 0 переменной s
m++; // добавляем 1 к переменной m отвечающей за минуты
}
// секция подсчета минут
if
(m>
{
m=0; // присваиваем значение 0 переменной m
h++; // добавляем 1 к переменной h отвечающей за часы
}
В принципе все понятно. Осталось сделать обработку часов. Делаем. Дописываем после секции подсчета минут:
if
(h>
{
}
Все, часы готовы! Заливаем скетч и часы будут ходить как надо! Хочу обратить ваше внимание что считать они будут в 24- часовом формате. Попробуйте сами сделать 12- часовой формат. Осталось вывести информацию на ЖК- индикатор. Существует 2 пути по написания кода на вывод информации.
- Посчитать одни данные и сразу вывести
- Посчитать все данные и вывести все сразу.
Тут уж вы сами определитесь по какому пути вы пойдете. Если пойдете по первому пути то писать отображение информации надо сразу в секциях подсчета, если по второму- пишется блок после всех вычислений. Давайте пойдем по второму пути т.к. он более предпочтителен и более логичен (хотя, если честно сказать, мой тестовый скетч написан по первому пути). Итак, для передачи данных на индикатор 1602 применяются всего 2 команды:
lcd.setCursor
(3, 0); // устанавливает курсор на 3 символ 0 строки (счет строк и символов идет от 0)
lcd.print
(0); // печатаем (print- печать, учите аглицкий) 0
Есть еще команда lcd.clear ; означающая очистку экрана но здесь мы ее можем не использовать.
Начинаем выводить информацию. Начнем с секунд (можете начать с любого значения, делайте как вам будет удобно). Устанавливаем курсор на 0 строку в 6 позицию и выводим значение секунд. Почему в 6 позицию спросите вы? Давайте представим следующее: формат отображения часов- 2 символа(часы), разделитель (допустим:), 2 символа (минуты), разделитель (:) и, наконец, секунды. Считаем с нулевой позиции: 0+2+1+2+1=6. Так как счет начинается с 0 то вычитаем из данных единицу (ноль тоже является числом), выходит 6-1=5. Столько занимает отображение часов и минут с разделителями, следующая позиция- секундная и она равна 5+1=6. Немного запутано но напишу следующее hh:mm:ss и посчитаем координаты сначала начиная от 0. Вот так и высчитываются координаты на индикаторах семейства 16хх. При данных условиях часы будут отображаться в верхнем левом углу, вы можете сменить расположение как вам удобно, можете даже ввести переменную и подбирая её подбирать нужное вам положение индикации. Ладно, пишем такие строки:
lcd.setCursor
(6, 0); // устанавливает курсор на 6 символ 0 строки (счет строк идет от 0)
Программа будет выглядеть так:
int
h,m,s; // переменные для часов, минут, секунд
boolean
z; // переменная для отображения точки
// подключаем библиотеку индикатора
#include
// initialize the library with the numbers of the interface pins
LiquidCrystal
lcd(12, 11, 5, 4, 3, 2);
// Variables will change:
int
ledState = LOW; // ledState used to set the LED
unsigned long
previousMillis = 0; // will store last time LED was updated
const long
interval = 1000; // interval at which to blink (milliseconds)
void setup
() {
lcd.begin(16, 2);
void loop
()
{
Unsigned long currentMillis = millis();
if
(currentMillis — previousMillis >= interval) {
// save the last time you blinked the LED
previousMillis = currentMillis;
s++; // добавляем единицу, равносильно записи s=s+1;
// секция подсчета секунд
if
(s>59) // если значение s больше 59
{
s=0; // присваиваем значение 0 переменной s
m++; // добавляем 1 к переменной m отвечающей за минуты
}
// секция подсчета минут
if
(m>59) // если значение m больше 59
{
m=0; // присваиваем значение 0 переменной m
h++; // добавляем 1 к переменной h отвечающей за часы
}
// секция подсчета часов
if
(h>23) // если значение h больше 23
{
h=0; // присваиваем значение 0 переменной h
}
// секция вывода информации
lcd.setCursor
(6, 0);
lcd.print
(s); // печатаем данные из переменной s
Заливаем скетч и…. секунды начали отображаться!!! Только обратите внимание, при счете от 0 до 59- все нормально, но как только начинается следующая минута- начинают меняться десятки секунд вместо единиц секунд, т.е. время отображается некорректно. Давайте разберемся с этим. Мы указали программе жестко позицию 6,0 , и она выводит данные точно в этой позиции не затирая то что находится после этой позиции. Выхода 2. Применить lcd.clear или описать отображение корректно, тем более при первом варианте будет довольно трудно привыкнуть к прыгающим разрядам секунд (далее минут и часов). Напишем обработчик корректного отображения. Какие условия будут в этой обработке? Давайте подумаем. Если секунд меньше 10 то пишем их значение в 7 позиции (6+1=7) и в 6 позиции пишем 0, если больше или равно 10- пишем в 6 позиции. Все довольно просто. Условие будет иметь следующий вид:
if
(s<10) //если секунд меньше 10
{
lcd.print
(0); //печатаем 0
}
else
{
}
Вставляем данный код вместо
lcd.setCursor
(6, 0); // устанавливает курсор на 7 символ 0 строки (счет строк идет от 0)
lcd.print
(s); // печатаем данные из переменной s
и радуемся уже полученному результату! Все отображается корректно! Кроме того перед секундами появился разделитель «:»! Таким же образом пишем обработчик для минут и часов с соответствующими координатами курсора. Это может выглядеть так для минут:
If
(m<10)
{
lcd.setCursor
(3, 0);
lcd.print
(0);
lcd.setCursor
(4, 0);
lcd.print
(m);
}
else
{
lcd.setCursor
(3, 0);
lcd.print
(m);
}
и так для часов:
If
(h<10)
{
lcd.setCursor
(0, 0);
lcd.print
(0);
lcd.setCursor
(1, 0);
lcd.print
(h);
}
else
{
lcd.setCursor
(0, 0);
lcd.print
(h);
}
Наша программа примет следующий вид:
int
h,m,s; // переменные для часов, минут, секунд
boolean
z; // переменная для отображения точки
// подключаем библиотеку индикатора
#include
// initialize the library with the numbers of the interface pins
LiquidCrystal
lcd(12, 11, 5, 4, 3, 2);
// Variables will change:
int
ledState = LOW; // ledState used to set the LED
unsigned long
previousMillis = 0; // will store last time LED was updated
const long
interval = 1000; // interval at which to blink (milliseconds)
void setup
() {
lcd.begin(16, 2);
void loop
()
{
Unsigned long currentMillis = millis();
if
(currentMillis — previousMillis >= interval) {
// save the last time you blinked the LED
previousMillis = currentMillis;
s++; // добавляем единицу, равносильно записи s=s+1;
// секция подсчета секунд
if
(s>59) // если значение s больше 59
{
s=0; // присваиваем значение 0 переменной s
m++; // добавляем 1 к переменной m отвечающей за минуты
}
// секция подсчета минут
if
(m>59) // если значение m больше 59
{
m=0; // присваиваем значение 0 переменной m
h++; // добавляем 1 к переменной h отвечающей за часы
}
// секция подсчета часов
if
(h>23) // если значение h больше 23
{
h=0; // присваиваем значение 0 переменной h
}
// секция вывода информации
// вывод секунд
if
(s<10) //если секунд меньше 10
{
lcd.setCursor
(6, 0); // курсор в 6 позицию 0 строки
lcd.print
(0); //печатаем 0
lcd.setCursor
(7, 0); //курсор в 7 позицию 0 строки
lcd.print
(s); //печатаем значение переменной s
}
else
{
lcd.setCursor
(6, 0); //иначе курсор в 6 позицию 0 строки
lcd.print
(s); // печатаем значение переменной s
}
lcd.setCursor
(5, 0); // курсор в 5 позицию 0 строки
lcd.print
(‘:’); // печатаем разделитель между секундами и минутами
// вывод минут
if
(m<10)
{
lcd.setCursor
(3, 0);
lcd.print
(0);
lcd.setCursor
(4, 0);
lcd.print
(m);
}
else
{
lcd.setCursor
(3, 0);
lcd.print
(m);
}
lcd.setCursor
(2, 0); // курсор в 2 позицию 0 строки
lcd.print
(‘:’); // печатаем разделитель между минутами и часами
// вывод часов
if
(h<10)
{
lcd.setCursor
(0, 0);
lcd.print
(0);
lcd.setCursor
(1, 0);
lcd.print
(h);
}
else
{
lcd.setCursor
(0, 0);
lcd.print
(h);
}
Весь код уместился в каких то 3 с небольшим килоБайта! Из них бОльшую часть съела библиотека для ЖК индикатора. Сразу хочу заметить что этот код- только тело программы, нужно еще дописать функцию установки времени. Кроме того можно добавить фоторезистор и яркостью подсветки дисплея. Можно дописать функцию ввода будильника и работать со звуком. Так же можно выводить температуру в помещении, дату и т.д… Вобщем данный индикатор с соответствующими датчиками может превратить данные часы в уникальное устройство! Единственный минус данного аппарата- при отключении электричества настраивать часы придется заново. Поэтому в ближайшее время опишу работу с модулем RTC, при работе с ним, даже если электричество отключится, при подаче напряжения часы будут работать как будто ничего и не произошло. Для более дешевой версии часов можно использовать arduino pro mini, это такой же контроллер только не имеет USB разъема но стоит в несколько раз дешевле и имеет очень маленькие размеры. Можно также применить и arduino nano, тот же про но с USB разъемом. До следующего урока. Всем спасибо за внимание.
PS*. Кстати процедуру отображения значений можно написать в виде отдельной функции и передавать необходимые значения в нее. Попробуйте так сделать и сравните объем занимаемой памяти. Всегда стремитесь к наименьшему объему.
Решил сделать самодельные электронные часы на светодиодной ленте на ардуино с модулем реального времени, фото изготовления и подробное описание прилагается.
Использованы материалы:
- - Диодная лента на микросхемах ws2811 (RGB, питание 12в) 5 метров - 700 рублей;
- - ардуино нано - 200 рублей;
- - датчик освещенности - 28 рублей;
- - модуль реального времени RTC DS1307 AT24C32 - 37 рублей;
- - преобразователь питания LM2596 - 41 рубль;
- - блок питания 12 в 1А;
- - датчик температуры DALLAS DS18B20 - 48 рублей;
- - кусок макетной платы, две таковые кнопки, провода.
- - картон жесткий.
- - ватман (2 шт).
- - двусторонний скотч (3М).
- - обычный скотч.
- - листы вспененного полиэтилена (взял из защитных упаковок оборудования).
1. Установка шрифта в MS Officce, и печать символа 8 на весь размер листа А4. Я сделал это в Visio. Внутренние полосы - границы для разметки под куски диодной ленты. Внешние границы - контуры цифр.
2. Нанесение границ кусков диодной ленты на картон
3. По следующему шаблону делаем разметку на вспененном полиэтилене, толщина 15 мм, и далее по разметке вырезаем.
Для резки использовал самодельный станок из трех деревяшек, листа ДСП и натянутой вертикально нихромовой проволоки. Запитал регулируемым блоком питания.
4. По размеченным на картоне границам приклеиваем куски диодной ленты и соединяем пайкой по цепочке.
Основную схему вынес в отдельную коробочку, так как такой корпус хлипковат.
В итоге к часам подходит кабель, в котором:
- +12В - на питание диодной ленты;
- +5В - на питание модуля освещенности;
- 0 - общий провод (минус);
- выход данных с ардуино на диодную ленту;
- выход сигнала с датчика освещенности на ардуино;
Схема подключения ардуино.
Преобразователь питания, ардуино нано и модуль часов реального времени.
Плата коммутации с кнопками коррекции.
Алгоритм работы следующий:
Часы показывают время, дату и температуру в помещении: первые 15 секунд - время, затем 3 секунды - дату, еще 3 секунды - температуру, затем снова время. С 45-й секунды вновь дата 3 секунды, температура 3 секунды и снова время.
Когда в помещении светло - яркость отображения высокая, когда темно - снижается до минимального.