Dopo aver scelto il relè più adatto alle nostre esigenze, ovvero che abbia i contatti in grado di sopportare tensione e corrente richiesti dal nostro utilizzatore, è giunto il momento di collegarlo al nostro NodeMCU, quindi controllarlo da remoto. Sui contatti del relè andremo a collegare solitamente dispositivi funzionanti con la tensione domestica (220VAc) bisogna quindi adoperare buon senso, massima attenzione e affidarsi a mani esperte. Esiste il rischio concreto di folgorazione nonché di causare seri danni. Osservate quindi tutte le precauzioni del caso.
Pilotare il relè
Per la nostra applicazione sceglieremo un relè avente la bobina a 5V. Normalmente la bobina di questi relè assorbe tra i 70 e 100mA, non è possibile pilotarla direttamente da un GPIO del NodeMCU dato che non eroga più di 12mA (e inoltre non fornisce nemmeno la tensione corretta). Questa operazione va quindi fatta tramite un piccolo transistor in grado di lasciar fluire almeno 100mA. Per il nostro scopo va bene un comune transistor bjt BC337. Inviando un segnale con sufficiente corrente sulla base il transistor va in saturazione e lascia passare corrente tra collettore ed emettitore agendo quindi come una sorta di interruttore. Andiamo a realizzare il circuito.
La resistenza da 2.2KΩ fa fluire, dal GPIO 12 (D6), corrente sufficiente per mandare il transistor BC337 in saturazione, ovvero "farlo chiudere" tra collettore ed emettitore. La resistenza da 10KΩ forza la base del transistor verso GND in modo che il transistor sia interdetto (nessun passaggio di corrente) in assenza di segnale sulla base, lasciando quindi il relè spento nel frattempo che il NodeMCU si avvia. Inviando un segnale a livello alto dal GPIO 12. In breve, il transistor lascia passare corrente e il relè si attiva. Il diodo 1N4148 è anche detto diodo di Flyback o, in italiano, diodo di ricircolo e viene adoperato per eliminare gli spike di tensione che si verificano su carichi induttivi (come lo è a bobina del relè) quando viene fornita e rimossa alimentazione in maniera repentina. È necessario per evitare di danneggiare NodeMCU, transistor ed eventualmente porta USB. Se alimentiamo il NodeMCU dalla porta micro-usb, prenderemo la tensione di 5V dal terminale contrassegnato come VU. Se invece non vogliamo utilizzare la porta USB abbiamo a disposizione il pin VIN che, come detto nelle lezioni precedenti, è il punto in cui possiamo alimentare il NodeMCU fornendogli 5V. In questo caso prenderemo la tensione di 5V da tale pin.
È quindi possibile collegare un carico tra il contatto COM e il contatto NO del relè, come ad esempio una lampadina, prestando sempre la massima attenzione qualora i contatti siano sottoposti a tensione di rete. In molti modelli di relè il contatto comune si trova in mezzo ai due contatti della bobina e questo collegamento richiede la massima attenzione per evitare di mettere in comunicazione la linea a bassa tensione con quella ad alta tensione o creare archi elettrici.
In commercio esistono tantissimi moduli relè economici a 5V muniti anche di fotoaccoppiatore, che aumenta il grado di protezione.
Tali moduli hanno da un lato un connettore a vite a 3 vie che riporta i contatti del relè, e dall'altro 3 pin per GND, alimentazione (VCC) e pilotaggio (IN). Il vostro modulo potrebbe differire dall'immagine precedente, fate riferimento alle serigrafie riportate su di esso. Volendo utilizzare uno di questi moduli bisogna comunque avere l'accortezza di pilotarlo tramite il transistor, altrimenti collegando direttamente il GPIO del NodeMCU al terminale "IN" il relè non si attiva dato che sono dimensionati per ricevere 5V sul terminale di pilotaggio e il NodeMCU non è in grado di fornirli. Usando questi moduli il diodo di ricircolo ovviamente non è più necessario perché si trova già montato in parallelo alla bobina del relè.
Lo sketch
Il programma da caricare sul NodeMCU, rispetto agli esempi delle lezioni precedenti, presenta una nuova caratteristica, questa volta il NodeMCU non deve trasmettere un dato via MQTT, bensì riceverlo, interpretarlo, e agire di conseguenza. Per questo motivo viene definita una funzione di callback, ovvero una procedura da richiamare alla ricezione di un messaggio MQTT. Nella funzione di setup abbiamo, in sequenza, la connessione al WiFi, la connessione al broker MQTT e l'assegnazione della funzione di callback.
WiFi_connect(); // connessione al Wi-Fi mqtt_connect(); // connessione al broker MQTT MQTTClient.setCallback(callback); // impostazione callback ricezione messaggio
La funzione mqtt_connect esegue la connessione al broker e la sottoscrizione al topic che ci interessa.
MQTTClient.connect(mqtt_client_id,mqtt_username,mqtt_password); MQTTClient.subscribe(mqtt_topic);
Tutti i parametri sono definiti all'inizio del programma e personalizzabili. Nel momento in cui nel topic sottoscritto arriva un messaggio automaticamente viene richiamata la funzione di callback. In tale funzione viene confrontato il payload del messaggio, che nella fattispecie sarà un valore booleano inviato da Node-Red, con le stringhe true e false. La libreria difatti accetta come valori solo array di char (stringhe) e i valori in ingresso vengono tutti convertiti in questo formato. Nel caso in cui il payload venga identificato come 'true' viene portato a livello logico alto il GPIO che controlla la base del transistor e quindi fa attivare il relè.
Qui potete scaricare lo sketch di esempio per Arduino IDE.
Modifichiamo la parte iniziale dello sketch inserendo tutti i dati salienti della nostra rete. Carichiamo il programma sul NodeMCU e osserviamo, aprendo la finestra terminale, l'output a schermo, anche per essere sicuri che il collegamento alla nostra rete Wi-Fi e al broker MQTT vadano a buon fine.
Su Node-Red
Lato Node-Red andremo a utilizzare, per immediatezza, il nodo switch. Bisogna fare attenzioni perché nella palette normalmente sono presenti due nodi col nome Switch: uno si trova nel gruppo Function, e serve appunto a eseguire delle funzioni, e l'altro si trova nel gruppo Dashboard: tale nodo viene renderizzato sulla dashboard nella forma di un interruttore a scorrimento che esegue anche un'animazione in seguito alla pressione. Scorre verso destra quando si chiude, assumendo una colorazione più accesa, e verso sinistra quando si apre, diventando grigio. Tale nodo presenta un punto di ingresso e uno di uscita, per ora utilizzeremo solo il punto di uscita. Trasciniamo il nodo switch, presente nella zona "Dashboard", nell'area di programmazione e facciamo doppio click su di esso. Impostiamo solo il nome nella Label: Relè. Assicuriamoci che nel Group sia selezionato "[HTML.it] Esercizio" e lasciamo invariato il resto. Nelle proprietà c'è un "ON payload", che rappresenta il messaggio inviato nel punto di uscita quando l'interruttore viene chiuso, ovvero spostato verso destra. Tale valore è il valore booleano True di default. Per contro, il valore "OFF Payload" è il messaggio inviato quando l'interruttore viene aperto ed è False di default. Premiano "Done". Trasciniamo un nodo Output/MQTT e diamo doppio click. Il valore Server è di default l'ultimo server MQTT utilizzato (che per semplicità abbiamo chiamato localhost). Nel valore topic scriviamo: esempio/relay/set. Potete vedere che questo topic è lo stesso che abbiamo definito nello sketch del NodeMCU nell'array mqtt_topic. Premiamo Done. Colleghiamo il punto di uscita del nodo switch al punto di ingresso del nodo MQTT output e facciamo il deploy. È possibile scaricare qui il sorgente di questo esempio da importare in NodeRED.
Da un dispositivo mobile apriamo la dashboard di Node-Red e premiamo lo switch. lo switch deve spostarsi verso destra e il relè sul NodeMCU scatta.
A seguire
Nella prossima lezione vedremo come ottenere un feedback dal relè, funzione utile se intendiamo controllare un relè anche da pulsante o da interruttore esterno oltre che dal dispositivo mobile ottenendo sullo stesso una "segnalazione".