Основные тезисы или о чем эта статья
Продолжаем цикл статей о ShIoTiny — визуально программируемом контроллере на базе чипа ESP8266.
В этот статье рассказано на примере проекта управления вентиляции в ванной комнате или другом помещении с повышенной влажностью о том, как строится программа для ShIoTiny.
Предыдущие статьи серии.
ShIoTiny: малая автоматизация, интернет вещей или «за полгода до отпуска»
ShIoTiny: узлы, связи и события или особенности рисования программ
Ссылки
Бинарные прошивки, схема контроллера и документация
Инструкция и описание узлов
Настройка MQTT брокера cloudmqtt.com
Панель управления MQTT dashboard для Android
Введение
Понимания вне опыта не бывает. Это истина, проверенная временем и поколениями. Поэтому нет ничего лучше для обучения практическим навыкам, чем попытки сделать что-то самостоятельно. И примеры, которые показывают что можно делать, а что не стоит и пробовать, тут придутся как нельзя кстати. Чужие ошибки, конечно, не смогут предотвратить возникновение ошибок собственных, но могут помочь сократить число последних.
Вопросы и письма читателей предыдущих статей подвигли меня сделать небольшой проект-пример управления вентиляцией для того, чтобы показать как работают узлы ShIoTiny.
Изначальная идея, на основе которой появился контроллер ShIoTiny — насосно-поливальная станция — далеко не всем подойдет и будет интересна. Поэтому я взял всем понятную и многим полезную систему управления вентиляцией в качестве примера.
Скажу, что идея проекта не моя, а почерпнул я ее отсюда: habr.com/ru/company/masterkit/blog/385281 и затем адаптировал к ShIoTiny.
Сначала пойми чего ты хочешь
Процесс совершенствования — бесконечен. И именно это свойство погубило множество хороших идей и проектов. Разработчик вместо того, чтобы выпустить пусть и не идеальную, но рабочую вещь — продолжал её совершенствовать. И совершенствовал до тех пор, пока конкуренты не обходили его, выпуская пусть и не идеальное (а часто откровенно убогое), но работающее решение.
Поэтому очень важно знать — где поставить точку в проекте. Или, иными словами, надо определить что мы хотим получить в конце проекта из того, что у нас есть в начале. В русском языке для документа, который составляется как раз с целью описать путь создания чего-либо, есть прекрасное короткое и емкое слово «план», которое умственно отсталые переводчики и дефективные менеджеры в последнее время почему-то начали именовать «дорожная карта». Ну да бог с ними.
Наш план будет таким. Предположим, что имеется помещение, влажность в котором может временами сильно повышаться. Например такое, как ванная комната или кухня. Влажность — вещь неприятная и способ борьбы с ней стар как мир: проветрить помещение. Способов проветривания довольно много. Но мы, пожалуй, откажемся от экзотических и старомодных способов вроде негров с опахалами и остановимся на обычном вентиляторе. Вентиляторы дешевле, да и найти их в наших краях проще.
Одним словом, мы хотим управлять вентилятором: включать его и, соответственно, выключать. Точнее мы хотим, чтобы он сам включался и выключался когда надо.
Осталось определить: при каких условиях вентилятор должен включаться и при каких условиях — выключаться.
Тут все очевидно: если влажность выше какого-то заданного предела — вентилятор включается и вытягивает воздух; влажность пришла в норму — вентилятор отключается.
Внимательный читатель сразу зацепится взглядом за слово «заданной». Кем заданной? Как заданной?
Задавать пороговую влажность можно несколькими способами. Мы рассмотрим два из них: первый — с помощью переменного сопротивления и второй — по сети через протокол MQTT. У каждого из этих способов есть преимущества и недостатки, которые будут рассмотрены в дальнейшем.
Для тех, кто не понял, поясню, что «пороговая влажность» — это такой уровень влажности, при превышении которого требуется включение вентилятора.
Следующий вопрос: давать ли пользователю право включить вентилятор непосредственно? То есть вне зависимости от уровня влажности, по нажатию кнопки? Мы такую возможность предусмотрим. Ведь вентилятор может понадобиться не только при повышенной влажности, но и для удаления из помещения, например, неприятного запаха, именуемого в народе «вонью».
Итак, мы поняли чего хотим и даже немного, как это будет работать. Перечислим кратко все функции нашей системы управления вентиляцией:
• установка порогового уровня влажности (два варианта);
• измерение уровня влажности;
• автоматическое включение вентилятора;
• автоматическое выключение вентилятора;
• ручное включение вентилятора (по нажатию кнопки).
Итак, план понятен. Необходимо реализовать все выше перечисленные функции в нашей программе. На основе этого «плана» и будем действовать. Для начала нарисуем структурную схему устройства.
Структурная схема устройства
Вообще говоря, таких схем у нас будет две. Первая — для варианта, в котором пороговый уровень влажности задается переменным сопротивлением. Вторая схема — для варианта, в котором пороговый уровень влажности задается по сети через протокол MQTT.
Но так как эти схеме будут отличаться всего на один элемент — переменный резистор «установка порогового уровня влажности», то нарисуем лишь одну структурную схему. Конечно, структурная схема согласно ГОСТ выглядит иначе. Но мы ориентируемся не на зубров-инженеров, а на молодое поколение. Поэтому наглядность важнее.
Итак, что ж мы видим на рисунке? Вентилятор подключен к реле Relay1 контроллера ShIoTiny. Обращаю внимание, что вентилятор есть штуковина, обитающая под высоким напряжением. Поэтому, ежели кто будет делать сам такое — проявляйте осторожность. То есть, как минимум, прежде чем совать свои пальцы или измерительные приборы в схему — обесточьте как минимум вентилятор. И второе замечание. Если ваш вентилятор мощнее, чем 250Вт, то подключать его напрямую к ShIoTiny не стоит — только через пускатель.
С вентилятором разобрались. Теперь кнопка «ручное включение» вентилятора. Она подключена ко входу Input1. Тут и пояснять больше нечего.
Датчик температуры и уровня влажности DHT-11 (или DHT-22 или их аналоги). Для его подключения предусмотрен специальный вход на контроллере ShIoTiny. Как видно на рисунке — подключение такого датчика тоже проблем не представляет.
И, наконец, переменное сопротивление, задающее пороговый уровень влажности. Точнее — делитель, состоящий из переменного и постоянного сопротивлений. Проблем с его подключением нет, но поясню, что встроенный АЦП на ESP8266 рассчитан максимум на 1Вольт. Поэтому и нужен делитель напряжения примерно в 5 раз.
И еще раз напомню, что этот делитель не нужен, если пороговый уровень влажности задается по сети посредством протокола MQTT.
Начнем составлять алгоритм работы устройства в редакторе ElDraw ShIoTiny. Как туда попасть, в этот редактор, можно почитать в статьях ранее или в инструкции, ссылка на которую есть в начале статьи.
Вариант первый, простейший
Начнем с простого: включения реле Relay1 по превышению порогового уровня влажности на заданное время.
Как видим, ничего сложного: всего четыре узла, не считая узлов-комментариев. DHT11 — это собственно датчик температуры и влажности (можно поменять на DHT22).
Константа CONST — пороговый уровень влажности, в процентах.
Компаратор — узел сравнивающий два числа и выставляющий на выходе 1, если заданное условие выполняется и 0, если условие не выполняется.
В нашем случае таким условием будет A>B, где A — измеренный датчиком уровень влажности, а B — пороговый уровень всё той же влажности.
Как только измеренный уровень влажности (A) превысит пороговый уровень влажности (B), тут же на выходе компаратора A>B появится 1 и реле включится. И наоборот, как только уровень влажности придет в норму (то есть A<=B), тут же на выходе компаратора A>B появится 0 и реле отключится.
Все понятно? Кому не очень — прочитайте еще раз или загляните в описание работы узлов в инструкции.
Замечу, что данные с датчика DHT11 обновляются примерно один раз в 10сек. Поэтому реле не сможет включаться и отключаться чаще, чем один раз в 10сек.
Все бы ничего, но мы хотели бы задать пороговый уровень влажности с помощью переменного резистора. Нет ничего проще!
Просто заменим узел-константу на узел АЦП. Ведь именно к АЦП мы подключили делитель напряжения с переменным резистором.
Напряжение на входе АЦП изменяется от 0 до 1Вольта. А вот влажность на выходе датчика — изменяется от 0 до 100%. Как же мы их сравниваем? Все просто. Узел АЦП в ShIoTiny не просто измеряет напряжение на входе, но и умеет его масштабировать и сдвигать.
То есть на выходе узла ADC1 (АЦП) будет значение X, рассчитанное по формуле
, где — напряжение на входе ADC (от 0 до 1В); k — диапазон (ADC range) и b-смещение (ADC offset). Таким образом, если задать k=100 и b=0, то при изменении в диапазоне от 0 до 1, значение X на выходе узла АЦП будет изменяться в диапазоне от 0 до 100. То есть, численно равное диапазону изменения влажности от 0 до 100%.
Или, по-простому, вращая движок переменного сопротивления, можно задать пороговый уровень влажности от 0 до 100. Единственное неудобство, что нет никаких устройств отображения. Но на практике, если у движка переменного сопротивления сделать 6 делений 0%, 20%, 40%, 60%, 80%, 100%) — то этого достаточно для того, чтобы выставлять пороговый уровень влажности.
Как нам выставить коэффициенты k — диапазон (ADC range) и b-смещение (ADC offset)? Да проще пареной репы! Ткните указателем мыши в узел ADC1 и тут же у вас появится окно настройки. В нем можете выставить все, что вам нужно. Для нашего случая это будет такое окно, как на рисунке.
Итак, простейшее рабочее решение у нас есть. Начнем его усовершенствовать.
Кстати, у простейшего решения есть одно достоинство — ему не нужен интернет. Оно полностью автономно.
Вариант второй, подключаем кнопку
Все работает и все рады. Но вот незадача, мы не можем включить вентиляцию принудительно. Мы уже условились, что ко входу Input1 у нас будет подключена кнопка, которая будет включать и выключать вентилятор принудительно, не обращая внимания на датчик влажности.
Пришло время обработать эту кнопку в нашей схеме-программе.
Блок обработки нажатия кнопки выделен оранжевой линией. Он представляет собой счетчик нажатий кнопки, который сбрасывается в ноль, когда значение на его выходе превысит единицу (зеленая линия, выход узла CT).
Работает все тут так же незамысловато, как и прежде: счетчик CT считает нажатия кнопки, подключенной ко входу Input1. То есть значение на выходе этого счетчика с каждым нажатием кнопки увеличивается на 1.
Как только это значение станет равным двум (то есть больше 1), тут же на выходе компаратора A>B появится 1. И эта 1 сбросит счетчик CT в нуль. Имеется ввиду компаратор, нижний по схеме!
Таким образом, у нашей кнопки два состояния — 0 и 1. Если бы нам надо было больше состояний (3 или 4 или еще больше) — нам было бы достаточно изменить константу CONST с единицы на другое значение.
Итак, у нас есть два условия включения вентилятора: превышение заданного уровня влажности и однократное нажатие кнопки. При выполнении любого из условий вентилятор включится. И будет работать до тех пор пока повторно не нажмут кнопку И уровень влажности не придет в норму.
Можно, конечно, еще больше усложнить алгоритм, но мы этого делать не будем — оставим простор для творчества желающим.
Вариант третий, подключаемся к интернету
Все, что мы описали — вполне работоспособно. А как же понты? Ведь любой прыщавый хипстер-хакер-крекер засмеет того, кто крутит ручку и нажимает кнопку, а не управляет со смартфона! Крутить ручку — это «не модно». А вот елозить пальцем по смартфону, стирая этот палец в кровь — вот он, пик желаний хипстера-хакера-крекера (никогда не мог различить всех их — так что если ошибся, простите).
Но будем снисходительны к указанным личностям. У управления посредством интернета есть и реальные плюсы. Во-первых, это наглядность. Есть масса приложений под все платформы, которые позволяют парой тыков создать вполне пригодную для использования панель управления нашим контроллером-карлсоном. Во-вторых, это возможность дистанционно наблюдать за состоянием влажности в помещении. И, в-третьих, можно видеть не только то, что делает вентилятор — вертится или нет, но и то, какой пороговый уровень влажности задан. И то — включился вентилятор автоматически или вручную. В общем все, что пожелаете.
Конечно, для какого-то вентилятора много чести — столько внимания. Но это лишь пример.
Итак, для подключения к интернету мы будем использовать технологию MQTT и одноименный протокол.
Чтобы воспользоваться этой технологией, нам необходим MQTT-брокер. Это такой специальный сервер, который обслуживает MQTT-клиентов, например ShIoTIny и ваш смартфон.
Суть технологии MQTT состоит в том, что любой из клиентов публикует на MQTT-брокере (сервере) произвольные данные под определенным именем (называемом topic в терминологии MQTT). Другие клиенты могут подписаться на произвольные данные по их имени (topic) и получать вновь опубликованные данные. То есть весь обмен данными идет по принципу клиент-брокер-клиент.
Я не буду заостряться на подробностях. В интернете масса статей и обучалок по тому как работает MQTT и какие есть программы для создания панелей управления. Просто покажу как нам принимать и публиковать данные посредством ShIoTiny.
В качестве брокера я использовал www.cloudmqtt.com, но принцип везде один.
Итак, будем считать, что вы зарегистрировались на MQTT-брокере. В общем случае, брокер выдаст вам (или потребует придумать) имя пользователя и пароль (для авторизации), а так же порт для подключения. Подключить ShIoTiny к MQTT-брокеру можно двумя способами — обычное подключение и по TLS (SSL).
Все эти параметры в ShIoTiny вводятся на вкладке Networking, раздел MQTT Connection to server.
Если ваш MQTT-брокер не требует авторизации — не вводите логин и пароль (оставьте эти поля пустыми).
Параметр MQTT topic prefix требует отдельного пояснения.
Префикс MQTT-параметров — это строка, добавляемая к названию темы (topic) при публикации и подписке на MQTT-брокере. Чтобы установить MQTT-префикс для вашего контроллера, его надо просто ввести в поле ввода «Префикс темы MQTT» («MQTT topic prefix»). Префикс всегда начинается со слеша («/»)! Если вы не введете слэш в поле ввода — он добавится автоматически. В префиксе нельзя использовать символы «#» и «+». Других ограничений нет.
Например, если вы публикуете параметр «status» (или подписываетесь на него), а ваш префикс задан как «/shiotiny/», то на брокере этот параметр будет опубликован под именем «/shiotiny/status». Если у вас задан пустой префикс, то все параметры на брокере будут начинаться со слеша («/»): «status» будет публиковаться как «/status».
Итак, считаем, что вы зарегистрировались на MQTT-брокере и получили логин, пароль и порт. Затем вы прописали эти параметры на вкладке Networking, раздел MQTT Connection to server контроллера ShIoTiny.
Считаем, что префикс установлен в значение «/room/».
Начнем с того, что опубликуем состояние всех ключевых параметров: реле Realay1, состояния ручного включения, состояния автоматического включения и, наконец, пороговый и текущий уровни влажности. Ну и бонусом — температуру в помещении. Как это сделать, смотрите на рисунке.
Как видим, отличие от предыдущего варианта — только узлы «MQTT Publish». С учетом префикса, публикуются следующие параметры:
Как видим, всё состояние системы у нас как на ладони!
Но мы хотим не только видеть, но и управлять. Как быть? Очень просто. Мы откажемся от установки порогового уровня влажности с помощью АЦП и переменного резистора и будем задавать этот самый пороговый уровень влажности по MQTT прямо со смартфона!
Удаляем узел АЦП из схемы и включаем туда три новых узла: FLASH store, FLASH restore и MQTT describe.
Функция узла MQTT describe очевидна: он получает параметр /room/trigHset (пороговый уровень влажности) с MQTT брокера. Но что он делает с данными дальше? Просто отдает их узлу FLASH store, который, в свою очередь, сохраняет эти данные в энергонезависимой памяти под именем trigH. После этого, узел FLASH restore считывает из энергонезависимой памяти данные под именем trigH и что происходит далее мы уже знаем.
Зачем такие сложности? Почему нельзя сразу отдать полученные данные на вход компаратора?
Как говаривал товарищ Ш.Холмс — это элементарно! Никто не гарантирует, что после включения вашего устройства, оно присоединиться к MQTT-брокеру. А влажность измерять надо. И вентилятор надо включать. Но без информации о пороговом уровне влажности это невозможно! Поэтому, наше устройство при включении извлекает ранее запомненный пороговый уровень влажности из энергонезависимой памяти и использует для принятия решений его. А уж когда установится соединение с MQTT-брокером и кто-нибудь опубликует новое значение /room/trigHset, тогда будет использоваться это новое значение.
Дальше вы можете придумывать все что угодно. Например, помимо влажности ввести ещё и учет температуры. Или добавить «умное» управление освещением (у нас ещё остались неиспользованными два реле и два входа). Все в ваших руках!
Заключение
Вот и рассмотрели мы несколько примеров реализации простейшего по сути своей контроллера на базе ShIoTiny. Может быть это будет кому-то полезно.
Как всегда, предложения, пожелания, вопросы, опечатки и прочее — на почту: shiotiny@yandex.ru
Автор: shiotiny