
Belangrijke punten of waar dit artikel over gaat
We gaan verder met de serie artikelen over ShIoTiny — de visueel programmeerbare controller op basis van een chip ESP8266.
In dit artikel wordt aan de hand van een project voor het regelen van de ventilatie in een badkamer of een andere ruimte met verhoogde luchtvochtigheid uitgelegd hoe het programma wordt opgebouwd voor ShIoTiny.
De vorige artikelen in de serie.
Links
Inleiding
Begrip komt niet buiten ervaring. Dit is een waarheid die door de tijd en generaties is bewezen. Daarom is er niets beter voor het aanleren van praktische vaardigheden dan zelf iets proberen te doen. En voorbeelden die laten zien wat mogelijk is en wat niet, zullen zeker van pas komen. De fouten van anderen kunnen natuurlijk niet voorkomen dat je zelf fouten maakt, maar ze kunnen helpen om het aantal fouten te verminderen.
Vragen en brieven van lezers van eerdere artikelen hebben me aangespoord om een klein voorbeeldproject voor de ventilatiebeheersing te maken, om te laten zien hoe de ShIoTiny-modules werken.
Het oorspronkelijke idee, waarop de controller is gebaseerd ShIoTiny — de pomp- en irrigatiestation — is niet voor iedereen geschikt en interessant. Daarom heb ik een voor iedereen begrijpelijk en door velen nuttig ventilatiesysteem als voorbeeld genomen.
Ik moet zeggen dat het idee van het project niet van mij is, maar en vervolgens aangepast aan ShIoTiny.
Eerst moet je begrijpen wat je wilt
Het proces van verbetering is eindeloos. En precies deze eigenschap heeft vele goede ideeën en projecten de das omgedaan. De ontwikkelaar bleef bezig met het perfectioneren van de oplossing, in plaats van een misschien niet perfecte, maar werkende versie vrij te geven. En hij perfectioneerde het totdat concurrenten hem voorbijstaken met oplossingen die misschien niet perfect (en vaak ronduit slecht) waren, maar wel werkten.
Daarom is het heel belangrijk om te weten waar je de punt in het project zet. Of met andere woorden, je moet bepalen wat we aan het einde van het project willen bereiken, op basis van wat we in het begin hebben. In het Russisch bestaat er een prachtig kort en bondig woord ‘plan’ voor een document dat precies wordt opgesteld om de weg naar creatie te beschrijven, een woord dat achterlijke vertalers en gebrekkige managers de laatste tijd om de een of andere reden zijn gaan noemen ‘routekaart’. Maar goed, laat ze maar.
Ons plan zal als volgt zijn. Laten we aannemen dat er een ruimte is waar de luchtvochtigheid soms sterk kan toenemen. Bijvoorbeeld een badkamer of keuken. Vochtigheid is een ongewenste factor en de oplossing om ermee om te gaan is zolang als de wereld oud: de ruimte ventileren. Er zijn behoorlijk wat manieren om te ventileren. Maar we zullen ons beperken tot de gebruikelijke ventilator in plaats van exotische en ouderwetse methoden zoals slaven met waaier. Ventilatoren zijn goedkoper en bovendien gemakkelijker in onze omgeving te vinden.
Kortom, we willen de ventilator bedienen: deze in- en uitschakelen. Juist, we willen dat deze automatisch aan- en uitgaat wanneer dat nodig is.
We moeten nog bepalen: onder welke omstandigheden de ventilator moet inschakelen en onder welke omstandigheden - uitschakelen.
Dit is vrij duidelijk: als de luchtvochtigheid boven een bepaalde drempel ligt - schakelt de ventilator in en trekt lucht naar buiten; als de luchtvochtigheid weer normaal is - schakelt de ventilator uit.
De oplettende lezer zal onmiddellijk de aandacht vestigen op het woord "bepaalde". Door wie bepaald? Hoe bepaald?
De drempelwaarde voor de luchtvochtigheid kan op verschillende manieren worden ingesteld. We zullen twee daarvan bekijken: de eerste - via een variabele weerstand en de tweede - via het netwerk met behulp van het MQTT-protocol. Elk van deze methoden heeft zijn voor- en nadelen, die we later zullen bespreken.
Voor degenen die het niet begrepen hebben, laat ik het uitleggen: "drempelvochtigheid" is het niveau van vochtigheid, boven welk er behoefte is aan het inschakelen van de ventilator.
De volgende vraag is: moet de gebruiker het recht krijgen om de ventilator rechtstreeks in te schakelen? Dus ongeacht het vochtigheidsniveau, met een druk op de knop? We zullen zo'n mogelijkheid voorzien. De ventilator kan immers nodig zijn, niet alleen bij verhoogde vochtigheid, maar ook om bijvoorbeeld een onaangename geur, die in de volksmond "stank" wordt genoemd, uit de ruimte te verwijderen.
Dus, we begrijpen wat we willen en hebben zelfs een beetje idee hoe het zal werken. Laten we kort de functies van ons ventilatiesysteem samenvatten:
- instellen van de drempelwaarde voor de luchtvochtigheid (twee opties);
- meten van het vochtigheidsniveau;
- automatisch inschakelen van de ventilator;
- automatisch uitschakelen van de ventilator;
- handmatig inschakelen van de ventilator (met een druk op de knop).
Dus, het plan is duidelijk. We moeten alle boven genoemde functies in ons programma implementeren. Op basis van dit 'plan' zullen we handelen. Laten we beginnen met het tekenen van een structuurdiagram.
Structuurdiagram
Over het algemeen hebben we twee van zulke diagrammen. De eerste is voor de optie waarin het drempelniveau van de luchtvochtigheid door een variabele weerstand wordt ingesteld. Het tweede diagram is voor de optie waarin het drempelniveau van de luchtvochtigheid via het netwerk door het MQTT-protocol wordt ingesteld.
Maar omdat deze schema's slechts in één element verschillen — de variabele weerstand voor het 'instellen van het drempelniveau van de luchtvochtigheid' — zullen we slechts één structuurdiagram tekenen. Uiteraard ziet een structuurdiagram volgens de GOST er anders uit. Maar we richten ons niet op doorgewinterde ingenieurs, maar op de jonge generatie. Daarom is duidelijkheid belangrijker.

Dus, wat zien we op de afbeelding? De ventilator is verbonden met het relais Relay1 van de controller. ShIoTinyIk wil erop wijzen dat de ventilator een apparaat is dat werkt onder hoge spanning. Dus, als iemand zo'n systeem zelf gaat maken — wees voorzichtig. Dat wil zeggen, zorg er in ieder geval voor dat je de spanning van de ventilator uitschakelt voordat je je vingers of meetinstrumenten in het schema steekt. En een tweede opmerking. Als je ventilator krachtiger is dan 250W, dan is het niet verstandig om deze direct aan te sluiten op ShIoTiny — alleen via een starter.
We hebben de ventilator nu behandeld. Nu de knop voor 'handmatige inschakeling' van de ventilator. Deze is verbonden met de ingang Input1. Hier hoef je eigenlijk verder niet meer over uit te leggen.
De temperatuur- en luchtvochtigheidssensor DHT-11 (of DHT-22 of hun tegenhangers). Voor de aansluiting is er een speciale ingang op de controller ShIoTiny. Zoals te zien is op de afbeelding, is de aansluiting van zo'n sensor ook geen probleem.
En ten slotte de variabele weerstand die het drempelniveau van de luchtvochtigheid bepaalt. Juist — een spanningsdeler, bestaande uit een variabele en een constante weerstand. Er zijn geen problemen met de aansluiting, maar ik wil uitleggen dat de ingebouwde ADC op ESP8266 maximaal is ontworpen voor 1 Volt. Daarom is een spanningsdeler die ongeveer 5 keer bedraagt nodig.
En nogmaals, dit spanningsdeler is niet nodig als het drempelniveau van de luchtvochtigheid via het netwerk door het MQTT-protocol wordt ingesteld.
Laten we beginnen met het opstellen van het werkalgoritme van het apparaat in de ElDraw ShIoTiny editor. Hoe je bij deze editor komt, kun je lezen in eerdere artikelen of in de handleiding, waarvan de link aan het begin van het artikel staat.
Optie één, de eenvoudigste
Laten we beginnen met het eenvoudige: het inschakelen van het relais Relay1 bij overschrijding van de drempelwaarde voor vochtigheid gedurende een bepaalde tijd.

Zoals we zien, is er niets moeilijks: slechts vier knooppunten, zonder de commentaar-knooppunten mee te tellen. DHT11 — dat is eigenlijk de temperatuur- en vochtigheidssensor (je kunt het vervangen door DHT22).
Constante CONST — drempelwaarde voor vochtigheid, in procenten.
De comparator is een knooppunt dat twee getallen vergelijkt en 1 op de uitgang geeft als aan de opgegeven voorwaarde wordt voldaan en 0 als de voorwaarde niet wordt voldaan.
In ons geval is die voorwaarde A>B, waar A — het door de sensor gemeten vochtigheidsniveau, en B — de drempelwaarde van dezelfde vochtigheid.
Zodra het gemeten vochtigheidsniveau (A) de drempelwaarde voor vochtigheid (B) overschrijdt, komt er direct een 1 op de uitgang van de comparator en wordt het relais ingeschakeld. En omgekeerd, zodra het vochtigheidsniveau weer normaal is (dat wil zeggen A>B A<=B verschijnt er 0 en wordt het relais uitgeschakeld.) overschrijdt, komt er direct een 1 op de uitgang van de comparator en wordt het relais ingeschakeld. En omgekeerd, zodra het vochtigheidsniveau weer normaal is (dat wil zeggen A>B Is alles duidelijk? Voor degenen die het niet helemaal begrijpen — lees het nog eens of kijk in de beschrijving van de knooppunten in de handleiding.
Ik merk op dat de gegevens van de sensor
ongeveer elke 10 seconden worden bijgewerkt. Daarom kan het relais niet vaker aan en uit worden schakelt dan eens per 10 seconden. DHT11 Dat zou allemaal goed zijn, maar we zouden graag de drempelwaarde voor vochtigheid willen instellen met een potentiometer. Dat is heel eenvoudig!
We vervangen gewoon de constante-knoop door een ADC-knoop. Dit is immers waar we de spanningsdeler met de potentiometer op hebben aangesloten.

De spanning op de ingang van de ADC varieert van 0 tot 1 Volt. Maar de vochtigheid op de uitgang van de sensor varieert van 0 tot 100%. Hoe vergelijken we deze? Heel eenvoudig. De ADC-knoop in
meet niet alleen de spanning op de ingang, maar kan deze ook ShIoTiny schalen en verschuiven Dat wil zeggen, de uitgang van de ADC1 (ADC) knoop zal de waarde hebben.
, berekend met de formule X— de spanning op de ingang van de ADC (van 0 tot 1V);

, waar
— het bereik (ADC range) en k -de verschuiving (ADC offset). Dus als we bk=100 b=0 en , dan zal, bij wijziging vanhet bereik van 0 tot 1, de waarde
op de uitgang van de ADC-knoop variëren van 0 tot 100. Dat wil zeggen, numeriek gelijk aan het bereik van de vochtigheid van 0 tot 100%. X De uitgang van de ADC-knoop zal variëren van 0 tot 100. Dit betekent dat het numeriek gelijk is aan het wijzigingenbereik van de luchtvochtigheid van 0 tot 100%.
Of eenvoudig gezegd, door de regelbare weerstandsmotor te draaien, kun je het drempelniveau van de vochtigheid instellen van 0 tot 100. Het enige ongemak is dat er geen weergaveapparaten zijn. Maar in de praktijk, als je zes onderverdelingen maakt op de weerstandsmotor (0%, 20%, 40%, 60%, 80%, 100%) — dan is dat voldoende om het drempelniveau van de vochtigheid in te stellen.
Hoe stellen we de coefficients in k -de verschuiving (ADC offset). Dus als we b-offset (ADC offset)? Dat is eenvoudig als wat dan ook! Klik met de muis op de knoop ADC1 en er verschijnt meteen een instellingenvenster. Hierin kun je alles instellen wat je nodig hebt. Voor ons geval zal dit venster eruitzien zoals op de afbeelding.

Dus we hebben de eenvoudigste werkende oplossing. Laten we deze verbeteren.
Overigens heeft de eenvoudigste oplossing één voordeel — het heeft geen internet nodig. Het is volledig autonoom.
Tweede optie, we koppelen een knop aan
Alles werkt en iedereen is blij. Maar er is een probleem, we kunnen de ventilatie niet handmatig inschakelen. We hebben al afgesproken dat Input1 we een knop aansluiten die de ventilator handmatig in- en uitschakelt, ongeacht de vochtigheidssensor.
Het is tijd om deze knop in onze schakeling-programma te verwerken.

Het blok voor het verwerken van de knopdruk is gemarkeerd met een oranje lijn. Het is een drukknop teller die op nul wordt gereset wanneer de waarde op zijn uitgang hoger is dan één (groene lijn, uitgang van de knoop CT).
Hier werkt alles net zo eenvoudig als voorheen: de teller CT telt de drukken van de knop die op de ingang is aangesloten. Input1Dat wil zeggen, de waarde op de uitgang van deze teller neemt met elk druk op de knop met 1 toe.
Zodra deze waarde gelijk wordt aan twee (dat wil zeggen, meer dan 1), verschijnt er onmiddellijk 1 op de uitgang van de comparator. A>B En deze 1 zet de teller CT terug naar nul. Hiermee wordt de comparator bedoeld, de onderste in het schema!
Dus onze knop heeft twee toestanden — 0 en 1. Als we meer toestanden nodig hadden (3 of 4 of nog meer) — dan zouden we voldoende hebben gehad om de constante CONST van één naar een andere waarde te wijzigen.
Dus we hebben twee voorwaarden voor het inschakelen van de ventilator: het overschrijden van het ingestelde vochtigheidsniveau en een enkele druk op de knop. Bij het voldoen aan een van de voorwaarden zal de ventilator inschakelen. En hij blijft werken totdat de knop opnieuw wordt ingedrukt En of het vochtigheidsniveau weer normaal is.
Natuurlijk kunnen we het algoritme nog verder compliceren, maar dat gaan we niet doen — we laten ruimte voor creativiteit voor degenen die dat willen.
Optie drie, we maken verbinding met het internet
Alles wat we hebben beschreven — is volledig functioneel. Maar wat met de status? Elke onzekere hipster-hacker-cracker zal iemand belachen die aan de knop draait en op de knop drukt in plaats van met zijn smartphone te bedienen! Aan de knop draaien is 'niet cool'. Maar met je vinger over de smartphone vegen, totdat die bloedig is — dat is de piek van de verlangens van de hipster-hacker-cracker (ik kon ze nooit onderscheiden — dus als ik het fout heb, verontschuldig me).
Maar laten we mild zijn tegenover deze personen. Internetbeheer heeft echte voordelen. Ten eerste is er duidelijkheid. Er zijn talloze applicaties voor alle platforms waarmee je met een paar tikken een volledig bruikbare controlepaneel voor onze controller-karlson kunt maken. Ten tweede is er de mogelijkheid om op afstand de luchtvochtigheid in de ruimte te observeren. Ten derde kun je niet alleen zien of de ventilator draait of niet, maar ook wat de ingestelde drempelwaarde voor luchtvochtigheid is. En of de ventilator automatisch of handmatig is ingeschakeld. Kortom, alles wat je maar wilt.
Natuurlijk, voor een bepaalde ventilator is het veel eer om zoveel aandacht te krijgen. Maar dit is slechts een voorbeeld.
Dus, voor de verbinding met het internet gaan we de technologie gebruiken MQTT en het gelijknamige protocol.
Om deze technologie te gebruiken, hebben we nodig een MQTT-broker. Dit is een speciale server die bedient MQTT-clients, bijvoorbeeld ShIoTIny en je smartphone.
De essentie van de technologie MQTT is dat elke client willekeurige gegevens op de MQTT-broker (server) publiceert onder een specifieke naam (die wordt genoemd topic in de terminologie MQTT). Andere clients kunnen zich abonneren op willekeurige gegevens op hun naam (topic) en de nieuw gepubliceerde gegevens ontvangen. Dit betekent dat alle gegevensuitwisseling plaatsvindt volgens het principe client-broker-client.
Ik Ik zal niet diep ingaan op de details. Op internet zijn er talloze artikelen en tutorials over hoe het werkt MQTT en welke programma's er zijn om controlepanelen te maken. Ik laat je gewoon zien hoe we gegevens kunnen ontvangen en publiceren via ShIoTiny.
Als broker heb ik gebruikt , maar het principe is overal hetzelfde.
Dus laten we aannemen dat je je hebt geregistreerd bij MQTT-brokerIn het algemeen geeft de broker u (of vraagt u om) een gebruikersnaam en wachtwoord (voor authenticatie), evenals de poort voor de verbinding. Verbind ShIoTiny aan met de MQTT-broker op twee manieren — een gewone verbinding en via TLS (SSL).
Al deze parameters worden ShIoTiny ingevoerd op het tabblad Netwerken, sectie MQTT-verbinding met de server.

Als uw een MQTT-broker geen authenticatie vereist — voer dan geen gebruikersnaam en wachtwoord in (laat deze velden leeg).
Parameter MQTT-topicprefix vergt verdere uitleg.
Het MQTT-parameterprefix is een tekenreeks die wordt toegevoegd aan de onderwerpnaam (topic) bij het publiceren en abonneren op de MQTT-broker. Om het MQTT-prefix voor uw controller in te stellen, moet u het gewoon invoeren in het invoerveld 'MQTT-onderwerpprefix» («MQTT-topicprefix'). Het prefix begint altijd met een schuine streep («/»)! Als u geen schuine streep in het invoerveld invoert, wordt deze automatisch toegevoegd. In het prefix kunnen geen symbolen «#» en «+». Voor de rest zijn er geen beperkingen.
Bijvoorbeeld, als u de parameter 'status' publiceert (of zich erop abonneert), en uw prefix is ingesteld als '/shiotiny/', dan wordt deze parameter op de broker gepubliceerd onder de naam '/shiotiny/status'. Als u een leeg prefix hebt ingesteld, beginnen alle parameters op de broker met een schuine streep («/»): «status' wordt gepubliceerd als '/status».
Laten we aannemen dat u zich heeft geregistreerd op MQTT-broker en een gebruikersnaam, wachtwoord en poort heeft ontvangen. Vervolgens heeft u deze parameters ingevoerd op het tabblad Netwerken, sectie MQTT-verbinding met de server van de controller. ShIoTiny.
Laten we aannemen dat de prefix is ingesteld op '/room/».
Laten we beginnen met het publiceren van de status van alle belangrijke parameters: relais Relay1, handmatige inschakeling, automatische inschakeling en, tenslotte, de drempel- en actuele vochtigheidsniveaus. En als bonus — de temperatuur in de kamer. Hoe dat te doen, zie afbeelding.

Zoals we zien, is het verschil met de vorige versie — alleen de knooppunten 'MQTT Publiceren'. Met inachtneming van het prefix worden de volgende parameters gepubliceerd:

Zoals we zien, hebben we de volledige status van het systeem in het zicht!
Maar we willen niet alleen zien, maar ook beheren. Hoe doen we dat? Heel eenvoudig. We geven de instelling van het drempelniveau voor vochtigheid op met behulp van de ADC en de variabele weerstand en stellen dat drempelniveau direct in via MQTT onze smartphone!

We verwijderen de ADC-knoop uit het schema en voegen daar drie nieuwe knopen aan toe: FLASH opslaan, FLASH herstellen en MQTT beschrijven.
De functie van de knoop MQTT beschrijven is duidelijk: deze ontvangt de parameter /room/trigHset (drempelniveau voor vochtigheid) van de MQTT-broker.Maar wat doet hij vervolgens met de gegevens? Simpelweg doorgeven aan de knoop FLASH opslaan, dat op zijn beurt deze gegevens opslaat in niet-vluchtig geheugen onder de naam trigH. Daarna leest de node FLASH herstellen de gegevens uit het niet-vluchtig geheugen onder de naam trigH en wat er daarna gebeurt weten we al.
Waarom zulke complicaties? Waarom kunnen we de ontvangen gegevens niet meteen aan de comparator geven?
Zoals kameraad S. Holmes zei — dat is elementair! Niemand garandeert dat uw apparaat na inschakeling zich zal verbinden met met de MQTT-broker. En we moeten de vochtigheid meten. En de ventilator moet aangezet worden. Maar zonder informatie over het drempelniveau van de vochtigheid is dit onmogelijk! Daarom haalt ons apparaat bij inschakeling het eerder opgeslagen drempelniveau van de vochtigheid uit het niet-vluchtig geheugen en gebruikt dit voor de besluitvorming. Pas wanneer de verbinding met de MQTT-broker tot stand komt en iemand een nieuwe waarde publiceert /room/trigHset, dan zal deze nieuwe waarde worden gebruikt.
Daarna kunt u alles bedenken wat u maar wilt. U kunt bijvoorbeeld naast de vochtigheid ook de temperatuur bijhouden. Of 'slimme' verlichting toevoegen (we hebben nog twee relais en twee ingangen ongebruikt). Alles ligt in uw handen!
Conclusie
We hebben nu verschillende voorbeelden van de basisimplementatie van een controller op basis van ShIoTiny besproken. Misschien is dit nuttig voor iemand.
Zoals altijd, opmerkingen, wensen, vragen, typefouten en meer — stuur ze naar: shiotiny@yandex.ru
Bron: habr.com
