E' il momento di realizzare, utilizzando il NodeMCU, alcuni dispositivi remoti, posti in un ambiente per visualizzare lo stato di sensori indipendenti dal Raspberry Pi. Quest'ultimo svolgerà le sue funzioni di "centralina" dell'impianto domotico altrove.
Pinout NodeMCU
Gli I/O sul NodeMCU sono contrassegnati come D0, D1 ecc. In Arduino IDE i GPIO vengono identificati da un numero diverso. Purtroppo il D2 del NodeMCU, ad esempio, non corrisponde al GPIO numero 2 di Arduino IDE. Bisogna tenere presente la corrispondenza del pin che intendete usare con questo schema. In Blu è indicato il numero di GPIO utilizzato da Arduino IDE.
Pin del NodeMCU a cui fare attenzione
Quando si sceglie un I/O del NodeMCU bisogna tener conto che alcuni pin sono utilizzati, al momento dell'accensione, per funzioni particolari (messa in modalità programmazione, programmazione via UART, boot da una eventuale SD card esterna piuttosto che dalla memoria Flash su scheda), per cui è necessario che solo nel momento in cui si da tensione al NodeMCU 3 GPIO (in particolare quelli indicati in arancione nello schema sopra) restino nelle condizioni di default. Li elenchiamo a seguire.
- GPIO 0 (corrispondente a D3): livello alto;
- GPIO 2 (corrispondente a D4): livello alto (sui NodeMCU Lolin qui, generalmente, è anche collegato un led blu);
- GPIO 15 (corrispondente a D8): livello basso.
Questi livelli sono normalmente tenuti "come indicato" da resistenze di pull-up e pull-down già presenti sulla scheda. Facendo un esempio, se dobbiamo collegare un pulsante che normalmente chiude verso GND quando il battente della finestra è chiuso, non lo andremo a collegare a GPIO 0 o a GPIO 2 perché se il battente è chiuso e noi accendiamo il dispositivo quei due pin si troveranno, all'avvio, a livello basso e il programma non partirà. La soluzione più ovvia è cambiare la logica. Si chiude verso GND quando la finestra è aperta piuttosto che chiusa oppure si usa un altro pin. In alternativa possiamo usare un transistor per invertire i livelli. Esistono tanti altri metodi di interfacciamento come gli I/O expander che consentono, tra l'altro, di collegare anche un numero molto elevato di GPIO sfruttando solo due linee di comunicazione.
Sensore
Il sensore più semplice da interrogare è quello costituito da un pulsante. Un oggetto così banale ci permette, a esempio, di sapere se un accesso è aperto o chiuso. Tanti tipi di sensori si comportano come un pulsante, ad esempio i galleggianti per determinare il livello minimo/massimo di un liquido, i sensori di inclinazione, i sensori di vibrazione, i pressostati, i termostati e altro. Abbiamo già implementato l'esempio del pulsante nella lezione 3. Abbiamo operato sul Raspberry Pi, questa volta sfrutteremo gli stessi concetti sul NodeMCU.
Useremo uno switch Reed di quelli comunemente utilizzati negli antifurti per rilevare l'apertura di porte o finestre. In caso non lo abbiate a portata di mano, per realizzare l'esempio, potete anche utilizzare un pulsante normalmente chiuso. Uno switch Reed da antifurto è costituito da due parti: un magnete che va fissato sulla parte mobile (l'anta della porta o della finestra) e il contatto Reed costituito da un'ampollina in vetro incapsulata con dentro due lamelle, che va tenuto fisso sullo stipite. Quando la finestra è chiusa il magnete è vicino allo switch e il contatto è chiuso, se la finestra si apre, il magnete si allontana e lo switch si apre. Realizziamo lo schema subito sotto.
Lo switch Reed ha il pin D1 (GPIO n°5) a livello basso quando la calamita è vicina (finestra chiusa). Quando la finestra viene aperta, la calamita si allontana e lo switch Reed si apre, per cui il pin leggerà un livello alto fornito dalla resistenza da 10kΩ.
Lo sketch che utilizzeremo è disponibile a questo link.
Estraiamo il file ZIP e, nella cartella che viene creata, facciamo doppio click sul file con estensione .ino. Si aprirà Arduino IDE con il codice sorgente. Nelle righe da 22 a 26 dobbiamo impostare i parametri della nostra rete Wi-Fi.
Nelle righe da 29 a 34 andremo ad impostare i parametri relativi al nostro broker MQTT. Una volta completate le modifiche è possibile caricare lo sketch su NodeMCU come abbiamo imparato a fare nei contenuti precedenti di questa guida. A fine caricamento è possibile aprire una finestra terminale dall'IDE di Arduino per visualizzare i messaggi informativi restituiti dal programma mediante le funzioni Serial.print. Quando il dispositivo si collega alla rete Wi-Fi si accende il led blu sul modulo (fate attenzione: non tutti i NodeMCU hanno il led integrato collegato allo stesso GPIO, alcuni NodeMCU lo hanno sul GPIO 16. È bene fare riferimento allo schema della scheda in vostro possesso).
Nella finestra terminale possiamo notare che quando avviciniamo la calamita compare la scritta "switch chiuso". Lo sketch esegue il controllo dello switch ogni due secondi inviando il messaggio al broker MQTT.
A questo punto spostiamoci nell'editor di NodeRed. Dato che abbiamo modificato il programma caricato su NodeMCU è conveniente modificare i due nodi creati nella lezione precedente. Facciamo doppio click sul nodo MQTT input e modifichiamo il topic impostandolo a esempio/finestra come definito anche nel codice sorgente a riga 34. Premiamo Done. Facciamo doppio click sul nodo Label collegato al nodo MQTT e modifichiamo il campo Label scrivendo Stato finestra. Premiamo Done e infine Deploy. Colleghiamoci alla dashboard (aggiungete /ui all'url di NodeRed) quindi proviamo ad avvicinare e allontanare il magnete dallo switch Reed per vedere lo stato aggiornarsi. È possibile scaricare qui il sorgente di esempio da importare in NodeRed.
A seguire
Nella prossima lezione, al posto di uno switch, leggeremo un sensore di temperatura ampliando le possibilità di utilizzo della nostra installazione domotica.