Часы на ардуино

Функции времени

Откуда берётся время?

Начнём с того, откуда вообще микроконтроллер знает, сколько проходит времени. Ведь у него нет часов! Для работы микроконтроллера жизненно важен так называемый тактовый генератор, или кварцевый генератор, или он же кварц. Он же oscillator, он же clock. Clock по-английски это часы. Да, но не всё так просто =) Кварц расположен рядом с МК на плате (также во многих МК есть встроенный тактовый генератор), на Ардуинах обычно стоит генератор на 16 МГц, также встречаются модели на 8 МГц. Тактовый генератор выполняет очень простую вещь: он пинает микроконтроллер со своей тактовой частотой, то есть 16 МГц кварц пинает МК 16 миллионов раз в секунду. Микроконтроллер, в свою очередь зная частоту кварца, может прикинуть время между пинками (16 МГц = 0.0625 микросекунды), и таким образом ориентироваться во времени. Но на деле не всё так просто, потому что принимают пинки таймера так называемые таймеры-счётчики (Timer-counter). Это физически расположенные внутри МК устройства, которые занимаются подсчётом пинков тактового генератора. И вот микроконтроллер уже может обратиться к счётчику и спросить, а сколько там натикало? И счётчик ему расскажет. И вот этим мы уже можем пользоваться, для этого у Ардуино есть готовые функции времени. В Ардуино на ATmega328 имеются три счётчика, и подсчётом времени занимается таймер под номером 0. Этим может заниматься любой другой счётчик, но работая в Arduino IDE вы сразу получаете такую настройку, т.к. создавая скетч в Arduino IDE вы автоматически работаете с библиотекой Arduino.h, где и реализованы все удобные функции.

Задержки

Простейшей с точки зрения использования функцией времени является задержка, их у нас две:

    delay(time) – “приостанавливает” выполнение кода на time миллисекунд. Дальше функции delay() выполнение кода не идёт, за исключением прерываний. Использовать рекомендуется только в самых крайних или тех случаях, когда delay не влияет на скорость работы устройства. time принимает тип данных unsigned long и может приостановить выполнение на срок от 1 мс до

50 суток (4 294 967 295 миллисекунд) с разрешением в 1 миллисекунду. Работает на системном таймере Timer 0, поэтому не работает внутри прерывания и при отключенных прерываниях.

  • delayMicroseconds(time) – Аналог delay() , приостанавливает выполнение кода на time микросекунд. time принимает тип данных unsigned int и может приостановить выполнение на срок от 4 до 16383 мкс с разрешением 4 мкс. Важно: delayMicroseconds работает не на таймере, как остальные функции времени в Arduino, а на счёте тактов процессора. Из этого следует, что delayMicroseconds может работать в прерывании и при отключенных прерываниях.
  • Задержки использовать очень просто:

    И вот мы можем делать какое-то действие два раза в секунду. delayMicroseconds() иногда не совсем корректно работает с переменными, нужно стараться использовать константы ( const или просто число). Для создания микросекундных задержек с переменным периодом и корректной работы в циклах лучше использовать следующую конструкцию:

    А что делать, если нам нужно выполнять одно действие два раза в секунду, а другое – три? А третье – 10 раз в секунду например. Сразу привыкаем к той мысли, что задержки лучше вообще не использовать в реальном коде. Разве что delayMicroseconds() , он бывает нужен для генерации каких-то протоколов связи. Нормальным инструментом для тайм-менеджмента своего кода являются функции, которые считают время со старта МК.

    Функция yield()

    Разработчики Arduino позаботились о том, чтобы функция delay() не просто блокировала выполнение кода, но и позволяла выполнять другой код во время этой задержки. Данный “костыль” получил название yield() и работает следующим образом: если объявить функцию

    то расположенный внутри неё код будет выполняться во время работы любой задержки delay() в программе! Это решение хоть и кажется нелепым, но в то же время позволяет быстро и без описания лишних костылей и таймеров реализовать пару параллельно выполняющихся задач. Что вполне соответствует назначению Ардуино – максимально простая и быстрая разработка прототипа. Рассмотрим например такой простой пример: стандартный мигающий светодиод, но с опросом кнопки

    Подробнее о том, как работать с yield() и строить программу на её основе мы рассмотрим в одном из следующих уроков о том, как написать скетч.

    Функции счёта времени

    Данные функции возвращают время, прошедшее с момента запуска микроконтроллера, так называемый аптайм (англ. uptime). Таких функций у нас две:

      millis() – Возвращает количество миллисекунд, прошедших с запуска. Возвращает unsigned long , от 1 до 4 294 967 295 миллисекунд (

    50 суток), имеет разрешение 1 миллисекунда, после переполнения сбрасывается в 0. Работает на системном таймере Timer 0
    micros() – Возвращает количество микросекунд, прошедших с запуска. Возвращает unsigned long , от 4 до 4 294 967 295 микросекунд (

    70 минут), имеет разрешение в 4 микросекунды, после переполнения сбрасывается в 0. Работает на системном таймере Timer 0

    Таймер на millis()

    Вы спросите, а как время со старта МК поможет нам организовать действия по времени? Очень просто, схема вот такая:

    • Выполнили действие
    • Запомнили текущее время со старта МК (в отдельную переменную)
    • Ищем разницу между текущим временем и запомненным
    • Как только разница больше нужного нам времени “Таймера” – выполняем действие
    • “Сбрасываем” таймер
      • Тут есть два варианта, приравнивать переменную таймера к актуальному millis(), или увеличивать её на размер периода

    Тип 1

    Реализация классического “таймера на millis()” выглядит вот так:

    Данная конструкция “уходит” с периода, если в коде есть задержки и прочие блокирующие участки, во время выполнения которых millis() успевает увеличиться на большее чем период время, и в перспективе период будет немного “уходить”! Это может быть критично например для счёта времени и других похожих ситуаций, когда период срабатывания таймера не должен “смещаться” относительно текущего времени. В то же время, если заблокировать выполнение кода на время, большее чем один период – таймер скорректирует эту разницу, так как мы его сбрасываем актуальным значением millis() .

    Тип 2

    Второй вариант сброса таймера будет записан вот так:

    Эта конструкция жёстко отрабатывает период, то есть не “уходит” со временем, если в коде присутствует малая задержка, потому что время следующего срабатывания всегда кратно периоду. Минусом здесь является то, что если таймер пропустит период – он “сработает” несколько раз при следующей проверке! Но из этой неприятной ситуации есть выход: можно посчитать, на сколько периодов нужно “обновить” переменную таймера. Например так:

    Здесь я заранее считаю прошедшее после последнего срабатывания время и записываю в переменную timeLeft , потому что оно нам ещё понадобится. К переменной таймера мы прибавляем период, умноженный на количество переполнений. Если вызов таймера не был пропущен – то умножать мы будем на 1. Целочисленное деление (timeLeft / period) позволяет получить целое количество переполнений, поэтому скобки стоят именно так. Данная конструкция таймера позволяет жёстко соблюдать период выполнения и не боится пропущенных вызовов, но требует нескольких дополнительных вычислений, в том числе “дорогое” деление, не забывайте об этом.

    Переполнение

    Напомню, что uint32_t это второе название типа данных unsigned long , просто оно короче в записи. Почему переменная должна быть именно такого типа? Потому что функция millis() возвращает именно этот тип данных, т.е. если мы сделаем нашу переменную например типа int , то она переполнится через 32.7 секунды. Но миллис тоже ограничен числом 4 294 967 295, и при переполнении тоже сбросится в 0. Сделает он это через 4 294 967 295 / 1000 / 60 / 60 / 24 = 49.7 суток. Значит ли это, что наш таймер “сломается” через 50 суток? Нет, рассмотренные выше конструкции таймеров спокойно переживают переход через 0 и работает дальше, не верьте диванным экспертам, проверьте =)

    Почему эта конструкция работает и не ломается? Потому что мы используем беззнаковый тип данных, который при переполнении начинает считать с нуля. Подробнее об этом читайте в уроке про вычисления. Таким образом когда миллис становится равен нулю и растёт, а мы вычитаем из него огромное число – получаем не отрицательное, а вполне корректное значение, которое является временем с предыдущего сброса таймера. Поэтому конструкция не то что продолжает работать через

    Читайте также  Лабораторный бп на основе psmr3010p

    50 суток, но и проходит момент “переполнения” без потери периода!

    И вот так мы можем например 10 раз в секунду опросить датчик, фильтровать значения, и два раза в секунду выводить показания на дисплей. И три раза в секунду мигать лампочкой. Почему нет? Рассмотрим ещё несколько алгоритмов.

    Варианты использования millis()

    В классическом варианте таймера нам приходится создавать отдельную 32-х битную переменную под каждый таймер. Весьма расточительно! Давайте рассмотрим другие варианты организации периодических действий на базе счётчика аптайма millis() .

    Казалось бы, очень крутой и простой алгоритм… но использовать его нельзя по целому ряду причин:

    • Операция “остаток от деления” довольно тяжёлая и медленная, размещение нескольких таких “таймеров” в основном цикле программы сильно увеличит время его выполнения и замедлит работу всей программы в целом!
    • В реальной программе может создаться задержка продолжительностью дольше 1 мс (например вывод на матрицу адресных светодиодов занимает

    30 мс) и существует довольно высокий риск пропуска такого “таймера”!

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

    Либо вот такой вариант, он не уходит в отличие от предыдущего (разбирали разницу в главе “Таймер на millis()”). Разница напомню в способе сброса таймера.

    Пользоваться очень просто: добавьте указанный выше макрос в самое начало кода и вызывайте его как функцию

    Единственное ограничение: нельзя вызывать макрос больше одного раза в одном и том же блоке кода, это приведёт к ошибке =) То есть вот так нельзя:

    Если очень нужна такая конструкция – помещаем каждый вызов в свой блок кода:

    Либо используем блоки кода по условиям или как отдельную функцию, которая “оборачивает” макрос:

    Часы на Ардуино своими руками

    Мы решили собрать большое руководство о том, как сделать часы на Ардуино, где расскажем о нескольких вариантах реализации такого проекта. Ранее мы уже делали электронные часы на основе этой платы.

    Часы на Ардуино на основе ЖК-дисплея и часов реального времени

    Цель первого урока показать, как сделать простые часы на основе Arduino с использованием ЖК-дисплея и часов реального времени.

    Комплектующие

    Для первого урока этого большого руководства нам понадобятся следующие комплектующие для наших часов на Ардуино:

    • Arduino UNO и Genuino UNO
    • PCF8563 (часы реального времени)
    • Кристалл 32 кГц
    • 10К потенциометры
    • Резистор 10k 1/4w
    • Резистор 220 Ом
    • LCD 16×2
    • Макет с набором проводов

    В этом уроке будут использованы ЖК-дисплей и часы реального времени. Если вы хотите знать больше теме взаимодействия Arduino и ЖК-дисплеев — изучите уроки, которые мы публиковали ранее на нашем сайте.

    Схема соединения

    Схема очень проста. PCF8563 связывается с Arduino с помощью TWI, и когда данные принимаются, ЖК-дисплей обновляется, показывая новое время.

    Установка даты и времени

    Чтобы установить дату и время, используйте следующий скетч:

    Код проекта

    Теперь вы сможете использовать свои часы, загрузив этот скетч на Arduino:

    Часы с выводом на экран Nokia 5110

    Следующий урок — часы на Arduino, которые также простые для сборки, где вы сможете установить дату и время на последовательном мониторе.

    В этом уроке используются лишь несколько компонентов — только перемычки, Arduino и дисплей Nokia 5110/3110.

    Комплектующие

    Детали, используемые в этом проекте ниже.

    Оборудование

    • Arduino UNO и Genuino UNO × 1
    • Adafruit дисплей Nokia 5110 × 1
    • Соединительные провода (универсальные) × 1
    • Резистор 221 Ом × 1

    Программное обеспечение

    Схема соединения

    Соединяем детали часов на Ардуино как на схеме выше:

    • контакт pin 3 — последовательный тактовый выход (SCLK) // pin 3 — Serial clock out (SCLK)
    • контакт pin 4 — выход серийных данных (DIN) // pin 4 — Serial date out (DIN)
    • контакт pin 5 — дата / выбор команды (D / C) // pin 5 — date/Command select (D/C)
    • контакт pin 6 — выбор ЖК-чипа (CS / CE) // pin 6 — LCD chip select (CS/CE)
    • контакт pin 7 — сброс ЖК (RST) // pin 7 — LCD reset (RST)

    Код урока

    Код второй версии часов вы можете скачать или скопировать ниже.

    Часы с будильником, гигрометром и термометром

    Эти часы сделаны с использованием платы Arduino Uno, датчика AM2302, модуля RTC DS3231 и TFT-дисплей 1,8″ с ST7735.

    Комплектующие

    Компоненты, используемые в третьей версии часов на Ардуино перечислены ниже.

    Компоненты оборудования

    • Arduino UNO и Genuino UNO × 1
    • Часы реального времени (RTC) × 1
    • Датчик температуры DHT22 × 1
    • Кнопочный переключатель 12мм
    • SparkFun Кнопочный переключатель 12 мм × 4
    • Соединительные провода (универсальные) × 1
    • Макет (универсальный) × 1
    • Adafruit ST7735 1,8 «дисплей × 1

    Программное обеспечение

    Схема соединения

    Соедините все детали часов согласно схеме ниже.

    Код урока

    Скачайте или скопируйте код часов для Ардуино ниже и загрузите на плату используя Arduino IDE.

    Часы без RTC

    Для начала мы должны понимать, что такое RTC. Из Википедии:

    В итоге в данной версии мы сделаем часы без RTC с индикатором температуры и влажности на Arduino с помощью модуля DHT11. Также мы используем 3 кнопки для установки часов.

    Комплектующие

    Вам понадобятся эти кусочки для этого проекта:

    • Arduino Uno плата
    • Кнопки 3 шт.
    • Потенциометр
    • Модуль LCD 1602
    • Модуль температуры и влажности DHT11
    • Макетная плата
    • Перемычки

    Схема соединения

    Соедините комплектующие часов как на схеме ниже.

    Вы можете скопировать или скачать код часов на Ардуино ниже.

    На этом пока всё. Мы постарались описать все основные варианты реализации часов на Ардуино.

    aslambek34 › Блог › Большие ЖК часы на ардуино

    Давно хотел сделать электронные часы на диодной ленте, и вот как-то наткнулся в инете на статью и сразу захотел реализовать — подкупила относительная простота и малое количество проводов — накосячить будет сложно.
    Там же, в статье, указаны необходимые компоненты с ссылками на алиэкспресс, по которым я все сразу и заказал и стал изучать тему в ожидании посылки. Как оказалось, слегка поторопился, некоторые элементы можно было заменить, об этом ниже, в недочетах
    Компоненты электроники:
    — Диодная лента на микросхемах 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. По размеченным на картоне границам приклеиваем куски диодной ленты и соединяем пайкой по цепочке.

    5. Далее приклеил контуры цифр к картонке с диодной лентой:

    Далее сделал из ватмана внешний корпус, хотел сделать из фанеры, деревянных реек и тонированного стекла или акрила — но пока ни времени ни возможности нет.

    Электроника
    Основную схему вынес в отдельную коробочку, так как такой корпус хлипковат. В итоге к часам подходит кабель, в котором:
    +12В — на питание диодной ленты;
    +5В — на питание модуля освещенности;
    0 — общий провод (минус);
    выход данных с ардуино на диодную ленту;
    выход сигнала с датчика освещенности на ардуино;

    Схема соединений:

    На деле все получилось не так красиво, но вроде работает:

    Алгоритм работы:
    Часы показывают время, дату и температуру в помещении: первые 15 секунд — время, затем 3 секунды — дату, еще 3 секунды — температуру, затем снова время. С 45-й секунды вновь дата 3 секунды, температура 3 секунды и снова время.
    Когда в помещении светло — яркость отображения высокая, когда темно — снижается до минимального.

    Скетч
    yadi.sk/d/apVZ5DBw3XYTZo
    Список скетчей:
    1. clock_date (02.01.2017) — отображает время, дату и температуру, слегка подтормаживает при смене показаний
    2. clock_temp (09.09.2017) — отображает время и температуру, смена каждые 5 секунд
    3. new_clock (04.01.2017) — отображает просто время, анимированная смена цвета каждую минуту
    4. new_clock_без кнопок (09.09.2017) — то же, что и п. 3, только убрал кнопки корректировки времени
    5. clock_temp_animation (09.09.2017) — скетч из п.2 с анимацией как в п.3.
    6. clock_temp_x2_animation (25.11.2017) — скетч из п.5 с двумя датчиками температуры: 5 секунд время, 2 секунды — температура внутри, 2 секунды — температура снаружи (наружный отображает отрицательную температуру)

    в скетче возможны ошибки — переделывал много раз

    для корректировки времени в архиве отдельный скетч, иначе выставить дату проблематично

    Делаем электронные часы на Ардуино своими руками

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

    Однако существует простой и доступный способ собрать электронные часы своими руками в домашних условиях: использовать платформу Arduino. Она представляет собой программно-аппаратный комплекс, специально предназначенный для обучения основам программирования и электроники. C помощью Arduino любой человек, даже без специальной предварительной подготовки, сможет построить электронные часы своими руками: схемы принципиальные, инженерные программы и даже паяльник не понадобятся!

    Соединение всех электронных компонентов проводится на специальной контактной («беспаячной») макетной плате, что исключает риск получения ожогов, порезов и других травм — поэтому заниматься с конструктором Arduino можно и вместе с детьми. А наглядный способ представления принципиальной схемы поможет не ошибиться при сборке устройства.

    Шаг 1. Список компонентов

    Чтобы собрать простые часы на светодиодных матрицах вам потребуется всего несколько дешёвых компонентов:

    • платформа Arduino. Подойдут самые простые модели — Arduino Nano или Micro;
    • контактная макетная плата;
    • соединительные провода для макетной платы;
    • модуль часов реального времени Adafruit DS3231;
    • светодиодный матричный модуль 32×8 MAX7219;
    • две кнопки.

    Также понадобится персональный компьютер и USB—mini-USB кабель для загрузки программы управления в память Arduino IDE. Вот и всё — паяльник, щипцы для снятия изоляции, монтажные ножи и прочие профессиональные инструменты не нужны: все операции выполняются руками. Разве что в некоторых случаях удобнее использовать пинцет, но можно обойтись и без него.

    Детали для сборки электронных часов на Arduino

    Шаг 2. Сборка электронной схемы

    Схема электронных часов с индикацией на светодиодах с применением Arduino даже для неопытных радиолюбителей покажется довольно простой. Для сборки требуется всего несколько проводников. Таблица подключений:

    Модуль Arduino → светодиодная матрица 32×8 MAX7219

    Модуль Arduino → часы реального времени Adafruit DS3231

    Модуль Arduino → кнопки

    Второй вывод кнопок соединяется с землёй GND.

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

    Схема электрических подключений макетной платы

    Два ряда (1 и 4) с обеих сторон замкнуты горизонтально — обычно они используются как линия питания +5V и земля GND. Все внутренние контакты (2 и 3) замкнуты вертикально. При этом монтажная плата как вертикально, так и горизонтально разделена на две независимые друг от друга симметричные части. Это позволяет, например, собрать два разных устройства на одной плате.

    Схема электронных часов с индикацией на светодиодах, а также расположение элементов на монтажной плате представлена на иллюстрации:

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

    Внешний вид собранного устройства

    Шаг 3. Прошивка Arduino

    После того как сборка и проверка схемы завершена, можно приступать к загрузке управляющей программы (или «прошивки») в память Arduino.

    Интерфейс среды разработки Arduino IDE

    Для этого нужно установить бесплатную официальную среду разработки — Arduino IDE [https://www.arduino.cc/en/Main/Software]. Также вам потребуется исходный код проекта, который вы можете скачать ниже в архиве со всеми библиотеками и скетчем, а если вам нужен просто скетч — его можно скопировать отдельно:

    Теперь для завершения работы над устройством потребуется выполнить лишь ряд простых операций:

    1. подсоедините Arduino к USB-порту компьютера. Если модуль подключается впервые, то необходимо будет дождаться определения устройства операционной системой и установки драйвера;
    2. скопируйте содержимое папки libraries из архива в одноимённую папку в каталоге Arduino IDE;
    3. запустите средство разработки Arduino IDE;
    4. настройте тип Arduino в соответствии с имеющимся у вас модулем. Так, если вы используете Arduino Nano, в меню необходимо выбрать Tools -> Board: “Arduino Nano”. Также убедитесь в том, что модель процессора соответствует микроконтроллеру на вашей плате:

    Выбор модели Arduino в среде Arduino IDE

  • откройте исходный код (файл clock_8x32.ino): File -> Open. Arduino IDE предложит вам автоматически создать отдельную директорию под проект — ответьте утвердительно;
  • загрузите программу в память Arduino: Sketch -> Upload.
  • Компиляция программного кода и дальнейшая загрузка в память микроконтроллера займёт некоторое время, обычно не более одной минуты. Об успешном завершении операции будет сообщено в консоли Arduino IDE. После чего остаётся лишь перезагрузить Arduino с помощью кнопки Reset на устройстве — простые часы на светодиодных матрицах готовы!

    Готовые часы на Arduino

    Настройка часов осуществляется с помощью двух кнопок. Устройство поддерживает 12- и 24-часовой формат вывода времени, показ даты и дня недели, отображение времени с секундами и без. Также имеется возможность менять яркость свечения светодиодов.

    Вариант корпуса для светодиодных часов

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

    Подключение DS1302 к Ардуино по I2C / SPI

    DS1302 Аrduino ► это модуль часов реального времени. Рассмотрим схему подключения модуля к плате Ардуино и скетч для настройки даты и времени на часах Ардуино.

    DS1302 Аrduino — это модуль часов реального времени с возможностью бесперебойного питания от литиевой батарейки. Рассмотрим схему подключения модуля к плате Ардуино и продемонстрируем код, с помощью которого можно установить нужную дату и время. Также мы разместили описание универсальной библиотеки iarduino_RTC.h для работы с модулями DS1302, DS1307 и DS3231.

    Модуль DS1302 (RTC): схема, описание

    Ориентация по времени полезна при создании устройства для автоматического полива растений, включении света или отопления по строгому расписанию и т.д. Контроллер Arduino не имеет встроенных часов, поэтому при необходимости выполнения задач микроконтроллером Arduino Uno в строго определенное время суток, понадобится использовать в проекте модуль часов DS1302 или ближайшие аналоги.

    Распиновка ds1302. Часы реального времени Arduino DS1302

    Микросхема отличается низким энергопотреблением и позволяет отсчитывать время с точностью до секунд. Подключение ds1302 к Ардуино осуществляется с помощью пяти контактов. Выводы VCC и Gnd отвечают за питание модуля. Контакты CLK,DAT и RESX подключают к цифровым пинам микроконтроллера. В скетче можно самим указать задействованные цифровые пины (в нашем примере использован 6,7 и 8 пин).

    Как подключить DS1302 к Arduino (RTC)

    Для этого занятия нам потребуется:

    • плата Arduino Uno / Arduino Nano / Arduino Mega;
    • модуль DS1302, DS1307 или DS3231;
    • LCD монитор 1602 i2c;
    • провода «папа-мама».

    Модули часов DS1307 и DS3231 подключаются к плате Ардуино через I2C протокол, как LCD дисплей I2C. Контакт SDA подключается к пину A4, контакт SCL к пину A5 Ардуино Уно. При подключении данных модулей к плате Arduino Mega следует использовать порты SDA (20 пин) и SCL (21 пин). При этом в скетче необходимо снять комментарий в строчке с нужным модулем, а строчку с модулем 1302 наоборот закомментировать.

    Скетч. Работа с модулем ds3231 Ардуино DS1307

    Пояснения к коду:

    1. для работы с программой необходимо скачать библиотеку iarduino_RTC.h.
    2. с помощью команды time.settime(); можно установить дату и время, которые будут выводится на монитор порта Arduino IDE каждую секунду.

    Подключение DS1307 к дисплею LCD 1602 i2c

    Рассмотрим два варианта подключения модуля RTC к Arduino и текстового дисплея 1602. В первом варианте используется протокол SPI для модуля часов, поэтому к предыдущей схеме потребуется добавить только дисплей с iic модулем. А в скетче следует расскомментировать соответствующую строку. После внесения правок в схему и программу — загрузите следующий скетч в микроконтроллер.

    Скетч. Часы с экраном LCD 1602 и DS1302

    Пояснения к коду:

    1. в данном примере с помощью команды time.gettime(); можно выводить на текстовый экран текущее время и дату в разном формате.

    При подключении экрана и модуля RTC к одной шине iic — порты SDA(A4) и SCL(A5), следует указать в скетче какой модуль используется. Схема подключения размещена выше, кроме того вы можете использовать сканер шины i2c для того, чтобы увидеть адреса устройств. Если адреса, которые установлены производителем по умолчанию вы не изменяли — соберите схему и загрузите следующий пример в плату.

    Схема подключения DS1307 и LCD по i2c

    Скетч. Часы с LCD 1602 и DS1302 I2C Arduino

    Пояснения к коду:

    1. как видите, скетч отличается от предыдущего только одной строчкой

    Библиотека RTC.h Arduino: описание команд

    Для работы с модулями часов Ардуино, в библиотеке реализовано 5 функций:

    begin(); // запуск модуля

    settime(секунды, минуты, часы, день, месяц, год, день недели); // указать время
    — год указывается без учета века, в формате 0-99
    — часы указываются в 24-часовом формате, от 0 до 23
    — день недели указывается в виде числа от 0-воскресенье, 6-суббота

    gettime(«строка с параметрами»); // получить время
    — gettime(«d-m-Y, H:i:s, D»); ответит строкой «12-06-2020, 18:30:05, Fri»
    — gettime(«H»); ответит строкой «18»

    функцией gettime можно получать различную информацию:

    • s — секунды от 00 до 59 (два знака)
    • i — минуты от 00 до 59 (два знака)
    • h — часы в 12-часовом формате от 01 до 12 (два знака)
    • H — часы в 24-часовом формате от 00 до 23 (два знака)
    • d — день месяца от 01 до 31 (два знака)
    • D — день недели наименование от Mon до Sun (три знака)
    • m — месяц от 01 до 12 (два знака)
    • M — месяц наименование от Jan до Dec (три знака)
    • Y — год от 2000 до 2099 (четыре знака)
    • y — год от 00 до 99 (два знака)

    blinktime(параметр)
    — указывает функции gettime мигать одним из параметров времени

    period(минуты)
    — устанавливает период обращения к модулю в минутах (от 0 до 255)

    Заключение. В часы на Ардуино с дисплеем 1602 и DS1302 можно добавить функцию показа температуры и будильник. Данный модуль позволяет существенно расширить функции микроконтроллера, которые должны выполняться в определенное время суток. Если у вас возникли вопросы по сборке и программированию часов на Arduino с DS1302 и LCD дисплеем — оставляйте их в комментариях к записи.

    Урок 19. RTC часы с будильником

    В предыдущем уроке 18, мы подключили Trema RTC часы реального времени с Trema кнопками и LCD I2C дисплеем к arduino Uno, написали скетч, для установки времени при помощи кнопок.

    Теперь расширим функционал получившихся часов, добавив к ним функцию будильника. А код, который будет выполняться при срабатывании будильника выведем в отдельную функцию «Func_alarm_action()», чтоб Вы смогли легко его найти и изменить. Например, при срабатывании будильника, открывать жалюзи, включать свет или музыку, включить через реле тостер или кофе-машину и т.д.

    Нам понадобится:

    • Arduino х 1шт.
    • RTC модуль Trema на базе чипа DS1307 х 1шт.
    • LCD дисплей LCD1602 IIC/I2C(синий) или LCD1602 IIC/I2C(зелёный) х 1шт.
    • Trema Shield х 1шт.
    • Trema-модуль i2C Hub х 1шт.
    • Trema-модуль кнопка c проводами х 3шт.
    • Шлейф «мама-мама»для шины I2С х 2шт.
    • Trema-модуль зуммер х 1шт.
    • Trema-модуль светодиод х 1шт. (белый, синий, красный, оранжевый или зелёный)

    Для реализации проекта нам необходимо установить библиотеки:

    • Библиотека iarduino_RTC (для подключения RTC часов реального времени DS1302, DS1307, DS3231)
    • Библиотека LiquidCrystal_I2C_V112 (для подключения дисплеев LCD1602 по шине I2C)

    О том как устанавливать библиотеки, Вы можете ознакомиться на странице Wiki — Установка библиотек в Arduino IDE .

    Видео:

    Схема подключения:

    Подключение модулей RTC и LCD, данного урока, осуществляется к аппаратным выводам SDA, и SCL.

    RTC модуль Trema на базе чипа DS1307 / LCD дисплей на базе чипа LCD1602 Arduino Uno
    GND GND
    Vcc +5V
    SDA (Serial DAta) A4
    SCL (Serial CLock) A5

    Подключение кнопок: кнопка «SET» к выводу 2, кнопка «UP» к выводу 3 и копка «DOWN» к выводу 4.

    Зуммер подключаем к выводу 5, а светодиод к выводу 13 (дублируя встроенный в arduino).

    Алгоритм работы кнопок следующий:

    • В режиме вывода даты/времени/будильника (обычный режим):
      • Кратковременное нажатие на кнопку SET переключает режимы вывода: даты/времени/будильника
      • Удержание кнопки SET переводит часы в режим установки даты/времени/будильника (зависит от того, каким был режим вывода)
      • Кнопки UP и DOWN, в режиме вывода будильника, активируют/деактивируют будильник.
        Если будильник активен, то в правом верхнем углу экрана появляется значок будильника.
    • В режиме установки даты/времени/будильника:
      • Кратковременное нажатие на кнопку SET — переход между устанавливаемыми параметрами (сек, мин, час, дни, мес, год, д.н.)
      • Удержание кнопки SET выводит часы из режима установки
      • Каждое нажатие на кнопку UP увеличивает значение устанавливаемого параметра даты или времени
      • Каждое нажатие на кнопку DOWN уменьшает значение устанавливаемого параметра даты или времени
    • Во время работы сигнализации будильника:
      • Удержание любой кнопки в течении 1 секунды, отключает сигнализацию (без выполнения их действий, в любом режиме)

    Код программы:

    Работа кнопок, вывод и установка времени, описывались в уроке 18, в этом уроке рассмотрим работу будильника:

    В начале кода добавляем две константы: PIN_alarm_TONE и PIN_alarm_LED, указывающие номера выводов зуммера и светодиода.
    А также добавляем четыре переменные: VAR_alarm_MIN , VAR_alarm_HOUR , VAR_alarm_FLAG1 и VAR_alarm_FLAG2 .

    • VAR_alarm_MIN — переменная в которой хранится значение минут, при котором сработает будильник (по умолчанию 0 минут)
    • VAR_alarm_HOUR — переменная в которой хранится значение часов, при котором сработает будильник (по умолчанию 0 часов)
    • VAR_alarm_FLAG1 — флаг разрешения работы будильника, false — не активен, true — активен (по умолчанию true — активен)
    • VAR_alarm_FLAG2 — флаг указывающий на то, что будильник сработал «сигнализация» (по умолчанию false — не сработал)

    Последняя переменная которую мы добавили — MAS_alarm_SYM, она содержит изображение символа будильника для вывода на дисплей.

    В функции loop, после вывода информации на дисплей, добавляем проверку: не пора ли включить будильник?

    • если будильник включён (установлен флаг VAR_alarm_FLAG1)
    • если в текущем времени 0 секунд (time.seconds==00)
    • если количество минут текущего времени (time.minutes) равно количеству минут установленных в будильнике (VAR_alarm_MIN)
    • если количество часов текущего времени (time.Hours) равно количеству часов установленных в будильнике (VAR_alarm_HOUR)
      то устанавливаем флаг VAR_alarm_FLAG2 (указывающий на то, что будильник сработал)
    • если установлен флаг VAR_alarm_FLAG2, то запускаем действия будильника (действия описаны в функции Func_alarm_action)
      Так как проверка будильника и запуск функции Func_alarm_action() находится внутри условия if(millis()%1000==0)<. >, то действия будильника будут выполняться один раз в секунду.

    Теперь всё готово для создания полного кода:

    Разберемся в коде действий будильника:

    Действия будильника описаны в функции Func_alarm_action().

    В этой функции мы включаем светодиод, далее подаём три коротких звуковых сигнала (с частотой 2000Гц, длительностью и паузой 100мс), после чего выключаем светодиод.

    Если Вам необходимо выполнить действие будильника однократно, а не каждую секунду после его срабатывания, то начните выполнение действий со сброса флага VAR_alarm_FLAG2, присвоив ему значение false.