
Punti principali o di cosa parla questo articolo
Continuiamo il ciclo di articoli su ShIoTiny — un controller programmabile visivamente basato su chip ESP8266.
In questo articolo si parla, utilizzando l'esempio di un progetto di gestione della ventilazione in un bagno o in un'altra stanza ad alta umidità, di come costruire un programma per ShIoTiny.
Articoli precedenti della serie.
Link
Introduzione
Non c'è comprensione senza esperienza. Questa è una verità comprovata dal tempo e dalle generazioni. Quindi, non c'è niente di meglio per imparare abilità pratiche che cercare di fare qualcosa da soli. E gli esempi che mostrano cosa si può fare e cosa non si dovrebbe provare saranno opportuni. Gli errori altrui, ovviamente, non possono prevenire l'emergere di errori propri, 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 sulla gestione della ventilazione, per dimostrare come funzionano i moduli ShIoTiny.
L'idea iniziale, da cui è nato il controller ShIoTiny — una stazione di pompaggio e irrigazione — non è adatta e interessante per tutti. Pertanto, ho scelto un sistema di gestione della ventilazione, comprensibile per tutti e utile per molti, come esempio.
Posso dire che l'idea del progetto non è mia, ma e poi l'ho adattata a ShIoTiny.
Inizia a capire cosa vuoi
Il processo di miglioramento è infinito. Ed è proprio questa caratteristica che ha rovinato molte buone idee e progetti. Il progettista, invece di rilasciare un prodotto funzionante anche se non perfetto, continuava a perfezionarlo. E lo perfezionava finché i concorrenti non lo superavano, rilasciando soluzioni magari non ideali (e spesso sinceramente brutte), ma funzionanti.
È quindi molto importante sapere dove mettere il punto in un progetto. In altre parole, è necessario definire cosa vogliamo ottenere alla fine del progetto partendo da ciò che abbiamo all'inizio. In italiano, il termine per un documento redatto proprio per descrivere il percorso di creazione di qualcosa è semplicemente "piano", una parola che di recente traduttori poco capaci e manager deficienti hanno inspiegabilmente cominciato a chiamare "roadmap". Ma lasciamo perdere.
Il nostro piano sarà il seguente. Supponiamo di avere una stanza in cui l'umidità può aumentare notevolmente. Ad esempio, come nel bagno o in cucina. L'umidità è una cosa sgradevole e il modo per combatterla è antico come il mondo: arieggiare l'ambiente. Ci sono molti modi per farlo. Ma, forse, rinunceremo ai metodi esotici e antiquati come i negri con le ventole e ci fermeremo su un semplice ventilatore. I ventilatori sono più economici e più facili da trovare dalle nostre parti.
In breve, vogliamo controllare il ventilatore: accenderlo e, di conseguenza, spegnerlo. Più precisamente, vogliamo che si accenda e si spenga da solo quando necessario.
Resta da definire: quali condizioni devono attivare e disattivare il ventilatore.
Qui è tutto chiaro: se l'umidità supera una certa soglia, il ventilatore si accende e aspira l'aria; quando l'umidità torna nella norma, il ventilatore si spegne.
Il lettore attento si soffermerà subito sulla parola «assegnata». Da chi è assegnata? Come è assegnata?
La soglia di umidità può essere impostata in diversi modi. Esamineremo due metodi: il primo — tramite un potenziometro, e il secondo — attraverso la rete utilizzando il protocollo MQTT. Ognuno di questi metodi ha vantaggi e svantaggi, che verranno discussi in seguito.
Per coloro che non lo hanno capito, chiarisco che «soglia di umidità» è il livello di umidità oltre il quale è necessario accendere il ventilatore.
La domanda successiva è: dobbiamo dare all'utente la possibilità di accendere il ventilatore direttamente? Cioè, indipendentemente dal livello di umidità, premendo un pulsante? Prevederemo questa possibilità. Infatti, il ventilatore può essere necessario non solo in caso di umidità elevata, ma anche per rimuovere dall'ambiente, ad esempio, un cattivo odore, noto comunemente come "puzza".
Quindi, abbiamo capito cosa vogliamo e anche un po' come funzionerà. Riassumiamo brevemente tutte le funzionalità del nostro sistema di gestione della ventilazione:
- impostazione del livello di umidità di soglia (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. Dobbiamo implementare tutte le funzioni sopra elencate nel nostro programma. In base a questo "piano" procederemo. Iniziamo disegnando lo schema strutturale del dispositivo.
Schema strutturale del dispositivo
In generale, avremo due schemi. Il primo è per la variante in cui il livello di umidità di soglia è impostato tramite una resistenza variabile. Il secondo schema è per la variante in cui il livello di umidità di soglia è impostato tramite rete attraverso il protocollo MQTT.
Tuttavia, poiché questi schemi differiranno solo per un elemento — la resistenza variabile "impostazione del livello di umidità di soglia" — disegneremo solo uno schema strutturale. Certo, lo schema strutturale secondo la normativa è diverso. Ma ci rivolgiamo non agli ingegneri esperti, ma alla nuova generazione. Pertanto, la chiarezza è più importante.

Quindi, cosa vediamo nell'immagine? Il ventilatore è collegato al relè Relay1 del controllore ShIoTiny. Vorrei sottolineare che il ventilatore è un dispositivo che opera ad alta tensione. Pertanto, se qualcuno decide di realizzare un progetto del genere, faccia attenzione. Cioè, almeno, prima di inserire le dita o strumenti di misurazione nello schema — disattivare almeno il ventilatore. E un secondo avviso. Se il vostro ventilatore è più potente di 250W, non collegatelo direttamente a ShIoTiny — solo tramite un contattore.
Abbiamo risolto il problema della ventola. Ora passiamo al pulsante «accensione manuale» della ventola. È collegato all'ingresso Input1. Non c'è nulla da aggiungere.
Sensore di temperatura e umidità DHT-11 (o DHT-22 o loro equivalenti). È previsto un ingresso speciale sul controller per collegarlo ShIoTiny. Come si può vedere nell'immagine, collegare questo sensore non presenta problemi.
Infine, una resistenza variabile che stabilisce la soglia di umidità. Più precisamente, un partitore composto da una resistenza variabile e una costante. Non ci sono problemi nel collegarlo, ma voglio spiegare che l'ADC incorporato su ESP8266 è progettato per una tensione massima di 1 Volt. Ecco perché è necessario un partitore di tensione di circa 5 volte.
Ricordo ancora una volta che questo partitore non è necessario se la soglia di umidità è impostata tramite rete utilizzando il protocollo MQTT.
Iniziamo a costruire l'algoritmo di funzionamento del dispositivo nell'editor ElDraw ShIoTiny. Per sapere come accedervi, è possibile leggere gli articoli precedenti o il manuale, il cui link è presente all'inizio dell'articolo.
Prima opzione, la più semplice
Iniziamo con la semplice accensione del relè Relay1 al superamento della soglia di umidità per un tempo impostato.

Come vediamo, non c'è nulla di complicato: solo quattro nodi, escluse le nodi di commento. DHT11 è il sensore di temperatura e umidità stesso (può essere sostituito con DHT22).
Costante CONST è il livello di umidità di soglia, in percentuale.
Il comparatore è un nodo che confronta due numeri e fornisce in uscita 1 se la condizione specificata è vera e 0 se la condizione non è soddisfatta.
Nel nostro caso, tale condizione sarà A>B, dove A il livello di umidità misurato dal sensore, e B il livello di soglia della stessa umidità.
Non appena il livello di umidità misurato (A) supera il livello di soglia dell'umidità (B), il comparatore produce 1 e il relè si attiva. E viceversa, non appena il livello di umidità torna alla normalità (cioè A>B si accenderà 1 e il relè si attiverà. E viceversa, non appena il livello di umidità tornerà alla normalità (cioè A<=B), il comparatore produce 1 e il relè si attiva. E viceversa, non appena il livello di umidità torna alla normalità (cioè A>B produce 0 e il relè si disattiva.
Tutto chiaro? Per chi non lo fosse, leggete di nuovo o consultate la descrizione del funzionamento dei nodi nelle istruzioni.
Nota che i dati del sensore DHT11 si aggiornano circa una volta ogni 10 secondi. Pertanto, il relè non potrà attivarsi e disattivarsi più di una volta ogni 10 secondi.
Tutto bello, ma vorremmo impostare il livello di soglia dell'umidità tramite un potenziometro. Non c'è niente di più facile!

Sostituiamo semplicemente il nodo costante con il nodo ADC. Infatti, è proprio all'ADC che abbiamo collegato il divisore di tensione con un resistore variabile.
La tensione all'ingresso dell'ADC varia da 0 a 1 Volt. Mentre l'umidità in uscita dal sensore varia da 0 a 100%. Come li confrontiamo? È semplice. Il nodo ADC ShIoTiny non misura solo la tensione all'ingresso, ma è anche in grado di scalare e spostare.
Cioè, all'uscita del nodo ADC1 (ADC) ci sarà un valore X, calcolato secondo la formula

, dove
— tensione all'ingresso dell'ADC (da 0 a 1V); k — intervallo (ADC range) e b-offset (ADC offset). Pertanto, se impostiamo k=100 e b=0, allora al variare
nell'intervallo da 0 a 1, il valore X in uscita dal nodo ADC varierà nell'intervallo da 0 a 100. Cioè, numericamente uguale all'intervallo di variazione dell'umidità da 0 a 100%.
In altre parole, ruotando il manico del resistore variabile, possiamo impostare il livello di soglia di umidità da 0 a 100. L'unico inconveniente è che non ci sono dispositivi di visualizzazione. Ma in pratica, se si fanno 6 suddivisioni sul manico del resistore variabile (0%, 20%, 40%, 60%, 80%, 100%) — questo è sufficiente per impostare il livello di soglia di umidità.
Come possiamo impostare i coefficienti k — intervallo (ADC range) e b-offset (ADC offset)? Certo, è più semplice di un colpo di cucchiaio! Clicca con il mouse sul nodo ADC1 e subito si aprirà la finestra di configurazione. Qui puoi impostare tutto ciò di cui hai bisogno. Nel nostro caso, sarà una finestra come quella nell'immagine.

Quindi, abbiamo una soluzione di lavoro molto semplice. Iniziamo a migliorarla.
A proposito, la soluzione più semplice ha un vantaggio: non ha bisogno di Internet. È completamente autonoma.
Seconda opzione, colleghiamo un pulsante
Tutto funziona e tutti sono felici. Ma c'è un problema: non possiamo attivare la ventilazione forzata. Abbiamo già stabilito che all'ingresso Input1 abbiamo un pulsante collegato che accenderà e spegnerà il ventilatore forzatamente, senza tenere conto del sensore di umidità.
È arrivato il momento di elaborare questo pulsante nel nostro schema-del programma.

Il blocco di elaborazione della pressione del pulsante è evidenziato da una linea arancione. È un contatore di pressioni del pulsante che si azzera quando il valore in uscita supera uno (linea verde, uscita del nodo CT).
Qui tutto funziona in modo altrettanto semplice come prima: il contatore CT fa il conteggio delle pressioni del pulsante collegato all'ingresso Input1. Cioè, il valore in uscita di questo contatore aumenta di 1 ad ogni pressione del pulsante.
Non appena questo valore raggiunge due (cioè superiore a 1), in uscita dal comparatore A>B apparirà 1. E questo 1 azzererà il contatore CT a zero. Si intende il comparatore, il più basso nello schema!
Quindi, il nostro pulsante ha due stati: 0 e 1. Se avessimo bisogno di più stati (3, 4 o anche di più) sarebbe sufficiente cambiare la costante CONST da uno a un altro valore.
Quindi abbiamo due condizioni per attivare la ventola: superamento del livello di umidità impostato e pressione singola del pulsante. Al verificarsi di una delle due condizioni, la ventola si accenderà e funzionerà fino a quando non verrà premuto di nuovo il pulsante E e il livello di umidità non tornerà nella norma.
Naturalmente, si potrebbe anche complicare ulteriormente l'algoritmo, ma non lo faremo — lasceremo spazio per la creatività di chi lo desidera.
Terza opzione, ci connettiamo a Internet.
Tutto ciò che abbiamo descritto è perfettamente funzionante. E per quanto riguarda i fronzoli? Qualsiasi hipster hacker con l'acne riderà di chi gira la manopola e preme un pulsante, invece di gestire tutto tramite smartphone! Girare la manopola è "fuori moda". Ma strofinare un dito sullo smartphone fino a farsi sanguinare è il picco dei desideri dell'hipster hacker (non ho mai potuto distinguere tra di loro — quindi se erro, perdonatemi).
Ma siamo indulgenti verso queste persone. Gestire tramite internet ha anche vantaggi reali. In primo luogo, la chiarezza. Ci sono moltissime applicazioni per tutte le piattaforme, che permettono con pochi tocchi di creare un pannello di controllo assolutamente utilizzabile per il nostro controllore Carlson. In secondo luogo, la possibilità di osservare a distanza lo stato di umidità nell'ambiente. E, in terzo luogo, è possibile vedere non solo se la ventola sta girando o meno, ma anche quale è il livello di umidità impostato. E se la ventola è stata accesa automaticamente o manualmente. Insomma, tutto ciò che desiderate.
Certo, per una semplice ventola è un onore ricevere così tanta attenzione. Ma questo è solo un esempio.
Pertanto, per connettersi a Internet utilizzeremo la tecnologia MQTT e il protocollo omonimo.
Per sfruttare questa tecnologia, abbiamo bisogno di un broker MQTT. Questo è un server speciale che gestisce i client MQTT, ad esempio ShIoTIny e il tuo smartphone.
Il principio della tecnologia MQTT è che qualsiasi client pubblica sul broker MQTT (server) dati casuali sotto un nome specifico (chiamato topic nella terminologia MQTT). Altri client possono iscriversi ai dati casuali tramite il loro nome (topic) e ricevere i dati appena pubblicati. In altre parole, tutto lo scambio di dati avviene secondo il principio client-broker-client.
Io Non mi soffermerò sui dettagli. Su Internet ci sono molte 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.
Pertanto, consideriamo che ti sei registrato su un broker MQTT. In generale, il broker ti fornirà (o richiederà di inventare) un nome utente e una password (per l'autenticazione), oltre a una porta per la connessione. Per connettersi al ShIoTiny a broker MQTT ci sono due modi: connessione normale e tramite TLS (SSL).
Tutti questi parametri ShIoTiny vengono inseriti nella scheda Networking, sezione Connessione MQTT al server.

Se il tuo broker MQTT non richiede autenticazione, non inserire username e password (lascia questi campi vuoti).
Caratteristica Prefisso del topic MQTT richiede una spiegazione separata.
Il prefisso dei parametri MQTT è una stringa che viene aggiunta al nome del topic (topic) durante la pubblicazione e l'iscrizione su un broker MQTT. Per impostare il prefisso MQTT per il tuo controllore, devi semplicemente inserirlo nel campo "Prefisso del topic MQTT» («Prefisso del topic MQTT"). Il prefisso inizia sempre con una barra («/»)! Se non inserisci la barra nel campo di input, verrà aggiunta automaticamente. Non è possibile utilizzare i caratteri «#» e «+». Non ci sono altre restrizioni.
Ad esempio, se pubblichi il parametro "status" (o ti iscrivi ad esso), e il tuo prefisso è impostato su "/shiotiny/", allora su un broker questo parametro sarà pubblicato con il nome "/shiotiny/status". Se hai impostato un prefisso vuoto, tutti i parametri sul broker inizieranno con la barra («/»): «status" sarà pubblicato come "/status».
Quindi, consideriamo che ti sei registrato su un broker MQTT e hai ricevuto username, password e porta. Poi hai scritto questi parametri nella scheda Networking, sezione Connessione MQTT al server del controllore ShIoTiny.
Consideriamo che il prefisso sia stato impostato su "/room/».
Iniziamo pubblicando lo stato di tutti i parametri chiave: relè Relè1, stato dell'accensione manuale, stato dell'accensione automatica e, infine, livelli di soglia e attuali di umidità. E in più, la temperatura della stanza. Come fare, lo vediamo nell'immagine.

Come possiamo vedere, la differenza rispetto alla versione precedente è solo nei nodi «Pubblicazione MQTT». Considerando il prefisso, vengono pubblicati i seguenti parametri:

Come vediamo, lo stato dell'intero sistema è chiaro come il sole!
Ma vogliamo non solo vedere, ma anche controllare. Cosa fare? È molto semplice. Abbandoneremo l'installazione del livello di soglia di umidità tramite ADC e un resistore variabile e definiremo direttamente questo livello di soglia di umidità dal MQTT proprio smartphone!

Rimuoviamo il nodo ADC dallo schema e inseriamo tre nuovi nodi: Memoria FLASH, Ripristino FLASH e Descrizione MQTT.
La funzione del nodo Descrizione MQTT è evidente: riceve il parametro /room/trigHset (livello di soglia di umidità) dal broker MQTT. Ma cosa fa con i dati dopo? Semplicemente li restituisce al nodo Memoria FLASH, che a sua volta salva questi dati nella memoria non volatile con il nome trigH. Dopo di che, il nodo Ripristino FLASH legge dalla memoria non volatile i dati con il nome trigH e ciò che accade dopo già lo sappiamo.
Perché tanta complessità? Perché non possiamo subito passare i dati ottenuti all'ingresso del comparatore?
Come diceva il compagno Sh.Holmes — è elementare! Nessuno garantisce che, dopo l'accensione del dispositivo, questo si collegherà a broker MQTT. E bisogna misurare l'umidità. E bisogna accendere il ventilatore. Ma senza informazioni sul livello soglia di umidità, questo è impossibile! Perciò, il nostro dispositivo, all'accensione, estrae il livello 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.
Da qui in poi puoi inventare qualsiasi cosa. Ad esempio, oltre all'umidità puoi iniziare a tenere conto anche 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 implementazione di un controller basilare basato su ShIoTiny. Magari sarà utile a qualcuno.
Come sempre, inviate proposte, suggerimenti, domande, refusi e altro all'indirizzo email: shiotiny@yandex.ru
Fonte: habr.com
