Добрый день, сегодня я поделюсь инструкцией по изготовлению часов с комнатным термометром(Часы на ардуино своими руками ). Часы работают на Arduino UNO, для отображения времени и температуры служит графический экран WG12864B. В качестве датчика температуры - ds18b20. В отличие от большинства других часов я не буду использовать RTS (Real Time Clock), а попробую обойтись без этого дополнительного модуля.
Схемы на ардуино отличаются своей простотой, и может начать изучать ардуино-каждый. О том как подключать библиотеки и прошивать ардуино можно почитать в нашей статье .
Приступим.
Для создания данных часов нам понадобится:
Arduino UNO (Или любая другая Arduino совместимая плата)
- Графический экран WG12864B
- Датчик температуры ds18b20
- Резистор 4.7 Ком 0.25 Вт
- Резистор 100 ом 0.25 Вт
- Батарейный отсек для 4 батареек типа АА «пальчиковых»
- Подходящая коробка
- Мелкий напильник
- Лак для ногтей (черный или под цвет корпуса)
- Немного тонкого пластика или картона
- Изолента
- Соединительные провода
- Монтажная плата
- Кнопки
- Паяльник
- Припой, канифоль
- Двусторонний скотч
Подготовка графического экрана.
С подключение экрана, на первый взгляд, возникает много проблем и сложностей. Но если вначале разобраться с их видами, станет намного легче и понятнее. Существует много разновидностей и типов экранов на контролере ks0107/ks0108. Все экраны принято делить на 4 типа:
Вариант A: HDM64GS12L-4, Crystalfontz CFAG12864B, Sparkfun LCD-00710CM, NKC Electronics LCD-0022, WinStar WG12864B-TML-T
Вариант B: HDM64GS12L-5, Lumex LCM-S12864GSF, Futurlec BLUE128X64LCD, AZ Displays AGM1264F, Displaytech 64128A BC, Adafruit GLCD, DataVision DG12864-88, Topway LM12864LDW, Digitron SG12864J4, QY-12864F, TM12864L-2, 12864J-1
Вариант C: Shenzhen Jinghua Displays Co Ltd. JM12864
Вариант D: Wintek- Cascades WD-G1906G, Wintek - GEN/WD-G1906G/KS0108B, Wintek/WD-G1906G/S6B0108A, TECDIS/Y19061/HD61202, Varitronix/MGLS19264/HD61202
Список не полный, их очень много. Самый распространённый и, на мой взгляд, удобный WG12864B3 V2.0. Дисплей можно подключить к Arduino по последовательному или параллельному порту. При использовании с Arduino UNO лучше выбрать подключение по последовательному порту – тогда нам потребуется всего 3 выхода микроконтроллера, вместо минимум 13 линий при подключении по параллельному порту. Подключается все довольно просто. Есть еще один нюанс, в продаже можно встретить два варианта дисплеев, со встроенным потенциометром (для регулировки контраста) и без него. Я выбрал, и советую тоже сделать вам, со встроенным.
Это уменьшает количество деталей и время пайки. Также стоит поставить токоограничительный резистор номиналом 100 Ом для подсветки. Подключая напрямую 5 вольт, существует риск сжечь подсветку.
WG12864B – Arduino UNO
1 (GND) - GND
2 (VCC) - +5V
4 (RS) – 10
5 (R/W) – 11
6 (E) – 13
15 (PSB) – GND
19 (BLA) – через резистор - +5V
20 (BLK) – GND
Удобнее всего это все собрать сзади экрана и вывести от него 5 проводов подключения к Arduino UNO. В итоге должно получится примерно так:
Для тех кто все-таки выберет параллельное подключение приведу таблицу подключения.
И схема для экранов варианта B:
На одну линию связи может быть включено несколько датчиков. Для наших часов достаточно одного. Подключаем провод от контакта «DQ» ds18b20 к «pin 5» Arduino UNO.
Подготовка платы с кнопками.
Для установки времени и даты на часах будем использовать три кнопки. Для удобства спаиваем три кнопки на монтажной плате и выводим провода.
Подключаем следующим образом: общий для всех трех кнопок провод подключаем к «GND» Arduino. Первую кнопку, она служит для входа в режим установки времени и переключения по времени и дате, подключаем к «Pin 2». Вторая, кнопка увеличения значения, - к «Pin 3», а третья, кнопка уменьшения значения, - к «Pin 4».
Сборка всего воедино.
Чтобы избежать короткого замыкания, следует заизолировать экран. По кругу обматываем изолентой, а на заднюю часть крепим на двусторонний скотч, вырезанную по размеру, планку из изолирующего материала. Подойдет плотный картон или тонкий пластик. Я воспользовался пластиком от планшета для бумаги. Получилось следующее:
Спереди экрана по краю клеим двусторонний скотч на вспененной основе, желательно черный.
Подключаем экран к Arduino:
Плюс от батарейного отсека подключаем к «VIN» Arduino, минус к «GND». Размещаем его сзади Arduino. Перед установкой в корпус, не забудьте подключить датчик температуры и плату с кнопками.
Подготовка и заливка скетча.
Для датчика температуры нужна библиотека OneWire.
Вывод на экран осуществляется через библиотеку U8glib:
Для редактирования и заливки скетча надо установите эти две библиотеки. Сделать это можно двумя способами. Просто распаковать эти архивы и поместить распакованные файлы в папку «libraries», находящуюся в папке с установленной Arduino IDE. Или второй вариант установить библиотеки прямо в среде программирования. Не распаковывая скачанные архивы, в среде Arduino IDE выберите меню Скетч – Подключить библиотеку. В самом верху выпадающего списка выберите пункт «Добавить.Zip библиотеку». В появившемся диалоговом окне выберете библиотеку, которую вы хотите добавить. Снова откройте меню Скетч – Подключить библиотеку. В самом низу выпадающего списка вы должны увидеть новую библиотеку. Теперь библиотеку можно использовать в программах. Не забудьте после всего этого перезагрузить Arduino IDE.
Датчик температуры работает по протоколу One Wire и имеет уникальный адрес для каждого устройства - 64-разрядный код. Каждый раз искать этот код нецелесообразно. Поэтому необходимо вначале подключить датчик к Arduino, залить в нее скетч находящийся в меню Файл – Примеры – Dallas Temperature – OneWireSearch. Далее запускаем Инструменты - Монитор порта. Arduino должна найти наш датчик, написать его адрес и текущие показания температуры. Копируем или просто записываем адрес нашего датчика. Открываем скетч Arduino_WG12864B_Term, ищем строку:
Byte addr={0x28, 0xFF, 0xDD, 0x14, 0xB4, 0x16, 0x5, 0x97};//адрес моего датчика
Записываем адрес вашего датчика между фигурными скобками, заменяя адрес моего датчика.
Стока:
//u8g.setPrintPos(44, 64); u8g.print(sek); // Выводим секунды для контроля правильности хода
Служит для вывода секунд рядом с надписью «Data». Это необходимо для точной установки хода времени.
Если часы спешат или отстаю следует поменять значение в строке:
If (micros() - prevmicros >494000) { // поменять на другое для корректировки было 500000
Я опытным путем определил число, при котором часы идут достаточно точно. Если ваши часы спешат следует увеличить это число, если отстаю – уменьшить. Для определения точности хода и нужен вывод секунд. После точной калибровки числа, секунды можно закомментировать и таким образом убрать с экрана.
Решил сделать самодельные электронные часы на светодиодной ленте на ардуино с модулем реального времени, фото изготовления и подробное описание прилагается.
Использованы материалы:
- - Диодная лента на микросхемах 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 секунды и снова время.
Когда в помещении светло - яркость отображения высокая, когда темно - снижается до минимального.
Существует множество способов собрать электронные часы своими руками: схемы широко представлены в литературе и сети Интернет. Большинство современных реализаций построено на основе микроконтроллеров. Выполнение таких проектов зачастую требует обширных практических навыков и теоретических знаний в области электроники: умения пользоваться специализированным программным обеспечением, создавать в домашних условиях печатные платы методом травления в хлорном железе, хорошо паять. Также необходимо иметь множество инструментов и расходных материалов.
Однако существует простой и доступный способ собрать электронные часы своими руками в домашних условиях: использовать платформу Arduino. Она представляет собой программно-аппаратный комплекс, специально предназначенный для обучения основам программирования и электроники. C помощью Arduino любой человек, даже без специальной предварительной подготовки, сможет построить электронные часы своими руками: схемы принципиальные, инженерные программы и даже паяльник не понадобятся!
Соединение всех электронных компонентов проводится на специальной контактной («беспаячной») макетной плате, что исключает риск получения ожогов, порезов и других травм - поэтому заниматься с конструктором Arduino можно и вместе с детьми. А наглядный способ представления принципиальной схемы поможет не ошибиться при сборке устройства.
Чтобы собрать простые часы на светодиодных матрицах вам потребуется всего несколько дешёвых компонентов:
- платформа 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 даже в случае перепрограммирования или отключения питания. Это один из необходимых элементов для проектов будильников, сигнализаций, снятия показаний с датчиков в режиме реального времени. Одна из самых популярных моделей модуля часов реального времени - DS1307. Именно на нем мы и остановимся. Модуль отлично сочетается с микроконтроллерами Arduino, на которых питание логики равно 5 В.
Особенности модуля от компании-производителя Adafruit (китайцы предлагают аналогичные варианты раза в три-четыре дешевле):
- Все включено: чип, обвязка, батарейка;
- Легко собирается и прост в использовании;
- Устанавливается на любую макетную плату или подключается напрямую с помощью проводов;
- Есть отличные библиотеки и скетчи-примеры;
- Два отверстия для монтажа;
- Продолжительность работы - около пяти лет!
Модуль часов реального времени может быть уже распаянным, а может продаваться в виде отдельных комплектующих, пайка которых займет около 15-ти минут, не более.
Что такое часы реального времени?
Часы реально времени - это... часы. Модуль работает от автономного питания - батарейки и продолжает вести отсчет времени, даже если на вашем проекте на Arduino пропало питание. Используя модуль реального времени, вы можете отслеживать время, даже если вы захотите внести изменения в ваш скетч и перепрограммировать микроконтроллер.
На большинстве микроконтроллеров, в том числе и Arduino, есть встроенный счетчик временни, который называется millis(). Есть и встроенные в чип таймеры, которые могут отслеживать более длительные промежутки времени (минуты или дни). Так зачем же вам отдельным модуль часов? Основная проблема в том, что millis() отслеживает время только с момента подачи питания на Arduino. То есть, как только вы отключили плату, таймер сбрасывается в 0. Вша Arduino не знает, что сейчас, например, четверг или 8-е марта. Все, чего вы можете добиться от встроенного счетчика - это "Прошло 14000 миллисекунд с момента последнего включения".
Например вы создали программу и хотите вести отсчет времени с этого момента. Если вы отключите питание микроконтроллера, счетчик времени собьется. Примерно так, как это происходит с дешевыми китайскими часами: когда садится батарейка, они начинают мигать с показанием 12:00.
В некоторых проектах Arduino вам понадобится надежный контроль времени без прерываний. Именно в таких случаях используется внешний модуль часов реального времени. Чип, который используется в подобных часах, отслеживает года и даже знает сколько дней в месяце (единственно, что обычно не учитывается - это переход на летнее и зимнее время, так как подобные переводы разные в разных частях мира).
На рисунке ниже показана материнская плата компьютера с часами реального времени DS1387. В часах используется литиевая батарея, поэтому они разрослись в размерах.
Мы рассмотрим пример использования часов реального времени DS1307. Это дешевый, легкий в использовании модуль, который работает несколько лет от небольшой батарейки.
Пока батарейка в самом модуле не исчерпает свой заряд, DS1307 будет вести отсчет времени, даже если Arduino отключен от питания или перепрограммируется.
Узлы, из которых состоит модуль часов реального времени
Рисунок | Обозначение | Описание | Производитель | Количество |
---|---|---|---|---|
IC2 | Чип часов реального времени | DS1307 | 1 | |
Q1 | 32.768 КГц, 12.5 пФ кристалл | Generic | 1 | |
R1, R2 | 1/4 Вт 5% 2.2 КОм резистор Красный, Красный, Красный, Золотой | Generic | 2 | |
C1 | 0.1 мкФ керамический конденсатор | Generic | 1 | |
Рельса на 5 контактов (1x5) | Generic | 1 | ||
Батарейка | 12 мм 3 В литиевая батарейка | CR1220 | 1 | |
12mm coin cell holder | Keystone 3001 | 1 | ||
Плата | Adafruit Industries | 1 |
Сборка модуля часов реального времени
Фото | Пояснения |
---|---|
Подготовьтесь к сборке. Проверьте наличие всех необходимых деталей и инструментов. Установите монтажную плату в тисках. | |
Нанесите немного припоя на отрицательный контакт батареи. | |
Установите два резистора 2.2 КОм и керамический конденсатор. Как именно вы их расположите - неважно. Полярность не имеет значения. После этого установите кристалл (также симметрично), держатель (холдер) для батарейки и чип часов реального времени. Чип модуля реального времени надо установить таким образом, чтобы отметка (паз) на чипе располагалась в соответствии с обозначением на монтажной плате. Внимательно посмотрите на фото слева, там чип установлен верно. | |
Чтобы холдер для батарейки не выпадал, лучше его припаять сверху. После этого переверните плату и и припаяйте оставшиеся контакты. | |
Удалите остатки контактов от резисторов, кристалла и конденсатора. | |
Если вы хотите использовать контакты для установки модуля на беспаечную монтажную плату, установите рельсу контактов на макетку, модуль часов реального времени сверху и припаяйте контакты. | |
Установите батарейку. Плоская часть батареи должна быть сверху. В среднем батарейка будет служить около 5 лет. Даже если батарейка села, не оставляйте слот для нее пустым. |
Библиотека Arduino для работы с DS1307
DS1307 легко подключается к любому микроконтроллеру с питанием логики 5 В и возможностью I2C подключения. Мы рассмотрим подключение и использование этого модуля с Arduino .
Будем использовать библиотеку RTClib для получения и настройки показаний с DS1307. Если у вас есть вопросы по учтановке дополнительных библиотек Arduino - ознакомьтесь с этой инструкцией .
В статье рассмотрен пример часов реального времени от Adafruit, но вы можете с тем же успехом использовать китайские аналоги. Принцип работы и подключения не отличается.
- КУПИТЬ Arduino Uno R3 ;
- КУПИТЬ Breadboard ;
- КУПИТЬ модуль часов реального времени DS1307 ;
На часах реального премени 5 пинов: 5V, GND, SCL, SDA и SQW.
- 5V используется для питания чипа модуля часов реального времени, когда вы делаете к нему запрос для получения данных о времени. Если сигнал 5 В не поступает, чип переходит в "спящий" режим.
- GND - общая земля. Обязательно подключается в схему.
- SCL - контакт i2c часов - необходим для обмена данными с часами реального времени.
- SDA - контакт, по которому через i2c передаются данные с часов реального времени.
- SQW дает возможность настроить вывод данных в виде square-wave. В большинстве случаев этот контакт не используется.
Если вы настроили аналоговый пин 3 (цифровой 17) в режим OUTPUT и HIGH, а аналоговый пин 2 (цифровой 16) в режим OUTPUT и LOW, вы можете запитывать часы реального времени непосредственно от этих контактов!
Подключите аналоговый пин 4 на Arduino к SDA. Аналоговый пин 5 на Arduino подключите к SCL.
Скетч для Arduino
Проверка часов реального времени
Первый скетч, который стоит запустить - это программа, которая будет считывать данные с модуля часов реального времени раз в секунду.
Для начала давайте посмотрим, что произойдет, если мы извлечем батарейку и заменим ее на другую, пока Arduino не подключен к USB. Подождите 3 секунды и извлеките батарейку. В результате чип на часах реального времени перезагрузится. После этого вставьте код, который приведен ниже (код также можно выгрузить в меню Examples→RTClib→ds1307 в Arduino IDE) и загрузите его на Arduino.
Вам также понадобится библиотека OneWire.h, скачть ее можно
.// функции даты и времени с использованием часов реального времени DS1307, подключенные по I2C. В скетче используется библиотека Wire lib
#include <Wire.h>
#include "RTClib.h"
Serial.begin(57600);
if (! RTC.isrunning()) {
Serial.println("RTC is NOT running!");
// RTC.adjust(DateTime(__DATE__, __TIME__));
DateTime now = RTC.now();
Serial.print("/");
Serial.print("/");
Serial.print(now.day(), DEC);
Serial.print(" ");
Serial.print(":");
Serial.print(":");
Serial.println();
Serial.print(now.unixtime());
Serial.print("s = ");
Serial.println("d");
// рассчитываем дату: 7 дней и 30 секунд
DateTime future (now.unixtime() + 7 * 86400L + 30);
Serial.print(" now + 7d + 30s: ");
Serial.print(future.year(), DEC);
Serial.print("/");
Serial.print(future.month(), DEC);
Serial.print("/");
Serial.print(future.day(), DEC);
Serial.print(" ");
Serial.print(future.hour(), DEC);
Serial.print(":");
Serial.print(future.minute(), DEC);
Serial.print(":");
Serial.print(future.second(), DEC);
Serial.println();
Serial.println();
Теперь откройте окно серийного монитора и убедитесь, что скорость передачи данных установлена корректно: на 57600 bps.
В результате вы должны увидеть в окне серийного монитора примерно следующее:
Если в часах реального времени пропадет питание, отобразится 0:0:0. Секунды отсчитываться перестанут. После настройки времени, пойдет новый отсчет. Именно по этой причине извлекать батарейку во время работы модуля часов реального времени нельзя.
Настройка времени на модуле часов
В этом же скетче раскомментируйте строку, которая начинается с RTC.adjust:
// строка ниже используется для настройки даты и времени часов
RTC.adjust(DateTime(__DATE__, __TIME__));
Процесс настройки даты и времени реализован очень элегантно. В эту строку попадают данные с вашего счетчика на персональном компьютере (в момент компилляции кода). Эти данные используются для прошивки вашего модуля часов реального времени. То есть, если время на вашем ПК настроено неверно, рекомендуем сначала исправить этот баг, а потом переходить к прошивке модуля часов для Arduino.
После настройки, откройте серийный монитор и убедитесь, что часы настроены корректно:
Все. С этого момента и на протяжении ближайших нескольких лет настраивать DS1307 не придется.
Считывание показаний времени с DS1307
После настройки часов реального времени DS1307, может отправлять к ним запросы. Давайте рассмотрим часть скетча, в которой реализованы эти запросы.
DateTime now = RTC.now();
Serial.print(now.year(), DEC);
Serial.print("/");
Serial.print(now.month(), DEC);
Serial.print("/");
Serial.print(now.day(), DEC);
Serial.print(" ");
Serial.print(now.hour(), DEC);
Serial.print(":");
Serial.print(now.minute(), DEC);
Serial.print(":");
Serial.print(now.second(), DEC);
Serial.println();
По сути существует один вариант для получения времени с использованием часов реального времени. Для этого используется функция now(), которая возвращает объект DateTime. В этом объекте содержаться данные про год, месяц, день, час, минуту и секунду.
Есть ряд библиотек для часов реального времени, в которых предусмотрены функции вроде RTC.year() и RTC.hour(). Эти функции вытягивают отдельно год и час. Но их использование сопряжено с рядом проблем: если вы сделаете запрос на вывод минут в момент времени, например, 3:14:59, то есть, прямо перед тем как показания минут должны приравняться к "15" (3:15:00), полученные данные будут равны 3:14:00 - то есть, вы потеряете одну минуту.
В общем, использование отдельных функций для вызова часа или года обосновано только в том случае, когда точность контроля времени с разбросом в одну минуту/года для вашего проекта не критична (как правило, это в тех случаях, когда показания снимаются редко - раз в сутки, раз в неделю). В любом случае, если вы хотите избежать погрешностей в показаниях, используйте now(), а уже из полученных данных тяните необходимые вам показания (минуты, года и т.п.).
Есть еще один формат данных, которые мы можем подучить - количество секунд от полуночи, 1-го января 1970 года. Для этого используется функция unixtime ():
Serial.print(" since 1970 = ");
Serial.print(now.unixtime());
Serial.print("s = ");
Serial.print(now.unixtime() / 86400L);
Serial.println("d");
Так как в одном дне 60*60*24 = 86400 секунд, можно перевести полученное значение в дни и года. Очень удобный вариант, если вам надо отследить, сколько времени прошло с момента последнего запроса. Например, если прошло 5 минут с момента последнего последнего обращения Arduino к часам реального времени DS1307, значение, которое вернет функция unixtime() будет больше на 300.
Оставляйте Ваши комментарии, вопросы и делитесь личным опытом ниже. В дискуссии часто рождаются новые идеи и проекты!
Готовый проект в одном модуле включает в себя множество функций: часы с отображением даты и времени, секундомер, будильник, отслеживание движения (для автоматического отключения когда вас нет на месте).
Материалы:
- Arduino Uno
- LCD шилд (с кнопками, в проекте используется шилд от DFRobot)
- Коробка для корпуса
- Зуммер
- Инфракрасный датчик движения (PIR)
- Соединительные провода (мама/мама)
- Джек 2.1 мм
- Переходник для кроны 9В 2.1 мм / 5.5 мм
- Крона 9 В
- Часы реального времени
Шаг первый. Модуль часов реального времени.
Часто модуль часов поставляют в виде конструктора, который приходится собирать самому. Обычно сборка не вызывает проблем, плюс производители выпускают инструкции по сборке их модуля. Также батарейка идёт в комплекте с часами, её хватит более чем на три года.
Шаг второй. Коннектор питания.
Для упрощения подключения конструкции к Arduino автор использует джек на 2.1 мм с припаянными контактами. В коробке проделывают отверстие, и джек закрепляют клеем. Таким образом, подключение к Arduino не составит проблем. Крону просто установят на заднюю часть бокса. Если рассмотреть фото поближе можно заметить ещё одно отверстие в коробке. Его делать не нужно, это просто неудачная попытка сделать отверстие, в него джек просто не влез.
Шаг третий. Подсоединение проводов.
Автором были приобретены разноцветные провода мама/мама. Обошлись они недорого, но сильно облегчили процесс сборки. Проводники подключили к зуммеру, ПИР датчику движения, модулю часов, чтобы потом все это подсоединить к LCD шилду.
Шаг четвёртый. Подключение к LCD шилду.
На шилде имеется 5 рядов контактов, их пины на Arduino 1-5 соответственно. Имеется контакт для 5 В и GND, это всё и использовалось для подключения. Для передачи данных с зуммером, датчиком и часами реального времени используются аналоговые пины Arduino. Датчик с часами, конечно же, подключали к земле и питанию.
Шаг пятый. Установка в коробку.
В этом шаге конструкцию помещают в отдельный бокс. В первую очередь в коробку укладывают кабели от LCD шилда. Arduino закрепляют винтом нижней правой части корпуса. Для удержания микроконтроллера достаточно одного винта, тем более что автор использует такой бокс, в котором рёбра жёсткости располагаются на месте отверстий для двух других винтов. Далее, на Arduino устанавливают LCD шилд, кабели которого огибают плату с правой стороны (видно на фото ниже). Модуль часов отлично подходит для установки в левом нижнем углу, для его крепления используется один винт. Такая установка компонентов разрешает без проблем подключить джек 2.1 мм к Arduino. Датчик движения ставят так чтобы была возможность его снять, потому что он мешает подключить кабель USB к плате.
Шаг шестой. Программирование.
Как указано в начале статьи часы должны не только отображать время и дату, но и таймер с будильников. На шилде имеется 5 кнопок, которые можно запрограммировать. Использоваться они будут для различных режимов работы часов. Зуммер будет отрабатывать при нажатии каждой кнопки, а при работе будильника он подаст несколько сигналов.
Скетч для Arduino.
За основу автором взят скетч от Adafruit, его разработали для часов реального времени. В нём используют библиотеку RTClib. Далее, автор добавил кусок кода для LCD шилда от DFRobot (опция управления кнопками). И кусок кода добавил от себя исключительно под этот проект. Финальную версию кода можно скачать под статьёй. Ниже представлены фото с разными режимами работы часов.
Шаг седьмой. Функции кнопок.
Как видно на фото ниже каждая кнопка на шилде подписана, пять из них были запрограммированы так:
- Первая кнопка (SELECT) - это меню. Кнопка отображает листание имеющихся функций (таймер, будильник).
- Вторая кнопка (LEFT) - эта кнопка отвечает за выбор функции. Дополнительная функция кнопки увеличение значения на 10 когда вводятся часы и минуты.
- Третья и четвёртая кнопки (UP, DOWN) - используются для увеличения и уменьшения значений часов и минут при настройке будильника и таймера. Дополнительная функция кнопок для переключения времени суток AM и PM.
- Пятая кнопка (RIGHT) - это кнопка ввода. Используется для принятия значения (настроенное время таймера, часов).
- Шестая кнопка (RST) - кнопка используется для перезагрузки Arduino.