
Principali tesi o di cosa tratta questo articolo
Continuiamo il ciclo di articoli su ShIoTiny — un controller visivamente programmabile basato su chip ESP8266.
In questo articolo, si parla del progetto di gestione della ventilazione in un bagno o in un'altra stanza con elevata umidità, mostrando come costruire un programma per ShIoTiny.
Articoli precedenti della serie.
Link
Introduzione
Non esiste comprensione al di fuori dell'esperienza. Questa è una verità collaudata dal tempo e dalle generazioni. Quindi, non c'è nulla di meglio per imparare abilità pratiche che cercare di fare qualcosa da soli. E esempi che mostrano cosa si può fare e cosa è meglio evitare saranno estremamente utili. Gli errori altrui, ovviamente, non possono prevenire i propri errori, ma possono aiutare a ridurre il numero di questi ultimi.
Le domande e le lettere dei lettori degli articoli precedenti mi hanno spinto a realizzare un piccolo progetto esemplificativo per gestire la ventilazione, per dimostrare come funzionano i moduli ShIoTiny.
L'idea originale su cui si basa il controller ShIoTiny — una stazione di pompaggio e irrigazione — non è adatta e interessante per tutti. Quindi ho preso un sistema di gestione della ventilazione, comprensibile a tutti e utile a molti, come esempio.
Dico che l'idea del progetto non è mia, ma e poi l'ho adattata a ShIoTiny.
Prima di tutto, capisci cosa vuoi
Il processo di perfezionamento è infinito. E questa caratteristica ha distrutto molte buone idee e progetti. Lo sviluppatore, invece di rilasciare qualcosa di funzionante anche se non perfetto, continuava a perfezionarla. E la perfezionava finché i concorrenti non lo superavano, rilasciando soluzioni magari non perfette (spesso addirittura scadenti), ma funzionanti.
Perciò è molto importante sapere dove mettere un punto nel progetto. In altre parole, dobbiamo definire cosa vogliamo ottenere alla fine del progetto da ciò che abbiamo all'inizio. Nella lingua russa, per un documento che viene redatto proprio con l'intento di descrivere il percorso di creazione di qualcosa, c'è una parola breve e concisa: 'piano', che traducono erroneamente come 'roadmap' traduttori poco abili e manager difettosi.
Il nostro piano sarà il seguente. Supponiamo che ci sia un ambiente in cui l'umidità può aumentare notevolmente. Ad esempio, come un bagno o una cucina. L'umidità è un problema sgradevole e il metodo per combatterla è antico quanto il mondo: areare l'ambiente. Ci sono diversi modi per farlo. Ma, probabilmente, rinunceremo a metodi esotici e antiquati come gli schiavetti con i ventagli e ci fermeremo su un normale ventilatore. I ventilatori sono più economici e più facili da trovare da noi.
In breve, vogliamo controllare il ventilatore: accenderlo e, di conseguenza, spegnerlo. Piuttosto, vogliamo che si accenda e si spenga da solo quando necessario.
Resta da determinare: in quali condizioni il ventilatore deve accendersi e in quali deve spegnersi.
Qui tutto è ovvio: se l'umidità è superiore a una certa soglia prefissata, il ventilatore si accende e aspira l'aria; l'umidità torna alla normalità, il ventilatore si spegne.
Un lettore attento si soffermerà subito sulla parola «prefissata». Da chi è stata stabilita? In che modo è stata stabilita?
La soglia di umidità può essere impostata in diversi modi. Esamineremo due di essi: il primo tramite un resistore variabile e il secondo tramite rete attraverso il protocollo MQTT. Ognuno di questi metodi ha vantaggi e svantaggi, che saranno analizzati in seguito.
Per coloro che non l'hanno compreso, spiegherò che la «soglia di umidità» è il livello di umidità oltre il quale è necessario accendere il ventilatore.
La prossima domanda è: fornire all'utente il diritto di accendere il ventilatore direttamente? Cioè, indipendentemente dal livello di umidità, premendo un pulsante? Prevederemo questa possibilità. Infatti, il ventilatore potrebbe essere necessario non solo in caso di umidità elevata, ma anche per rimuovere dall'ambiente, ad esempio, un cattivo odore, comunemente chiamato 'puzza'.
Quindi, abbiamo compreso cosa vogliamo e anche un po' come funzionerà. Elenchiamo brevemente tutte le funzioni del nostro sistema di controllo della ventilazione:
- impostazione della soglia di umidità (due opzioni);
- misurazione del livello di umidità;
- accensione automatica del ventilatore;
- spegnimento automatico del ventilatore;
- accensione manuale del ventilatore (premendo un pulsante).
Quindi, il piano è chiaro. È necessario implementare tutte le funzioni sopra elencate nel nostro programma. Agiremo in base a questo "piano". Iniziamo disegnando il diagramma strutturale del dispositivo.
Diagramma strutturale del dispositivo
In realtà, avremo due di questi schemi. Il primo è per l'opzione in cui il livello di umidità viene impostato tramite una resistenza variabile. Il secondo schema è per l'opzione in cui il livello di umidità è impostato tramite rete utilizzando il protocollo MQTT.
Ma poiché questi schemi differiranno solo per un elemento - il "resistore variabile per la regolazione del livello di umidità" - disegneremo solo un diagramma strutturale. Certamente, il diagramma strutturale secondo GOST appare diverso. Ma ci rivolgiamo non agli ingegneri esperti, ma alle nuove generazioni. Pertanto, la chiarezza è più importante.

Quindi, cosa vediamo nell'immagine? Il ventilatore è collegato al relè Relay1 del controller. ShIoTinyFaccio notare che il ventilatore è un dispositivo che opera ad alta tensione. Quindi, se qualcuno deciderà di costruirne uno da solo, prestate attenzione. In altre parole, prima di inserire le dita o strumenti di misura nello schema, disattivate almeno il ventilatore. E un'altra osservazione. Se il vostro ventilatore ha una potenza superiore a 250W, non collegatelo direttamente a ShIoTiny — solo tramite un avviatore.
Abbiamo capito il funzionamento del ventilatore. Ora il pulsante "accensione manuale" del ventilatore. È collegato all'ingresso Input1. Qui non c'è nulla da spiegare ulteriormente.
Sensore di temperatura e umidità DHT-11 (o DHT-22 o i loro analoghi). Per il suo collegamento è previsto un ingresso speciale sul controller. ShIoTinyCome si può vedere dall'immagine, collegare tale sensore non presenta problemi.
Infine, una resistenza variabile per impostare il livello di umidità. Più precisamente, un partitore composto da resistenze variabile e fissa. Non ci sono problemi di collegamento, ma spiego che l'AD convertitore integrato nel ESP8266 è progettato per un massimo di 1 Volt. Ecco perché è necessario un partitore di tensione che riduca di circa 5 volte.
E ricordo ancora una volta che questo partitore non è necessario se il livello di umidità è impostato tramite rete utilizzando il protocollo MQTT.
Iniziamo a creare l'algoritmo di funzionamento del dispositivo nell'editor ElDraw ShIoTiny. Puoi leggere come accedere a questo editor negli articoli precedenti o nel manuale, il cui link si trova all'inizio dell'articolo.
Primo esempio, il più semplice
Iniziamo con una semplice attivazione del relè Relay1 al superamento della soglia di umidità per un tempo prestabilito.

Come vediamo, nulla di complicato: ci sono solo quattro nodi, senza contare i nodi di commento. DHT11 è propriamente il sensore di temperatura e umidità (può essere sostituito con DHT22).
Costante CONST è la soglia di umidità, in percentuale.
Il comparatore è un nodo che confronta due numeri e genera un'uscita di 1 se la condizione è soddisfatta e 0 se non lo è.
Nel nostro caso, tale condizione sarà A>B, dove A il livello di umidità misurato dal sensore, e B la soglia di umidità.
Non appena il livello di umidità misurato (A) supera la soglia di umidità (B), l'uscita del comparatore A>B diventerà 1 e il relè si attiverà. Al contrario, non appena il livello di umidità torna alla normalità (cioè A<=B), l'uscita del comparatore A>B uscirà 0 e il relè si disattiverà.
Tutto chiaro? Se non lo è — leggilo di nuovo o fai riferimento alla descrizione del funzionamento dei nodi nel manuale.
Nota che i dati dal sensore DHT11 vengono aggiornati circa ogni 10 secondi. Quindi il relè non potrà attivarsi e disattivarsi più di una volta ogni 10 secondi.
Niente di problematico, ma vorremmo impostare la soglia di umidità usando un resistore variabile. Nulla di più semplice!

Sostituiamo semplicemente il nodo costante con un nodo ADC. Infatti, è proprio al ADC che abbiamo collegato il divisore di tensione con il resistore variabile.
La tensione in ingresso all'ADC varia da 0 a 1 Volt. Mentre l'umidità in uscita dal sensore varia da 0 a 100%. Come facciamo a confrontarli? È semplice. Il nodo ADC1 (ADC) non solo misura la tensione in ingresso, ma può anche ShIoTiny scalare e spostare In altre parole, l'uscita del nodo ADC1 avrà un valore.
, calcolato secondo la formula X— tensione in ingresso all'ADC (da 0 a 1V);

, dove
— intervallo (range ADC) e k — offset (offset ADC). Quindi, se impostiamo bk=100 b=0 e , al variare dinell'intervallo da 0 a 1, il valore
all'uscita del nodo ADC varierà nell'intervallo da 0 a 100. Vale a dire, numericamente uguale all'intervallo di variazione dell'umidità dal 0 al 100%. X L'uscita del nodo ADC varierà da 0 a 100. In altre parole, corrisponde all'intervallo di variazione dell'umidità dal 0 al 100%.
In altre parole, ruotando il motore di resistenza variabile, puoi impostare il livello soglia di umidità da 0 a 100. L'unico inconveniente è che non ci sono dispositivi di visualizzazione. Ma in pratica, se al motore di resistenza variabile fai 6 suddivisioni 0%, 20%, 40%, 60%, 80%, 100%) — questo è sufficiente per impostare il livello soglia di umidità.
Come impostare i coefficienti k — offset (offset ADC). Quindi, se impostiamo b- offset ADC? È più facile che bere un bicchier d'acqua! Clicca con il cursore del mouse sul nodo ADC1 e si aprirà immediatamente una finestra di configurazione. Qui puoi impostare tutto ciò di cui hai bisogno. Per il nostro caso sarà una finestra come quella nell'immagine.

Quindi, abbiamo una soluzione lavorativa semplice. Iniziamo a migliorarla.
A proposito, la soluzione più semplice ha un vantaggio: non ha bisogno di internet. È completamente autonoma.
Seconda opzione, colleremo un pulsante
Tutto funziona e tutti sono contenti. Ma ecco il problema, non possiamo attivare la ventilazione forzata. Abbiamo già concordato che all'ingresso Input1 avremo un pulsante collegato, che accenderà e spegnerà il ventilatore forzatamente, senza prestare attenzione al sensore di umidità.
È giunto il momento di elaborare questo pulsante nel nostro schema-programma.

Il blocco di elaborazione della pressione del pulsante è evidenziato con una linea arancione. Si tratta di un contatore di pressioni del pulsante, che si azzera quando il valore alla sua uscita supera uno (linea verde, uscita del nodo CT).
Funziona tutto qui in modo semplice come prima: il contatore CT conta le pressioni del pulsante collegato all'ingresso Input1. Quindi il valore all'uscita di questo contatore aumenta di 1 con ogni pressione del pulsante.
Non appena questo valore diventa uguale a due (cioè maggiore di 1), immediatamente all'uscita del comparatore A>B apparirà 1. E questo 1 azzererà il contatore CT a zero. Si intende il comparatore, quello inferiore nello schema!
Così, il nostro pulsante ha due stati — 0 e 1. Se avessimo bisogno di più stati (3 o 4 o ancora di più) — ci basterebbe cambiare la costante CONST da uno a un altro valore.
Quindi, abbiamo due condizioni per accendere il ventilatore: superamento del livello di umidità impostato e pressione singola del pulsante. Al verificarsi di una qualsiasi delle condizioni, il ventilatore si accenderà. E funzionerà finché non verrà premuto nuovamente il pulsante E fino a quando il livello di umidità non si normalizza.
Certo, possiamo complicare ulteriormente l'algoritmo, ma non lo faremo: lasciamo spazio alla creatività di chi lo desidera.
Terza opzione, connettiamoci a Internet.
Tutto ciò che abbiamo descritto è perfettamente funzionante. E cosa dire della moda? Qualsiasi hipster hacker che si rispetti riderà di chi gira manopole e preme pulsanti invece di controllare il tutto dallo smartphone! Girare una manopola non è 'cool'. Ma far scorrere il dito sullo smartphone, riducendo il dito in carne viva, ecco il picco dei desideri di un hipster hacker (non sono mai riuscito a distinguerli tutti — quindi se sbaglio, perdonatemi).
Ma siatene indulgenti con le suddette persone. La gestione tramite Internet ha anche vantaggi reali. Primo, è pratico. Ci sono molte applicazioni per tutte le piattaforme che consentono, con un paio di clic, di creare un pannello di controllo per il nostro controller. Secondo, offre la possibilità di monitorare da remoto l'umidità nell'ambiente. E, terzo, si può vedere non solo se il ventilatore gira o meno, ma anche qual è il livello di umidità impostato. E se il ventilatore è stato attivato automaticamente o manualmente. Insomma, tutto ciò che desiderate.
Certamente, per un semplice ventilatore è davvero troppo onore ricevere così tanta attenzione. Ma è solo un esempio.
Quindi, per connetterci a Internet utilizzeremo la tecnologia MQTT e il relativo protocollo.
Per utilizzare questa tecnologia, abbiamo bisogno di un broker MQTT. Questo è un server speciale che gestisce client MQTT, ad esempio ShIoTIny e il tuo smartphone.
La sostanza della tecnologia MQTT sta nel fatto che ciascun cliente pubblica sul broker MQTT (server) dati a piacere sotto un determinato nome (denominato topic in terminologia MQTT). Altri clienti possono iscriversi ai dati sotto quel nome (topic) e ricevere i dati appena pubblicati. Quindi tutto lo scambio di dati avviene secondo il principio client-broker-client.
Io Non mi soffermerò sui dettagli. Ci sono moltissimi articoli e tutorial su come funziona MQTT e quali programmi esistono per creare pannelli di controllo. Mostrerò semplicemente come ricevere e pubblicare dati tramite ShIoTiny.
Come broker ho utilizzato , ma il principio è lo stesso ovunque.
Quindi, consideriamo che vi siate registrati su un broker MQTT.. In general, the broker will provide you with (or require you to create) a username and password (for authentication), as well as a port for connection. Connect ShIoTiny al to the MQTT broker in two ways — standard connection and TLS (SSL).
All these parameters are ShIoTiny entered on the tab Networking, section MQTT Connection to server.

If your un broker MQTT does not require authentication — do not enter a username and password (leave these fields blank).
Parametro MQTT topic prefix requires separate explanation.
The MQTT parameter prefix is a string added to the topic name (topic) when publishing and subscribing to the MQTT broker. To set the MQTT prefix for your controller, you just need to enter it in the field ‘MQTT Topic Prefix» («MQTT topic prefix’). The prefix always starts with a slash («/»)! If you do not enter a slash in the input field — it will be added automatically. The prefix cannot contain characters «#» e «+». There are no other restrictions.
For example, if you are publishing the parameter ‘stato’ (or subscribing to it), and your prefix is set as ‘/shiotiny/’, then on the broker this parameter will be published under the name ‘/shiotiny/status’. If you have an empty prefix, then all parameters on the broker will start with a slash («/»): «stato’ will be published as ‘/status».
So, let’s assume you registered with un broker MQTT. and received a username, password, and port. Then you entered these parameters on the tab Networking, section MQTT Connection to server del controller. ShIoTiny.
Let’s assume the prefix is set to ‘/room/».
Let’s start by publishing the state of all key parameters: relay Realay1, the state of manual activation, the state of automatic activation, and finally, the threshold and current humidity levels. And as a bonus — the temperature in the room. How to do this, see the diagram.

As we can see, the only difference from the previous option is the ‘MQTT Publish’ nodes. Considering the prefix, the following parameters are published:

As we can see, all system states are at our fingertips!
But we want not only to see but also to control. What to do? Very simple. We will abandon setting the threshold humidity level with the help of ADC and a variable resistor and will set this very threshold humidity level directly from MQTT the smartphone!

We remove the ADC node from the scheme and include three new nodes there: FLASH store, FLASH restore e MQTT describe.
The function of the node MQTT describe is obvious: it receives the parameter /room/trigHset (threshold humidity level) from the MQTT broker.But what does it do with the data next? It simply passes it to the node. FLASH store, che a sua volta memorizza questi dati nella memoria non volatile con il nome trigH. Dopo di che, il nodo FLASH restore legge dalla memoria non volatile i dati con il nome trigH e ciò che accade dopo già lo sappiamo.
Perché tutte queste complessità? Perché non restituire direttamente i dati ricevuti all'ingresso del comparatore?
Come diceva il compagno S. Holmes — è elementare! Nessuno garantisce che, dopo l'accensione del tuo dispositivo, esso si connetterà a to the MQTT broker. E bisogna misurare l'umidità. E bisogna accendere il ventilatore. Ma senza informazioni sul livello di soglia di umidità, questo è impossibile! Pertanto, il nostro dispositivo, all'accensione, estrae il livello di soglia di umidità precedentemente memorizzato dalla memoria non volatile e lo utilizza per prendere decisioni. E quando si stabilisce la connessione con il broker MQTT e qualcuno pubblica un nuovo valore /room/trigHset, allora verrà utilizzato questo nuovo valore.
Poi puoi inventare tutto ciò che vuoi. Ad esempio, oltre all'umidità, introdurre anche la misurazione della temperatura. O aggiungere un controllo “intelligente” dell'illuminazione (abbiamo ancora due relè e due ingressi non utilizzati). È tutto nelle tue mani!
Conclusione
Ecco, abbiamo esaminato alcuni esempi di realizzazione di un controller, che in sostanza è molto semplice, basato su ShIoTiny. Potrebbe essere utile a qualcuno.
Come sempre, suggerimenti, desideri, domande, errori di battitura e altro — scrivere a: shiotiny@yandex.ru
Fonte: habr.com
