Хабрахабр

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, рассчитанное по формуле

$X=k \cdot u_ +b$

, где $u_{вх}$ — напряжение на входе ADC (от 0 до 1В); k — диапазон (ADC range) и b-смещение (ADC offset). Таким образом, если задать k=100 и b=0, то при изменении $u_{вх}$ в диапазоне от 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

Показать больше

Похожие публикации

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Кнопка «Наверх»