Наручные часы на ардуино своими руками
Ну наконец дошли до собственно написания скетча. Модуль RTC DS1307 программно разбирать не стал, опишу методику работы с ним в процессе написания скетча. В данном уроке мы напишем программы подключения LCD 16х2 и подключение кнопок к Ардуино, сохранение этих данных в ЕЕПРОМ Ардуино и проконтроллируем контрольные значения. Приступаем.
Прежде всего скажу что я поменял интерфейс разработчика с 1.8.5 на 1.6.8 т.к. новая версия вышла какая то глючная, выдает кучу ошибок при компилировании. Поэтому поменял на более старую и надежную версию. Сразу скажу что ошибся в применяемом мной RTC. Думал у меня 1302 а оказалось 1307. Ничего страшного. Качаем эту библиотЭку и устанавливаем ее. Она является универсальной для 3 видов RTC- 1302,1307 и 3231. Затем, дабы не терять время, собираем любую из описанных выше схем по управлению на кнопках. Я собрал по первой схеме, в данном случае совершенно неважно по какой схеме вы соберете, учитывайте лишь данные рекомендации. Ну а теперь- точно начинаем.
int iButMinus = 0; // значение при нажатии кнопки —
int iButMenu = 0; // значение при нажатии кнопки меню
int iButPlus = 0; // значение при нажатии кнопки +
Подключение ЖК индикатора 1602 к ARDUINO напрямую
Сохраняемся. Подключаем дисплей и кнопки. Теперь пришло время присваивания значений кнопкам.
Подключение LCD 16х2 с модулем I2C
Давайте условимся что кнопки будут стоять по порядку. Слева- минус, центр- меню, справа- плюс. Вы можете расположить как вам будет угодно лишь бы потом не запутались. Давайте снова подумаем. Т.к. мы будем хранить значения кнопок в ЕЕПРОМ то давайте условимся что они будут храниться с 1 по 3 ячейку включительно: минус- 1 ячейка, меню- 2, плюс- 3. Теперь нам нужно проверить что находится в этих ячейках. Добавляем после экрана загрузки в секцию setup.
// проверяем ячейки памяти на наличие данных о кнопках, 1-минус, 2- меню, 3- плюс
if ( EEPROM . read (1) == 0 || EEPROM . read (2) == 0 || EEPROM . read (3) == 0) //если в памяти в 3 ячейках ничего не записано то записываем данные кнопок
checkButtons(); //записываем значения в епром
>
iButMinus = EEPROM. read (1) * 4;
iButMenu = EEPROM. read (2) * 4;
iButPlus = EEPROM. read (3) * 4;
lcd. clear ();
Разберем что написано. Проверяем все 3 ячейки на наличие в них нуля. Знак || указывает на логическую операцию ИЛИ, т.е. если хотя бы в одной из трех ячеек находится ноль то мы должны перейти к функции присваивания и эта функция у меня выведена отдельно и называется checkButtons(). Можно конечно все описать здесь но в итоге код получается слишком длинный и неудобный для чтения. Если же все 3 ячейки имеют значения отличные от 0 то считываем эти ячейки поочередно, умножаем на 4 (что я описывал выше) и присваиваем соответствующим переменным. Делаем новую вкладку как написано в уроке раньше, обзываем её тоже как и функцию- checkButtons чтобы было легче ориентироваться. Её код:
void checkButtons() // функция проверки нажатия кнопок
while (ButOut != 0) //цикл чтобы не выходить из меню программно
lcd. clear ();
В данной функции используется еще одна переменная ButOut и по условию изначально она не должна равняться 0. Поэтому в основной вкладке в секцию с переменными вносим: int ButOut = 1; // для выхода из меню. Сразу присваиваем переменной значение отличное от нуля. Об этой переменной еще поговорим но чуть позже. Загоняем функцию в бесконечный цикл while (ButOut != 0) до того момента пока переменная ButOut не будет равна нулю. Очищаем экран lcd. clear (); Подходим к оператору switch (ButOut) который начинает выбирать секции case по указанным значениям ButOut. Немного запутано, объясню проще. При объявлении ButOut мы присвоили ей значение 1. Теперь выбираем оператором case значение 1 и выполняем все что написано в этой секции до оператора break ;. Все три секции практически идентичны и просто выводят приглашения нажать соответствующие кнопки + каждая запускает функцию writeButtons() с аргументом указанном в скобках. Данная функция собственно и будет опрашивать кнопки и производить запись в ЕЕПРОМ. Поэтому снова делаем новую вкладку, обзываем её writeButtons и вставляем следующий код:
Разберем и этот код. Как видно аргумент функции имеет тип integer хотя было бы достаточно и byte. Исправьте если вам нужно. Это мой косяк (подумайте почему можно присвоить тип byte). Давайте разберем и её. Итак, сначала делаем небольшую задержу в 40 миллисекунд delay (40); чтобы снизить мерцание LCD при такой высокой скорости. Затем считываем данные с порта А0, который притянут к земляной шине через резистор 1кОм во избежание наводок (об этом тоже будет чуть ниже) и, если значение больше 10, т.е. считаем что нажата какая то кнопка, переходим к оператору записи в ЕЕПРОМ который и записывает в ячейку указанную аргументом функции n значение порта А0 деленное на 4 дабы втиснуть 1024 в 256. Надеюсь понятно. Далее стоит условие на аргумент функции которое говорит что при n=3 признак выхода из функции ButOut должен быть равном 0, иначе просто прибавляем к ButOut единицу. Не путайте оператор присваивания = (равно) с оператором сравнивания == (двойное равно). В первом случае вы просто присвоите значение переменной а во второй будете сравнивать переменную со значением. Затем во второй строке посредине пишем OK, делаем задержку в 2 секунды, чтобы было видно что данные занесены в память и возвращаемся в функцию checkButtons но уже ButOut будет больше на единицу, т.е. переходим к следующему оператору case . И так до тех пор пока функция writeButtons не присвоит переменной ButOut ноль, функция checkButtons прекратит работу по условию цикла while (ButOut != 0) и выйдет в основную программу. Можно конечно в функцию checkButtons вписать напрямую функцию writeButtons, но её придется написать 3 раза и это сразу скажется на размере программы.
В секции setup наконец считываем данные из ЕЕПРОМ и, соответственно преобразовав, присваиваем их нужным переменным. На этом подготовка данных закончена. Переходим к основной секции loop.
Теперь давайте подумаем о ситуации выше, где я говорил что возможно перепутаете кнопки, номиналы сопротивлений или просто решите поменять назначение и порядок кнопок. Для этой операции в секцию loop вставьте следующий код:
Как известно в Ардуино УНО ЕЕПРОМ имеет 1024 ячейки по 256 бит каждая начиная с 0 по 1023. Поэтому данный код обнуляет ВЕСЬ ЕЕПРОМ если на входе А1 сигнал выше 10. Т.е., всего вероятнее, если вы оставите вход не притянутым к земле через резистор 1кОм, то Ардуино из-за наводок будет очищать память и перезагружать Ардуино. Об этом я писал выше на этой странице дабы вы смогли увидеть и почувствовать объемы наводок. Чтобы предотвратить стирание достаточно замкнуть вход А1 на GND Ардуино. Здесь вы встретите функцию resetFunc() которая перезагружает Ардуино и таким образом опять переходит в функцию присваивания кнопок. Функцию resetFunc() следует объявить, лучше всего прямо перед секцией setup:
void (* resetFunc) ( void ) = 0; // объявляем функцию reset.
Кроме того вы можете уменьшить количество стираемых ячеек чтобы уменьшить время работы Ардуино.
Данные ЕЕПРОМ и кнопок в моем варианте
Ну и наконец давайте хоть выведем на дисплей значения ячеек ЕЕПРОМ и реальные значения кнопок управления. Пишем ниже в секции loop:
lcd. setCursor (0, 0);
lcd. print ( EEPROM . read (1));
lcd. setCursor (6, 0);
lcd. print ( EEPROM . read (2));
lcd. setCursor (12, 0);
lcd.print( EEPROM . read (3));
lcd. setCursor (0, 1);
lcd. print (iButMinus);
lcd. setCursor (6, 1);
lcd. print (iButMenu);
lcd. setCursor (12, 1);
lcd. print (iButPlus);
Данный код выведет в верхней строке значения ЕЕПРОМ для всех кнопок а в нижней строке под значениями ЕЕПРОМа значения соответствующих кнопок. Вот вам пример вывода переменных на LCD.
Ну и наконец код данного урока можно скачать Lesson Clock 1. Надеюсь Вам понравился данный урок, что непонятно- пишите в комментариях. Буду очень рад отзывам как положительным так и отрицательным. Готовлю следующий урок. Всем спасибо. Пока.
PS. После постройки курятника возникла необходимость в включении/ отключении света по таймеру. Устройство было собрано и работает. Это практически законченная версия часов на Ардуино Нано и индикаторе TM1637. Если вы доработаете скетч под свои нужды- то заходите на ЭТУ СТРАНИЦУ. Если нет, то в ближайшем будущем выложу уже готовый скетч часов Ардуино Нано и индикаторе TM1637.
Разрабатываю часы на Arduino уже несколько лет подряд. Решил поместить все свои проекты часов на Arduino на одну страницу, чтобы самому знать, сколько часов сделано, и, при необходимости, показать заинтересованным читателям, знакомым и родственникам.
Это я решил сделать в связи с тем, что часто спрашивают:
- А что ты можешь сделать?
- Например, часы - отвечаю я.
- А покажи примеры!
И тут я начинаю искать по сайту, что показать. А в конце вопрос: это ты сделал 5 различных часов на Arduino? Или больше? И тут начинаем листать обратно, считая сколько часов я сделал.
Поэтому решил все часы выложить тут:
6. Часы на OLED дисплее SSD1306 и Arduino.
Еще один интересный проект часов на OLED дисплее SSD1306 и Arduino. Данные часы небольшого размера, но обладают функциями полноценных часов. Часы выводят температур, дату и время. Благодаря двум тактовым кнопкам можно настроить дату и время.
5. Часы без кнопок с сенсорным дисплеем Nextion и Arduino.
Вам не нравятся часы с вечно чикающими кнопками? Представляю вашему вниманию часы с сенсорным экраном Nextion, и Arduino.
Часы выводят дату, время температуру и влажность. Также позволяют настраивать время и дату. И все это делается на экране без единой внешней кнопки. Как это по-современному.
Часы будут доработаны, и ожидается новая версия часов на Arduino с дисплеем Nextion с еще большим функционалом.
4. Часы матрица на Arduino и адресных светодиодах WS2812.
После того, как я купил себе 3D принтер, стал активно делать проекты с использованием 3D печати. Одним их проектов стали часы-матрица с выводом времени и даты на матрицу 16х5 пикселей. Получились отличные часы с возможностью настраивать время и дату. Но в связи с тем, что печатал решётку для светодиодов пластиком PLA, то на внешних контурах он потрескался уже через полгода. Нужно перепечатать внешнюю решётку ABS пластиком. Но пока не доходят руки.
3. LEGO часы на Arduino.
2. Светодиодные часы на адресных светодиодах WS2812 и Arduino.
Часы состоят из 3 круглых контуров, по которым располагаются светодиоды. Внешний контур показывает минуты с кратностью 5. Если светиться 1 светодиод, значит 5 мин, 2 – 10 мин и т.д. По аналогии работы стрелочных часов. Средний контур, с выфрезерованными цифрами 3,6,9,12, – это часовой индикатор, который показывает сколько часов. И маленький контур с 4 светодиодами указывает сколько минут нужно добавить к минутам, которые получаются на внешнем контуре, т.е если на внешнем контуре светиться 3 светодиода, а на маленьком 2 то значит сейчас 17 минут (15+2). Заполняем минуты, которые нельзя показать на внешнем контуре.
Часы сделал 2 года, и они до сих пор работают и висят у меня в коридоре, удивляя гостей своей необычной формой.
1.Arduino часы на сдвиговых регистрах и 28 светодиодах. С выводом температуры и влажности на семисегментный индикатор TM1637.
Часы состоят из 28 светодиодов, которые показывают тегирующее время. Также время дублируется на семисегментный индикатор TM1637. Также на TM1637 выводится влажности и температура в помещении. Время настраивается с помощью пульта дистанционного управления.
Arduino Uno неплохо справляется с ролью электронных часов. Но есть один существенный недостаток. Если отключить питание платы, время придётся задавать по-новой. С этой проблемой справятся часы реального времени. У них есть своя батарейка, поэтому время не собьётся.
Для управления гаджетом используется четырёхкнопочная клавиатура. С её помощью можно задать точное время без перепрошивки.
Что потребуется
Полный сет компонентов проекта. В сет входят:
Видеоинструкция
Как собрать
Установите Troyka Slot Shield на Arduino Uno
Вставьте Quad Display в разъёмы E и F . Пин CS подключу к 10 пину Arduino.
Установите четырёхкнопочную клавиатуру в слот C . Сигнал первой кнопки подключите к пину 0 , второй к 1 , третьей к 4 и четвёртой к 5 .
Часы реального времени вставьте в пины I?C разъёма B . Вставьте батарейку CR1225 в держатель на лицевой панели модуля.
Скетч
Прошейте контроллер скетчем через Arduino IDE.
У моего модуля QuadDisplay всего три ноги и расположены они слева. Можно ли использовать его в этом проекте?
У вас предыдущая версия модуля. Она снята с производства пару лет назад. С этим скетчем, библиотекой и схемой сборки модуль работать не будет.
Если не указано иное, содержимое этой вики предоставляется на условиях следующей лицензии: CC Attribution-Noncommercial-Share Alike 4.0 International
Познакомившись с Arduino ближе захотелось сделать свой DIY проект и это должны были быть часы. Красивые, автономные с низким потреблением.
Матрицу дисплея использовал OLED. В качестве контроллера выбор пал на Arduino Pro - как наиболее компактное и простое решение. На нем есть usb разъем и им по нему можно быстро залить новый скетч.
Питаются часы от батареи CR2032, которой хватает на пол-года при обычном использовании. Дисплей при этом светится не постоянно, а 3 секунды по нажатию кнопки. Потребление в режиме ожидания 7 мкА против 12 мА при включенном дисплее. В настройках скетча можно задать яркость свечения, что позволит снизить этот пик.
Микроконтроллер и дисплей обычное время находятся в режиме сна. Нажатие кнопки 1 приводит к запуску Arduino, которая в свою очередь выводит из сна дисплей.
Задействованные порты микроконтроллера:
А0 – измерение напряжения батареи часов
2 — Кнопка 1 ( будит часы из режима сна)
А1 – Кнопка 2
3 — Кнопка 3
Что необходимо для сборки: 1. Микроконтроллер atmega328p в корпусе QFP32;
2. OLED Display 128x64 1.3” (SH1106);
3. Часы реального времени DS1337 в корпусе SOP-8;
4. Тактовые кнопки;
5. Разьёмы micro USb мама и папа;
6. Батарейка CR2032;
7. SMD конденсаторы, резисторы и кварцы на 8MHz и 32kHz;
8. Двухсторонняя печатная плата;
9. Корпус, состоящий из 3-х деталей, напечатанный на 3D-принтере.
Принципиальная схема часов
Когда в наличии есть все необходимые детали, можно приступать к изготовлению печатной платы. Я делал плату методом ЛУТ, но только с одной оговоркой – вместо глянцевой бумаги я использовал прозрачную (можно и цветную, просто с прозрачной удобнее) виниловую самоклеющуюся пленку Oracl, которая позволяет идеально перенести весь тонер на текстолит. Технология следующая. Сначала на обычной бумаге печатаете рисунок платы, затем вырезаете виниловую пленку размером чуть больше чем сам рисунок и наклеиваете на напечатанный рисунок платы на бумаге. Затем снова на этом же листе бумаги печатаете рисунок платы, так, что бы печать получилась на самой виниловой пленке. Ну а дальше по отработанной схеме. Держать рисунок под утюгом около минуты — как правило за это время тонер успевает прилипнуть к текстолиту, а пленка успевает размягчиться, благодаря чему тонер полностью отстает от винила. В итоге получается отличный перенос рисунка без ворсинок и белого налета.
Схема расположения элементов на плате
На рисунке печатной платы сверху и снизу есть точки, которые позволяют точно совместить рисунки на разных сторонах платы.
Следующий шаг – прошивка бутлоадера в микроконтроллер. Бутлоадер используется от Arduino pro mini 3.3V 8MHz с небольшими изменениями. Для того что бы сделать потребление микроконтроллера в режиме сна около 1мкА а также позволить микроконтроллеру работать при напряжении ниже 1.8В необходимо отключить Brown-out Detection (BOD). Для этого необходимо открыть файл boards.txt, который лежит в папке с Arduino по следующему пути hardware/arduino/avr. В файле нужно найти строку
ниже которой указаны настройки фьюзов для бутлоадера для Arduino Pro or Pro Mini (3.3V, 8 MHz). Ниже находим строку:
pro.menu.cpu.8MHzatmega328.bootloader.extended_fuses=0x05
И заменяем её на
pro.menu.cpu.8MHzatmega328.bootloader.extended_fuses=0x07
Сохраняем boards.txt и прошиваем загрузчик в микроконтроллер.
Напаиваем все детали на печатную плату согласно рисунку с расположением элементов.
Дисплей можно купить как отдельно, так и на плате. В последнем случае его придется отпаять, за то с платы можно взять необходимую обвязку для дисплея.
Корпус печатался на 3D-принтере ABS пластиком. Для часов подойдут любые подходящие ремешки шириной 20мм.
Привожу полный скетч программы для часов. В данный момент часы могут отображать текущие время и дату, а так производить их настройку. С текущим функционалом размер скетча составляет около 20 кб.
В перечень материалов входит:
— скетч
— печатная плата (Sprint Layout)
— 3D-модель корпуса часов (stl)
— необходимые библиотеки для Arduino
— схема электрическая принципиальная
Планы на будущее:
— заменить ds1337 на ds3231
— добавить контроллер для зарядки аккумулятора
— добавить вибромотор
— реализовать работу будильников
— заменить подключение дисплея с I2C на SPI
— добавить BLE
В заключении хочу сказать, что на базе этого устройства можно реализовать множество интересных и необычных устройств и не все они должны быть часами. Но в тоже время возможность самостоятельного программирования открывает широкие возможности по кастомизации часов и их интерфейса. Т.е. вы фактически сможете использовать любой шрифт или изображения, различные варианты расположения элементов на экране, ограниченные только вашей фантазией.
Видео, где можно посмотреть на часы и их работу, а так же подробнее изучить их устройство.
Вот собственно пока всё. Ожидаю ваши вопросы и здоровую критику…
Читайте также: