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