Простой таймер на Ардуино с реле и обратным отсчётом
Сегодня покажу как легко и просто сделать таймер для управления реле к которому можно подключить любую нагрузку.
Нам понадобятся. Ардуино, LCD индикатор, реле, пищалка для подачи сигнала и 4 кнопки.
Чтобы не тянуть, сразу покажу как это работает, а потом посмотрим схему подключения.
При нажатии на 1 кнопку можно выбрать установку времени. Это секунды, минуты и часы.
После выбора режима, кнопками плюс и минус можно настроить время таймера. Отсчёт времени будет идти в обратную сторону. И при достижении нуля, раздастся сигнал и включится или выключится реле. Это будет завесить от того какой режим у вас запрограммирован.
После установки нужного времени надо нажать четвёртую кнопку и таймер начнёт работу. Для примера я поставил время срабатывания 14 секунд, и режим работы Отключение. После нажатия ОК, реле включит нагрузку, которая отключится через 14 секунд.
Установленное время сохраняется в памяти Ардуино, и если вы захотите снова использовать это же время, вам надо просто нажать ОК.
Теперь изменим режим и будем включать лампу при срабатывании таймера. Как менять режимы я покажу дальше в видео.
Для работы вам надо установить библиотеки.
Библиотеку таймера и библиотеку для работы с LCD дисплеем. Так как я в скетче использую русский шрифт, то вам надо установить вот эту библиотеку. Если вам что-то будет непонятно, то посмотрите вот это видео, там я подробно всё рассказал.
Здесь указано к каким пинам подключены кнопки. А здесь куда подключены пищалка и реле.
Эти две переменные отвечают за выбор режима работы. Сейчас установлен режим Выключение. То есть при срабатывании таймера, реле будет отключено.
Если вы поменяете эти значения на противоположные. Сделаете OFF равным единице, а ON равным нулю, то измените режим на включение и при срабатывании таймера он включит нагрузку.
Подведу итог работы, но не видео.
В таймере можно устанавливать время. Часы, минуты и секунды. Режим работы может быть как на включение или отключение нагрузки.
Давайте посмотрим схему. Индикатор подключается по стандартной схеме к шине I2C.
Пищалка подключается в пину d6, а реле к пину d5. И то и другое питается от 5 вольт Ардуино. Если у вас будет тускнеть дисплей, то вам надо подключить реле к выводу WIN Ардуино, если вы питаете плату от USB или запитать от отдельного источника.
Кнопки подключены к выводам А0 – А3. Другой вывод кнопки надо подключить к земле. Так как в скетче я включил внутреннюю подтяжку, то вам не обязательно устанавливать внешние резисторы.
Если вам нравятся мои видео, то вы можете помочь в развитии канала став его спонсором. Все ваши вклады пойдут на закупки новых модулей. Вам же за это будут предоставлены дополнительные бонусы, и они довольно интересные.
Вы видите ссылки на видео, которые, я думаю будут вам интересны. Перейдя на любое из этих видео вы узнаете что-то новое, а ещё поможете мне. Ведь любой ваш просмотр — это знак YOUTUBE, что это кому-то интересно и что его надо показывать чаще.
Спасибо.
Библиотека TimingRelay: Реле времени
Опубликовано: 02.09.2017 21:00
Введение
Приветствую народ. Сегодня хотелось бы поделиться с вами своей библиотекой TimingRelay.
Библиотека TimingRelay превращает обычное реле, подключенное к Arduino, в реле времени. В данной библиотеке вы можете задать как время задержки включения, так и время задержки выключения или и то и другое одновременно. Библиотека использует минимум ресурсов Arduino, работает в асинхронном (не блокирующем (без delay)) режиме и позволяет удобно и просто управлять им.
Описание
Как и любую другую библиотеку ее в первую очередь необходимо скачать и установить.
Далее в своем скетче библиотеку необходимо инициализировать прописав в самом начале:
или перейти по меню «Скетч» — «Подключить библиотеку» — «TimingRelay».
После чего необходимо вызвать ее конструктор:
- _pin (uint8_t) — Номер порта к которому подключено реле (Вызывать pinMode для реле нет необходимости, библиотека сделает это за вас).
- _onDelay (unsigned long) — Время задержки включения в миллисекундах (По умолчанию равно нулю).
- _offDelay (unsigned long) — Время задержки выключения в миллисекундах (По умолчанию равно нулю).
После того как вы создали класс и связали его с одним из портов Arduino, в секции loop вашего скетча необходимо вызвать одноименную функцию библиотеки.
Для управления реле в библиотеке добавлены четыре простые функции:
- void on() — Включить реле.
- void off() — Выключить реле.
- void set(int _output) — Включить или выключить реле (Можно напрямую выводить состояние другого порта, например кнопки).
- int get() — Функция возвращает текущее состояние реле (включено или выключено).
Пример
В данном примере по нажатию на кнопку загорится светодиод с задержкой в две секунды и будет гореть еще пять секунд после того как вы отпустите кнопку.
Примечание
Если вы хотите управлять реле по нажатию на кнопку (как в примере выше), нет необходимости заморачиваться с антидребезгом. Для этого просто выставите задержку включения и выключения от 10 и более миллисекунд.
Таймеры и многозадачность на Ардуино
Сегодня мы поговорим о такой актуальной теме, как таймеры и организация многозадачности на Arduino. Поводом для написания этой статьи послужили лекции Олега Артамонова @olartamonov для студентов МИРЭА в рамках IoT Академии Samsung, а точнее, высказывание Олега, цитата (2-я лекция, 1:13:08):
«Есть, например, задачи на которых можно сломать большинство ардуинщиков, особенно начинающих, попросите их помигать пятью разными светодиодами с разной частотой и периодом и так, чтобы ещё период можно было индивидуально для каждого светодиода изменять. »
Судя по высказываниям Олега, у него весьма превратное представление об Arduino вообще и об «ардуинщиках» в частности. Мигание пятью светодиодами в означенных им режимах это абсолютно тривиальная задача для Arduino, а для Arduino Mega Server это вообще не задача, а сущее недоразумение — его штатными средствами организуется многозадачность, которая легко управляет сотнями различных сущностей (светодиодов, сервоприводов, шаговых моторов и т. д.) в реальном времени.
Давайте вместе разберёмся как организовать многозадачность на Arduino, а заодно поможем студентам МИРЭА избавится от навязанных им стереотипов восприятия по отношению к социо-культурному и технологическому феномену нашего времени под названием Arduino.
Лекции Олега Артамонова
Нужно отдать должное, сами лекции Олега хороши — в них даётся много полезной и хорошо структурированной информации о микроконтроллерах и я бы рекомендовал всем заинтересованным в этом вопросе с ними ознакомиться. Единственным недостатком этих лекций мне показался неприкрытый техно-снобизм в отношении Arduino, которая выступает в них в роли «мальчика для битья».
В частности, на протяжении всех лекций Олегом делаются безапелляционные заявления о непригодности Arduino для построения сложных многозадачных систем, что просто противоречит истине и реальной практике.
На Arduino можно делать потрясающие многозадачные системы в которых в (псевдо, естественно) многозадачном режиме одновременно работают десятки и сотни сущностей (светодиодов, датчиков, актуаторов, сервоприводов, шаговых моторов, беспроводных и проводных интерфейсов и т. д.).
Не будем далеко ходить за примерами. Вот проект Зимнего сада («Умной теплицы») в котором в реальном времени в многозадачном режиме работают следующие сущности:
Топология распределённого nRF24 контроллера с огромным числом подключённого и работающего в реальном времени оборудования. Пользователь имеет дело только с «базой», работа nRF24 партнёра полностью прозрачна для него. И, да, это Arduino.
— 7 сервоприводов
— 9 шаговых моторов
— 6 реле
— 3 датчика влажности почвы
— 2 датчика освещённости
— Датчик уровня воды
— Датчик влажности и температуры воздуха
На nRF24 удалённой части:
— 12 датчиков влажности почвы
— 12 реле
— 3 шаговых мотора
— 2 датчика освещённости
— Датчик уровня воды
Кроме этого, в реальном времени функционирует собственно сама nRF24 связь между двумя распределёнными частями системы и Ethernet интерфейс сервера и серверный движок, обеспечивающий веб-интерфейс пользователя системы.
Итого, в реальном времени, в многозадачном режиме на 8-битной Меге функционирует как минимум 60 сущностей (и это не считая множества сервисов самой операционной системы AMS, с ними число сущностей приблизится к сотне). Что очевидным образом никак не согласуется с высказыванием о том, что «на Arduino невозможна настоящая многозадачность и мигать даже пятью светодиодами на ней проблематично».
Пара слов в защиту Arduino
(Хотя очевидно, что Arduino как социо-культурный и технологический феномен с многомиллионной армией поклонников и многими тысячами потрясающих проектов в защите не нуждается.)
Я много раз говорил и ещё раз повторю, что Arduino в своей софтверной составляющей это, по сути, просто один из возможных уровней абстракции (как и любой другой) со своими достоинствами и недостатками. И пользователю нет абсолютно никакой разницы, что «крутится» внутри его маленького кусочка кремния — «чистая» Arduino, RTOS, RIOT OS, AMS или какая-то другая математическая абстракция представления и управления железными ресурсами контроллера.
Пользователю важно решение его проблем — чтобы контроллер поливал растения, включал свет, управлял шторами и т. д. И основная проблема не в инструментах, используемых в разработке, а в умении ими пользоваться и, банально, в воображении и инженерном видинии самого разработчика.
Как это работает?
Сама по себе многозадачность на микроконтроллерах может быть организована разными способами, в данном случае речь пойдёт о самом простом — процессы по очереди получают управление и добровольно отдают его после использования своего кванта времени. Этот способ, конечно, не лишён очевидных недостатков, но, как говорится, практика — критерий истины и он прекрасно зарекомендовал себя в реальных условиях: он используется как в стандартных дистрибутивах Arduino Mega Server, так и во множестве проектов на AMS Pro. И эти системы работают в режиме 24/7 и имеют подтверждённые аптаймы во многие месяцы беспроблемной работы.
Это индикация около сотни сущностей распределённой nRF24 системы, управляемых независимо друг от друга в реальном времени. Обратите внимание на два последних индикатора «CPU» — при этом даже на 8-битной Меге загрузка процессора ровна нулю (то есть система полностью свободна).
Немного о таймерах
Для организации управления сложными системами недостаточно просто передавать по очереди управление между процессами и наряду с автоматической передачей управления в AMS используются различные виды таймеров: циклические, циклические с заданным количеством повторений (пакетные), одиночные, рандомные, смешанные и т. д. Всё это организовано нативными средствами Arduino и не использует прерывания или прямое программирование таймеров микроконтроллера (но прерывания, конечно же, использоваться системой «по их прямому назначению»).
Что опять же вступает в прямое противоречие с высказыванием «На 3 светодиода железных таймеров хватит, с дальше у ардуинщиков начнутся проблемы». Не начнутся. Нам доступны любые типы таймеров в любом количестве. И, при желании, мы можем наделать себе ещё сколько угодно новых и сколь угодно экзотических.
Основной кейс
Основной кейс при данном типе организации многозадачности — это создавать так называемый «неблокирующий» код, то есть код, который не использует функцию delay(), которая просто приостанавливает выполнение программы на заданное время.
Реальное время
Описываемый способ реализации многозадачности можно охарактеризовать как «soft-realtime», типовое время задержки в системе составляет 10 мс (но пиковые задержки могут быть значительно больше и не нормируются). Это накладывает известные ограничения на спектр применения данного решения, но для большинства «бытовых» задач (и не только) он прекрасно подходит, см. пример выше.
Если требуется управление в более жёстком реальном времени, то это требует специальной оптимизации кода под конкретную задачу, перестройки архитектуры или, в совсем крайних случаях, выделения отдельного контроллера под специфические функции. Как пример, выделение отдельного контроллера эффектов умной светодиодной ленты.
Это общее теоретическое описание работы многозадачности в Arduino вообще и в AMS в частности, теперь перейдём к рассмотрению практических примеров.
Циклические таймеры
Рассмотрим реализацию самых простых циклических таймеров. Это таймеры (в терминологии AMS «cycles»), которые включаются через определённые, заранее заданные промежутки времени и используются для активации циклических процессов.
Вообще, таймеры программно лучше оформлять в виде объектов, но в стандартной поставке Arduino Mega Server эти таймеры реализованы в виде функций, поэтому, для начала, рассмотрим их в этой ипостаси.
Использовать циклические таймеры очень просто: достаточно поместить код, который нужно периодически выполнять, между скобками оператора if. Если нужно использовать другой интервал срабатывания, то просто используем нужную переменную вместо cycle1s. Различных циклов можно сделать сколько угодно — система даже на 8-битной Меге без проблем потянет обслуживание буквально сотен таких таймеров (только, естественно, нужно не забывать чтобы вызываемый код не был блокирующим).
Теперь организация работы таймеров. Определение управляющих переменных в главном файле:
Набор интервалов может быть расширен любыми нужными значениями от десятков миллисекунд до суток и более.
И далее код подключения этих таймеров в основном цикле. В начале главного цикла проверяется не сработал ли какой-либо из таймеров, а в конце все поднятые флаги таймеров сбрасываются. Любой системный код находится между этими двумя функциями и, что наиболее важно, любой из таймеров можно использовать многократно в любых частях кода системы.
Циклические таймеры в виде объектной библиотеки
Теперь рассмотрим организацию тех же таймеров, но в более правильном объектном виде, оформленном в готовую библиотеку. Назовём её myCycle.
Заголовочный файл в котором представлены объявления класса, методов и некоторых предопределённых констант:
И файл реализации в котором находится код библиотеки:
Использование этого варианта тоже просто и имеет некоторые преимущества перед «функциональным» вариантом: тут можно очень легко объявлять таймеры с нужными интервалами и не нужно заранее создавать множество таймеров «на всякий случай».
В главном файле:
Добавляем функции обслуживания работы таймеров:
В главном цикле используем объявленные таймеры в любом нужном месте кода:
Библиотека имеет несколько более широкий функционал, чем код, приведённый в первом варианте. Например, она содержит методы активации/дезактивации таймеров, установки и получения текущего значения, рестарта и реинициализации таймеров, что ещё больше расширяет возможности использования их в практических задачах.
Другие виды таймеров на Arduino
Чтобы не загромождать статью, я не буду здесь приводить код и разбирать работу всех возможных типов таймеров — все они строятся по одним и тем же принципам. Если эта тема будет интересна, то можно будет написать отдельную статью об этом. Здесь я только дам общее описание таймеров, которые используются в AMS и прекрасно себя зарекомендовали на практике.
Циклические с заданным количеством повторений (пакетные)
Это таймеры, которые срабатывают заранее определённое количество раз. Например, вам нужно делать 3 попытки отправки сообщения по беспроводному каналу nRF24. Таймер активируется только 3 раза и соответственное количество раз делаются попытки отправки сообщений.
Тут же возможны различные расширения функциональности типа активации/дезактивации таймера в зависимости от определённых условий и т. п.
Одиночные
Это различные вариации на тему «автозагрузки», когда какое-либо действие выполняется через определённый интервал времени после старта контроллера или какого-либо события.
Рандомные
Иногда требуется не строгая периодичность выполнения каких-то действий, а наоборот некий разброс срабатываний возле некоторого среднего значения, для этих целей применяются так называемые рандомные таймеры.
Например, у вас есть два распределённых контроллера, которые связаны друг с другом по беспроводному каналу. Если одна система будет посылать свои сообщения другой, согласуясь со срабатыванием обычного таймера, например, раз в 20 секунд, то эти сообщения будут приходить на вторую систему в строго определённой «фазе», которая может попадать в «проблемный» интервал работы цикла второго контроллера, в результате его работа может быть нестабильной. Если в этом случае использовать рандомный таймер, то он «размажет» по времени моменты прихода сообщений от первого контроллера и проблемы удастся избежать.
Это только абстрактный пример для понимания того, что собой представляют рандомные таймеры. И вы можете ознакомиться с их реализацией — стандартный дистрибутив Arduino Mega Server содержит код такого таймера.
Смешанные
Тут полная свобода действий, можно как угодно комбинировать работу различных типов таймеров, используя запуск одних таймеров от других и их встроенную логику типа активации/дезактивации по условиям, изменение периода срабатывания «на лету» и т. п.
Нет практически никаких ограничений на количество таймеров и логику работы — их может быть сотни, даже на 8-битном контроллере.
Межпроцессное взаимодействие
Межпроцессное взаимодействие, семафоры, почтовые ящики и прочие атрибуты многозадачных систем организуются на Arduino тоже без каких-либо проблем — их можно организовать любым удобным для вас способом — начиная от передачи параметров через статические переменные и заканчивая упаковкой логики в любые классы и объекты, тут нет абсолютно никаких ограничений и проблем.
Подробное описание межпроцессного взаимодействия выходит за рамки этой статьи, но вы можете скачать себе дистрибутив Arduino Mega Server для любой платформы и самостоятельно ознакомиться с его устройством и работой.
Заключение
В общем, можно сказать, что средствами Arduino можно создать любые виды таймеров, запускать любое их количество и использовать любое их сочетание, другими словами, Arduino может удовлетворить любой каприз по таймерному (псевдо) многозадачному управлению сложными микроконтроллерными системами.
И это не должно быть секретом для студентов МИРЭА, как будущих инженеров микропроцессорных систем, ведь эти принципы можно применять на любой платформе.