Хабрахабр

[Из песочницы] ShIoTiny: малая автоматизация, интернет вещей или «за полгода до отпуска»

Основные тезисы или о чем эта статья

Так как интересы людей разные, а времени у людей мало, то кратко о содержании статьи.

Статья эта представляет собой обзор проекта контроллера с минимальной ценой и возможностью визуального программирования посредством WEB-браузера.

Поскольку это статья-обзор, направленная на то, чтобы показать "что можно выжать из копеечного контроллера", глубоких истин и подробных алгоритмов в ней искать не стоит.

Рассмотрена мотивация, идеи и результаты построения контроллера на базе WiFI-чипа ESP8266.

Предупреждение

Я вообще не любитель писать статьи. Я не хотел писать эту статью. Думать, как написать так, чтобы количество неправильно тебя понявших свелось к минимуму. Это надо думать и причем — много. И много еще о чем думать.
Но друзья сказали, что раз мои потуги на поприще IoT и прочей малой автоматизации интересны им, то они и другим могут быть интересны и широкой публике. Думать, как не скатиться в крайности. Конечно, на хабре. Ну а где собирается публика, которой интересно такое? Старый читатель и новый писатель.
И вот я тут.

Читайте на свой страх и риск. За ошибки, неточности, опечатки, несовременный стиль изложения и прочее, что может не понравиться читателю, я никакой ответственности не несу.

Кое-какие ссылки есть в конце статьи. Ещё я сразу предупреждаю, что не буду пояснять что такое MQTT, WiFi и UDP multicast и другие вещи, прямо не относящиеся к теме.

Рождение идеи или немного лирики

Вот и я хочу поделиться тем, как случайные события, помноженные на закономерную лень, вылились в довольно интересную разработку контроллера на базе ESP8266. Жизнь — штука непростая и его величество Случай играет в ней далеко не последнюю роль.

Начиналось все довольно буднично: хотелось построить систему управления водопроводом и поливом грядок-кустов на даче.

Но, поскольку полноценно заниматься трубами-баками-кранами мне можно лишь в отпуске, до которого было еще больше полугода — все ограничивалось обсуждением на работе с коллегами и с друзьями-товарищами в неформальной обстановке.

Задолго до появления интернета как такового в широком пользовании. Тема «малой автоматизации» или, как это принято говорить у «этих ваших школоло-хакеров-хипстеров» — тема IoT — Интернета вещей — интересовала меня давно.

И желательно, чтобы я мог управлять ими как-то на расстоянии. Еще в детстве мне хотелось чтобы вещи делали что-то «сами». Интернета не было в широком доступе нигде в мире, как не было нигде и сотовых телефонов, планшетов и даже LCD-дисплеев и USB-флешек. Но в то время (80е, начало 90х годов прошлого тысячелетия) с этим было сложновато. Но для тех времен и того возраста и это было неплохо и интересно. Так что приходилось ограничиваться «выключателями света по хлопку» и простейшими пультами дистанционного управления по радио.

Нонче на дворе век XXI. Но это дела прошлые. И у каждого в кармане смартфон, интернет есть практически везде, где надо и не надо, да и база доступных электронных компонентов сейчас такая, что еще лет 15 назад и не снилась рядовому жителю планеты Земля.

И если не хватит одного контроллера — можно поставить два, три или пять. Поэтому, решив слепить контроллер для водяных дел на даче, я обратил взоры на чип ESP8266.
Во-первых, этот чип дешев. То есть можно смотреть что происходит через интернет и даже управлять процессом с любого смартфона. Во-вторых, он имеет WiFi на борту. Все равно она почти везде есть или вот-вот будет, в том числе — и у меня на даче. Разумеется, нужна точка доступа с выходом в интернет, но это не проблема.

Погрузившись в удивительный мир проектов для ESP8266, я с удивлением обнаружил, что несмотря на обалденные возможности этого чипа — проекты на нём, за редким исключением, делятся на два типа: это или крайне примитивные программки типа «щелкаем релюхами со смартфона и глазеем на состояние датчика температуры через интернет»; или хорошие и добротные интерпретаторы JavaScript или Lua, но к сожалению, сжирающие почти всю память и не позволяющие сделать чего-то серьезного.

Но, как тертый калач в плане скакания по граблям внедрения разных систем, я понимал, что предусмотреть заранее все изгибы алгоритма, которые захочется или будет необходимо выпрямить во время строительства водопровода-полива — я точно не смогу. Первая моя идея была простой как блин — написать простую программу управления насосами по состоянию датчиков и все.

А придется.
Какой же выход? Дорабатывать программу на даче, в темном сарае — не очень удобно. Один мой коллега дал массу советов — что настроить и как. Конечно, первое, что пришло в мою голову — это сделать алгоритм настраиваемым. Спасибо ему. Этим он зарубил мою первую идею на корню. Если бы он не развернул перед моим взором количество параметров, которое мне надо будет настроить — я бы наверное так и не отказался от этого варианта: сделать страницу настроек алгоритма.

Я в очередной раз понял, что всего не предусмотреть… Но ужасающая картина количества настоечных параметров, да еще и влияющих один на другой — отрезвила меня.

Очень ленив! Сразу оговорюсь: я ленив. Поэтому встала задача — как быстро и просто задавать алгоритм, желательно без программирования? Мне откровенно каждый раз переписывать программу. А устройство так хочется сделать более или менее универсальным… Причем этот алгоритм будет довольно сложен; будет иметь массу параметров; будет индивидуален для моего случая и непригоден для других.

Как программировать не программируя? Поскольку до отпуска и всяких трубонасосных дел, было еще около полугода — я решил не торопясь обдумать: как сделать удобно и красиво? Как обойтись без триллиона изменяемых при настройке параметров?

Ну и ткнув в квадратик, хочу иметь возможность настроить какие-то его индивидуальные параметры. Как обычно, все уже было придумано до нас: я понял, что хочу рисовать алгоритм в виде квадратиков-действий и соединять их линиями связи, которые показывают откуда и куда летят данные.

Такие системы были еще в 80е; нонче есть супер-популярная система NodeRed, которая хорошо известна тем, кто уже приобщился к миру малой автоматизации/IoT. Идея задавать алгоритм, рисуя его квадратиками не нова.

На худой конец — на Raspberry PI. Но вот незадача: такие системы рассчитаны на «большие ПК». Но никак не на ESP8266, у которого всего несколько десятков килобайт ОЗУ и операционки то нет!

А выхода всего два: писать-рисовать программу на «большом ПК» или ноуте, а затем в каком-то виде её передавать на ESP8266 или попытаться «впихнуть невпихуемое» в сам контроллер ESP8266. Как быть?

То есть ноутбук с WEB-браузером и мой контроллер — этого должно быть достаточно для полной настройки и написания-рисования программ управления. Поэтому программа-максимум у меня была такой: для программирования своего контроллера не должно быть нужды ни в чем, кроме ноутбука с WEB-браузером!

Скажу только, что на основании слов, которые приходили мне на ум и на язык в процессе разработки, можно было бы составить отдельный «Словарь нецензурной лексики работников электронной промышленности». И, как оказалось, реализовать такое оказалось вполне возможно!
Не буду утомлять вас всеми подробностями разработки проекта. Точнее не все, а первый, самый сложный этап, когда не понятно — будет твоя идея жить или это просто бред сивого мерина в лунную ночь. Но все позади.

Поделюсь результатом того, что вышло и получило название «Контроллер ShIoTiny».

И что же вышло?

И, наконец, три выхода в виде переключающих реле на 220Вольт, 1Ампер. Аппаратная часть контроллера ShIoTiny стандартна и проста: три входа, рассчитанные на датчики типа «сухой контакт» (кнопки, герконы, они же — датчики уровня воды в баке), один вход АЦП, один вход для подключения датчика температуры и влажности типа DHT22 или аналогичного. А для управления пускателями насосов и 1Ампер хватит. На реле написано 10А, но я реалист и пускать через плату 10Ампер не буду. Питается все это от источника питания напряжением от 5 до 9 вольт.

Мало ли что? Честно говоря, датчик температуры я добавил просто так «шоб было», а вот на АЦП — были надежды измерять напряжение питающей сети.

Разумеется, все входы, кроме входа для подключения DHT22, имеют защиту из резисторов и диодов: жечь ESP8266 у меня не было никакого желания, а диоды и резисторы стоят всего по несколько копеек.

Таких плат я заказал несколько — вдруг что сожгу или придется резать дорожки-ножки?
Но, к счастью — не пришлось. Фото готового изделия можно увидеть в начале статьи.

Но для удобства ниже приведен чертеж-схема подключения к плате имитаторов датчиков и исполнительных устройств. Фото изделия — это, конечно, красота и величие.

3, вместо пускателей — светодиоды, подключенные к реле Relay1.. Вместо датчиков уровня — кнопки Input1.. Ну и переменный резистор на АЦП, чтобы имитировать входное напряжение.
Когда реле выключено — горит красный светодиод. 3. Так вот и отлаживался я на столе. А когда включено — зеленый.

Ну и DIP-переключатель, переводящий устройство в режим программирования. Кроме всего этого — слева на плате разъем питания, а справа — две сервисные кнопки: Reset и AP. Разъем программирования ESP8266 через USB-UART адаптер тоже имеется.

А вот кнопка AP нужна для того, чтобы перевести ShIoTiny в режим открытой точки доступа (конфигурационный режим или Config Mode). Некоторые пояснения по кнопкам. Что такое Reset — и так понятно. Ну, например, вы напортачили с настройками сети и хотите их изменить. Зачем это нужно? Затем, берете свой смартфон или ноутбук, включаете WiFi и видите там открытую точку доступа с именем esp_8266_xxxx и подключаетесь к ней. Жмёте кнопку AP несколько секунд (пока не загорится красивый синенький светодиод). 168. После чего заходите в браузер смартфона или ноутбука и набираете в адресной строке: 192. 1. 4. Если всё в порядке — то вы попадаете на страницу контроллера ShIoTiny и можете его настраивать по новой.

Поэтому о программной части. Как видим, аппаратно ничего сложного.

Когда-нибудь. Все заскоки реализации я опишу, но потом. А сегодня я буду рассматривать программное обеспечение только «снаружи», то есть с точки зрения пользователя — себя или другого, рискнувшего использовать мою поделку (есть и такие каскадёры).

Все настройки, программирование и так далее — производится с помощью WEB-браузера. С точки зрения пользователя, устройство представляет собой HTTP-сервер, который доступен по WiFi.

Что мы видим? Итак, мы зашли на страницу контроллера. Кроме этого показаны параметры подключения к точке доступа (если работаем в режиме WiFi-станции); параметры точки доступа (если работаем в режиме WiFi-точки доступа) или и того и другого. А видим мы вкладку «Control and status», которая показывает текущее состояние используемых устройств: входов, выходов, АЦП, DHT22. Ну и вдобавок, показаны параметры соединения с MQTT-брокером, если используется протокол MQTT.

Даже нажимать не на что! Как видим, ничего особенного и интересного. Настройка сетевых параметров Networking и редактор схем-программ ElDraw. Хотя… Есть ведь еще две вкладки!

В ней есть ещё пара интересных параметров. Как вы догадались, Networking — это настройка сети, но не только. Вроде бы все понятно. «Тыкнем» же на вкладку Networking и увидим там примерно то, что показано на рисунке.
Настройка имени точки доступа и пароля для каждого из режимов — WiFi станции и WiFi точки доступа. Дело в том, что я никак не мог определиться — в каком режиме мне удобнее будет работать. Равно как и назначение кнопочки «Scan WiFi» вполне прозрачно.
А вот выпадающий список «ShIoTiny mode» требует пояснения. И поэтому предусмотрел 5 режимов работы устройства.

Перечислим кратко эти режимы работы.

Это режим открытой точки доступа с неизменным адресом 192. Config mode — режим конфигурации. 4. 168. 1 и именем esp_8266_xxxx.

Station mode — режим WiFi-станции, подключенной к вашей точке доступа.

Имя и пароль вы задаёте сами. AP mode — режим закрытой точки доступа.

AP+Station mode — это одновременное включение режимов AP mode + Station mode.

Одинокий контроллер, несущий свою тяжкую долю… Single mode — работа без подключения к сети вообще.

Это типа из соображений безопасности. В любом из режимов, кроме «Config mode», можно заблокировать WEB-страницу, установив галочку «Lock Web in Station mode».

Не буду тут останавливаться подробно. Настройки MQTT-очевидны: сервер, порт, пароль, открытое соединение или по SSL.

Настройки его тоже очевидны: адрес группы и порт.
Разумеется, что если описывать все нюансы настроек — получится отдельная статья, а это в мои планы не входит. Кроме всего прочего, контроллер ShIoTiny умеет посылать и принимать пакеты специального формата по multicast.

Перейдем к главной фишке контроллера — редактору схем-программ ElDraw. Итак, с вкладкой Networking всё более или менее ясно.

Разумеется, что если в устройстве нет загруженной схемы, то в поле схемы будет пусто. Ткнувшись на вкладку ElDraw, мы увидим примерно следующее.

Слева — палитра элементов или узлов (нод).
Справа — поле схемы или просто «схема».
Сверху — кнопки загрузки-выгрузки на диск и на устройство, а также кнопки редактирования.

Надо добавить элемент на схему — берем его мышкой и тащим из палитры в схему. Для тех, кто работал с редакторами — управление в общем-то очевидно. Надо соединить элементы — берем вход одного элемента и соединяем его с выходом другого. Надо удалить элемент или связь из схемы — тыкаем на него или на нее мышкой и нажимаем клавишу DEL.

К сожалению, нет возможности копирования элементов и групп элементов. Есть еще масштабирование (SHIFT+колесо мыши). Но это не сильно мешает.

Но выход узла — с несколькими входами других узлов. Кроме того, из соображений логики вход узла может быть связан только с одним выходом другого узла. Выходы — всегда справа. Входы — всегда слева узлов.

В палитре имеются узлы, представляющие всю аппаратуру контроллера ShIoTiny: входы, реле, АЦП, DHT11/22. Какие возможности у нас имеются для реализации алгоритмов?
Возможности — довольно обширные.

Для обработки данных имеются логические и арифметические узлы.

Чтобы мы могли работать с устройством через интернет, имеются узлы для подписки и публикации параметров на MQTT-брокере.

Если мы хотим, чтобы несколько контроллеров ShIoTiny обменивались информацией между собой — можно использовать узлы передачи и приёма параметров по UDP multicast протоколу.

Кроме этого, имеются узлы-таймеры; узлы управления обработкой событий.

Например, вы хотите, чтобы каждые 30 минут данные о температуре и влажности публиковались на MQTT-сервере? Приведу несколько примеров. Рисуем так. Нет ничего проще.

Всё!
Если у вас правильно настроена связь с MQTT брокером на вкладке Networking, то это всё!
Каждые полчаса, температура будет публиковаться на брокере под топиком /T, а влажность — под топиком /H. Жмем кнопочку «Upload». Потому что все времена измеряются в десятых долях секунды. Или, если вы зададите свои названия топиков — то под ними.
Законный вопрос: почему 18000 это 30 минут?

Не проблема. Теперь хотите добавить к этой схеме возможность включения реле Relay1 через интернет, да ещё и на определенное время? Дорисовываем так.

Всё! Опять жмем кнопочку «Upload». Да не просто включать, а ровно на 10 минут. Теперь, кроме того, что каждые полчаса, температура и влажность будут публиковаться на MQTT-брокере, появится возможность включать реле Relay1. А реальное состояние реле будет публиковаться в топике /r1status. Включать реле можно публикацией топика /r1cmd, установленного в 1.

Да как скажите. Вам хочется не только включать, но и отключать реле досрочно? Рисунок ниже показывает как это сделать!

Вы просто рисуете алгоритм мышкой! Принцип понятен? Это гораздо нагляднее, чем писать кучу кода. И немного пишете настроек: время, имя топика и все.

Вы можете раскрасить связи по своему усмотрению, чтобы не путаться в них. Кстати, подсветка связей разными цветами — это не «фотошоп» — это одна из функций редактора.

Для того, чтобы отлаживать алгоритм, есть кнопочка «Monitor start». Но и это еще не все! В этом режиме состояние всех выходов всех узлов периодически считывается из контроллера ShIoTiny и выводится на схему. Она, как это ни странно, включает режим «монитор». Примерно, как на рисунке ниже.

Очень помогает, когда что-то не понятно. То есть мы в «почти реальном времени» можем видеть что у нас на входе и выходе каждого узла.

Основная реализованная идея и так понятна: минимум настраиваемых параметров — максимум наглядности. Есть еще много «фишек и фич», которые я и хотел бы описать, да совесть не позволит тратить ваше время на них в одной статье.

Ложка дегтя

Не идеален и мой редактор и мой контроллер. Конечно, хочется, чтобы не было никакой ложки дегтя, но мир не идеален. Я обнаружил две главные особенности, которые пока не смог устранить.

Но это не сильно мешает работе. Во-первых, иногда проявляются глюки при групповом перемещении элементов. Скорее "фича", чем "баг".

Жить это не мешает, но страницу редактора надо обновить. И, во-вторых, при некоторых условиях после загрузки схемы в устройство кнопочкой «Upload», оно перезагружается.

Заключение

Вот так случайные мысли, идеи и споры иногда порождают вполне себе жизнеспособные разработки. Надеюсь, что вам понравилась идея рисовать алгоритмы, вместо того, чтобы писать программы.

Поэтому я на сегодня закончу.
Позволю лишь сказать, что до отпуска остались считанные недели и я вполне готов перейти от отладки контроллера за столом к отладке его «в поле».
Если кого заинтересовали мои идеи или подробности разработки — пишите на мыло: shiotiny@yandex.ru Но, по-моему, объем статьи перерос все разумные пределы.

Всегда рад буду замечаниям и критике, если она, конечно, по делу.

Жду ваших отзывов, замечаний и предложений.

Ссылки, отсылки и посылки

ESP8266
WiFi
MQTT
UDP Multicast

Теги
Показать больше

Похожие статьи

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

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

Кнопка «Наверх»
Закрыть