
Основни тези или за какво става дума в тази статия
Продължаваме цикъл от статии за ShIoTiny — визуално програмируем контролер на база чипа ESP8266.
В тази статия се описва на примера на проект за управление на вентилацията в баня или друго помещение с повишена влажност как се изгражда програма за ShIoTiny.
Предишни статии от серията.
Връзки
Въведение
Няма разбирателство извън опит. Това е истина, проверена от времето и поколенията. Затова няма нищо по-добро за обучение на практически умения от опитите да направиш нещо сам. И примерите, които показват какво може да се направи и какво не трябва да се опитва, ще бъдат много полезни. Чуждият опит, разбира се, не може да предотврати собствените грешки, но може да помогне за намаляване на последните.
Въпросите и писмата на читателите на предишните статии ме накараха да направя малък проект-пример за управление на вентилацията, за да покажа как работят модулите 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 — измереното от сензора ниво на влажност, а Б — праговото ниво на същата влажност.
В миг, когато измереното ниво на влажност (A) превиши праговото ниво на влажност (Б), веднага на изхода на компаратора A>B ще се появи 1 и реле ще се включи. И обратно, веднага щом нивото на влажност се върне в нормата (т.е. A<=B), веднага на изхода на компаратора A>B ще се появи 0 и реле ще се изключи.
Всичко ясно? На когото не му е много — прочетете отново или погледнете описанието на работа на възлите в инструкциите.
Забелязвам, че данните от сензора DHT11 се обновяват приблизително веднъж на 10 секунди. Следователно, реле не може да се включва и изключва по-често от веднъж на 10 секунди.
Всичко би било наред, но бихме искали да зададем праговото ниво на влажност с помощта на променливо резистор. Няма нищо по-лесно!

Просто заменяме възела-константа с възел АЦП. В крайна сметка именно към АЦП свързахме делителя на напрежението с променлив резистор.
Напрежението на входа на АЦП варира от 0 до 1 В. А влажността на изхода на сензора варира от 0 до 100%. Как сравняваме двете? Всичко е просто. АЦП модулът в ShIoTiny не само измерва напрежението на входа, но също така може да го масштабира и да го измести.
Тоест изходът на ADC1 (АЦП) ще бъде стойност X, изчислена по формулата

, където
— напрежение на входа на АДЦ (от 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 от 1 на друго значение.
И така, имаме две условия за включване на вентилатора: превишаване на зададеното ниво на влажност и еднократно натискане на бутона. При изпълнение на едно от условията вентилаторът ще се включи. И ще работи, докато бутонът не бъде натиснат повторно. И нивото на влажност не се нормализира.
Можем, разбира се, да усложним алгоритъма, но няма да го правим — ще оставим пространство за творчество на желаещите.
Трети вариант, свързваме се с интернет.
Всичко, което описахме — е напълно работещо. А какво ще кажете за статуса? Нали всеки юноша-хипстер-хакист ще се подиграе на онзи, който завърта ръчка и натиска бутон, вместо да управлява от смартфон! Завъртането на ръчката е 'не модерно'. Но, да плъзгаш пръст по смартфона, изтърквайки го до кръв — това е пикът на желанията на хипстера-хакера (никога не можех да ги различа — затова, ако греша, извинете).
Но да бъдем снизходителни към споменатите личности. Управлението чрез интернет има и реални предимства. На първо място, визуализация. Има множество приложения за всички платформи, които позволяват с няколко кликвания да създадете напълно пригодна за употреба контролна панел за нашия контролер-карлсон. На второ място, възможността дистанционно да наблюдавате състоянието на влажността в помещението. И на трето място, можете да видите не само какво прави вентилаторът — върти ли се или не, но и какъв е зададеният праг на влажността. И дали вентилаторът е включен автоматично или ръчно. В общи линии, всичко, което пожелаете.
Разбира се, за някой вентилатор, това е много чест — толкова внимание. Но това е само пример.
И така, за свързване към интернет ще използваме технологията MQTT и съответстващия протокол.
За да се възползваме от тази технология, ни е необходим MQTT-брокер.Това е специален сървър, който обслужва MQTT-клиенти., например ShIoTIny и вашия смартфон.
Същността на технологията MQTT се състои в това, че всеки от клиентите публикува на MQTT-брокера (сървъра) произволни данни под определено име (наречено тема в терминологията. MQTT). Други клиенти могат да се абонират за произволни данни по името си (тема) и да получават отново публикувани данни. Тоест, обменът на данни протича по принципа клиент-брокер-клиент.
Аз няма да се спирам на подробностите. В интернет има множество статии и обяснения относно това как работи MQTT и какви програми съществуват за създаване на контролни панели. Просто ще покажа как да приемаме и публикуваме данни посредством ShIoTiny.
Като брокер използвах , но принципът е един и същ навсякъде.
Така че, да приемем, че сте се регистрирали на MQTT-брокера. В общия случай, брокерът ще ви предостави (или изисква да измислите) потребителско име и парола (за авторизация), както и порт за свързване. Може да се свържете ShIoTiny к към MQTT-брокера по два начина — стандартно свързване и по TLS (SSL).
Всички тези параметри в ShIoTiny се въвеждат на таба Нетворкинг, раздел MQTT Connection to server.

Ако вашият MQTT-брокер. не изисква авторизация — не въвеждайте потребителско име и парола (оставете тези полета празни).
Параметър Префикс на MQTT темата изисква отделно пояснение.
Префикс на MQTT параметрите — това е низ, добавен към името на темата (тема) при публикуване и абониране на MQTT-брокера. За да зададете MQTT-префикс за вашия контролер, просто трябва да го въведете в полето за въвеждане „Префикс на MQTT темата» («Префикс на MQTT темата“). Префиксът винаги започва със слеш («/»)! Ако не въведете слеш в полето за въвеждане — той ще бъде добавен автоматично. В префикса не може да се използват символи «#» и «+». Други ограничения няма.
Например, ако публикувате параметър „status“ (или се абонирате за него), а вашият префикс е зададен като „/shiotiny/“, тогава на broker-а този параметър ще бъде публикуван с името „/shiotiny/status“. Ако имате зададен празен префикс, всички параметри на broker-а ще започват със слеш («/»): «status“ ще бъде публикуван като „/status».
Така че, да приемем, че сте се регистрирали на MQTT-брокера и сте получили потребителско име, парола и порт. След това сте въвели тези параметри на таба Нетворкинг, раздел MQTT Connection to server на контролера ShIoTiny.
Да приемем, че префиксът е зададен на „/room/».
Нека започнем с публикацията на състоянието на всички ключови параметри: реле Realay1, състоянието на ръчно включване, състоянието на автоматично включване и накрая праговите и текущите нива на влажност. И като бонус — температурата в помещението. Как да го направите, вижте на изображението.

Както виждаме, разликата от предишния вариант е само в узлите „MQTT Publish“. С оглед на префикса, се публикуват следните параметри:

Както виждаме, цялото състояние на системата е пред нас!
Но искаме не само да виждаме, но и да управляваме. Какво да правим? Много просто. Ще се откажем от задаване на прагово ниво на влажност с помощта на ADC и променлив резистор и ще задаваме именно това прагово ниво на влажност от MQTT наше смартфон!

Премахваме ADC модула от схемата и включваме три нови модула: FLASH архивиране, FLASH възстановяване и MQTT описание.
Функцията на модула MQTT описание е очевидна: той получава параметър /room/trigHset (прагово ниво на влажност) от MQTT брокера. Но какво прави с данните след това? Просто ги предава на модула FLASH архивиране, който от своя страна запазва тези данни в енергийно независима памет с име trigH. След това модулът FLASH възстановяване извлича от енергийно независимата памет данните под име trigH и какво се случва след това, вече знаем.
Защо толкова много сложност? Защо не можем веднага да предадем получените данни на входа на компаратора?
Както казваше господин Ш. Холмс — това е елементарно! Никой не гарантира, че след включване на вашето устройство, то ще се свърже с към MQTT-брокера. А влажността трябва да се измерва. И вентилаторът трябва да се включи. Но без информация за праговото ниво на влажност, това е невъзможно! Ето защо, нашето устройство при включване извлича преди запомненото прагово ниво на влажност от енергийно независимата памет и го използва за вземане на решения. А когато се установи свързаност с MQTT брокера и някой публикува нова стойност /room/trigHset, тогава ще се използва новата стойност.
След това можете да измислите каквото пожелаете. Например, освен влажността, да въведете и измерване на температурата. Или да добавите "умно" управление на осветлението (все още имаме две реле и два входа на разположение). Всичко е в ръцете ви!
Заключение
Така разгледахме няколко примера за реализиране на един от основните контролери, базиран на ShIoTiny. Може би това ще бъде полезно за някого.
Както винаги, предложения, желания, въпроси, грешки и др. — на имейл: shiotiny@yandex.ru
Източник: habr.com
