
Основные тезисы или о чем эта статья
Продолжаем цикл статей о ShIoTiny — визуально программируемом контроллере на базе чипа ESP8266.
В этот статье рассказано на примере проекта управления вентиляции в ванной комнате или другом помещении с повышенной влажностью о том, как строится программа для ShIoTiny.
Предыдущие статьи серии.
ShIoTiny: малая автоматизация, интернет вещей или «за полгода до отпуска»
ShIoTiny: узлы, связи и события или особенности рисования программ
Ссылки
Сайт проекта ShIoTiny
Бинарные прошивки, схема контроллера и документация
Инструкция и описание узлов
Настройка MQTT брокера cloudmqtt.com
Панель управления MQTT dashboard для Android
Введение
Понимания вне опыта не бывает. Это истина, проверенная временем и поколениями. Поэтому нет ничего лучше для обучения практическим навыкам, чем попытки сделать что-то самостоятельно. И примеры, которые показывают что можно делать, а что не стоит и пробовать, тут придутся как нельзя кстати. Чужие ошибки, конечно, не смогут предотвратить возникновение ошибок собственных, но могут помочь сократить число последних.
Вопросы и письма читателей предыдущих статей подвигли меня сделать небольшой проект-пример управления вентиляцией для того, чтобы показать как работают узлы ShIoTiny.
Изначальная идея, на основе которой появился контроллер ShIoTiny — насосно-поливальная станция — далеко не всем подойдет и будет интересна. Поэтому я взял всем понятную и многим полезную систему управления вентиляцией в качестве примера.
Скажу, что идея проекта не моя, а почерпнул я ее отсюда и затем адаптировал к 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, рассчитанное по формуле
Или, по-простому, вращая движок переменного сопротивления, можно задать пороговый уровень влажности от 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
