Il modulo ESP8266 e il NodeMCU DevKit – Parte 2 – Controlliamo 4 relè tramite la rete wi-fi di casa

Proseguiamo il tutorial iniziato qualche giorno fa illustrando qualche applicazione pratica utilizzando, oltre al NodeMCU Devkit, due schede gentilmente concesse dalla Linksprite : la LinkNode R4 e la LinkNode D1.

Schede basate su ESP8266. Da sinistra verso destra: NodeMCU DevKit generico, Linknode R4, Linknode D1
Schede basate su ESP8266. Da sinistra verso destra: NodeMCU DevKit generico, Linknode R4, Linknode D1

Nella foto sopra potete vedere le schede che ho utilizzato per i miei esperimenti. Tutte e 3 hanno in comune il fatto di avere a bordo un modulo ESP8266 nella versione ESP-12. Della NodeMCU devkit ne abbiamo già discusso abbondantemente nell’articolo precedente: è una scheda che permette l’utilizzo immediato del classico modulo ESP8266 esponendone tutti i pin e includendo a bordo il regolatore di tensione, i pulsanti per reset/flash e il convertitore USB/Seriale e sappiamo che in più rispetto ai vari moduli ESP-xx ha preprogrammato il firmware per utilizzare il linguaggio LUA, anche se in realtà io non sto affatto utilizzando questa funzione e mi sono buttato a capofitto sul più classico Arduino IDE.

Avvertimenti generali

Dovete ricordarvi che se usate un modulo ESP8266 nudo e crudo (ESP-xx), per programmarlo bisogna portare il pin GPIO0 a massa, finito di programmare, bisogna portarlo a livello logico alto (3.3V). E’ utile tenere il pin sempre alto con una resistenza di pull-up e ricordarsi quindi soltanto di portarlo a massa per la programmazione. Altre schede (come la LinkNode R4) potrebbero avere un jumper per selezionare la destinazione di GPIO0 (programmazione->massa/utilizzo->3.3V).

Le schede che hanno il convertitore USB/seriale in genere eseguono già in automatico questa operazione per cui non dovremo preoccuparcene.

In aggiunta vi ricordo ancora una volta che i moduli ESP8266 lavorano a 3.3V, per cui se dovete leggere dei livelli logici a tensione più alta (ovvero dovete inviare un segnale a 5V in un pin del modulo ESP configurato come ingresso) c’è bisogno di adattarli con un partitore o con circuiti apposta, se invece volete pilotare logiche a 5V (ovvero i pin configurati come uscite devono inviare un segnale verso una logica a 5V), le uscite a 3,3V vanno bene.

Avvertimenti per la LinkNode R4

Bisogna tenere conto di alcune cose quando si utilizza tale scheda (è quella con i 4 relè già a bordo):

  • Qui avete un jumper a 2 vie siglato S1 con affianco scritto GND/DIO0/3V3 (DIO0 sarebbe il GPIO0). Il pin centrale in pratica va verso il GPIO0 dell’ESP8266, capite bene che per programmare la scheda dovete chiuderlo verso GND, finita di programmare la scheda dovete spostare il jumper verso 3V3 (anche se appena termina la programmazione il programma già parte correttamente, ma se spegnete e riaccendete la scheda, non funzionerà nulla se non spostate il jumper).
  • Facendo riferimento al punto precedente: se la programmazione non va a buon fine, assicuratevi prima di tutto che il jumper sia chiuso verso massa!
  • La tensione da applicare al connettore di alimentazione deve essere 5V! A bordo non c’è nessun regolatore di tensione per scalare la tensione a 5V, c’è soltanto il regolatore a 3.3V per alimentare il modulino Wi-Fi (ma i relè funzionano a 5V!). Quindi fate estrema attenzione a cosa collegate sul connettore di alimentazione altrimenti friggete tutto in un istante! Ripeto: dovete applicare per forza una tensione di 5V già stabilizzata!
  • Come detto già nella parte precedente, se intendete programmarla, avete bisogno di un convertitore USB/Seriale TTL a 3.3V (dico: “se intendete programmarla” perchè… Vedi punto successivo!)
  • La LinkNode R4 viene venduta con un firmware precaricato che la imposta come Punto d’Accesso e consente di controllare i 4 relè tramite un’applicazione Android che viene accoppiata alla scheda stessa (tale scheda difatti nella parte inferiore ha un codice QR che serve appunto a questo). La procedura per utilizzare la scheda tal quale con l’applicazione Android della Linksprite è disponibile sul sito ufficiale in questa pagina. Se riprogrammate la scheda con gli esempi mostrati qui, sappiate che perderete il firmware originale. Ho contattato tempo fa un membro della LinkSprite su Github (delongqilinksprite), per chiedergli di rendere disponibile il firmware originale e… l’hanno caricato! Ad ogni modo non ho provato affatto quel codice (né come fornito di fabbrica, né scaricato da Github), per cui… fate come ritenete opportuno, io sono qui per sperimentare.
  • Fate molta attenzione se intendete collegare utilizzatori esterni a 220V. E’ chiaramente un’operazione a vostro rischio e pericolo. Discutendo con persone più esperte di me in questo campo da un rapido colpo d’occhio sembra che la scheda rispetti le specifiche in questo senso: ci sono delle gole per aumentare l’isolamento dei contatti dei relè dal resto del circuito (i 5mm minimi pare siano rispettati) e i relè hanno i contatti 250VAC 10A:
LinkNode R4 - vista posteriore. Sono stati realizzati dei canali per aumentare l'isolamento tra i contatti dei relè e il resto del circuito
LinkNode R4 – vista posteriore. Sono stati realizzati dei canali per aumentare l’isolamento tra i contatti dei relè e il resto del circuito

Avvertimenti per la LinkNode D1

La LinkNode D1 ha un form-factor uguale a quello di Arduino. Il problema è che, a differenza di Arduino, montando un ESP8266, ha soltanto 9 I/O (in realtà sarebbero 11, ma 2 sono usati per la UART) e chiaramente un solo ingresso analogico (A0) come detto già nell’articolo precedente (i moduli ESP8266 hanno un solo ingresso analogico), per cui gli altri pin degli header di Arduino sono duplicati dei GPIO già presenti (ovvero alcuni segnali sono ripetuti due volte per riempire gli header standard di Arduino; ad esempio il GPIO12 dell’ESP8266 ce lo ritroviamo sia sul pin 6 che sul 12 degli headers).

A tal proposito ho preparato una tabella di corrispondenza dei pin disponibile al paragrafo “Configurazione Pin” più in basso. In aggiunta alcuni pin che hanno la funzione PWM non si trovano nemmeno in corrispondenza dei pin PWM originali di Arduino… Quindi penso che la compatibilità con eventuali shield originali sia piuttosto bassa.

Rispetto alla LinkNode R4 ha però un range di tensioni di alimentazione più esteso (da 9 a 24V) dal momento che a bordo, anzichè un classico regolatore di tensione, è presente uno step-down switching : molto più efficiente. Il dispositivo (non mi stanco mai di ripeterlo) ha comunque una logica a 3.3V come già specificato più volte.

Configurazione Arduino IDE

A seconda della scheda che intendiamo utilizzare bisogna impostare dei parametri diversi. Abbiamo chiaramente già seguito la parte di tutorial precedente in cui spiegavo come impostare Arduino IDE per lavorare con le schede ESP8266.

Di seguito ho preparato una tabella con le configurazioni da impostare per le tre schede che ho usato nei miei esperimenti. In particolare per la Linknode D1 basta semplicemente selezionare Wemos D1 (retired) senza alterare i parametri di default. Per le altre schede va invece impostato Generic ESP8266 e cambiati i parametri Flash Mode / Flash Size e Reset Method, tutti gli altri parametri (che ho riportato solo a scopo di completezza) vanno lasciati ai valori di default.

ParametroNodeMCU DevKitLinknode R4Linknode D1
Tensione alimentazione su connettore esternonon disponibile (*)5V9-24V
Selezione tipo schedaGeneric ESP8266Generic ESP8266WeMos D1 (retired)
Flash ModeDIOQIO
Flash Frequency40MHz40MHz
CPU Frequency80MHz80MHz80MHz
Flash Size4M (3M SPIFFS)512K (64K SPIFFS)4M (3M SPIFFS)
Debug PortDisabledDisabled
Debug LevelNessunoNessuno
Reset Methodnodemcuck
Upload Speed115200115200921600
(*) dovrebbe essere possibile alimentare la scheda dall'esterno fornendo da 5 a 9V sul pin VIN o 5V sul pin VU (VUSB)

Ne approfitto per fare un appunto sullo SPIFFS.  Questa sigla sta per Serial Peripheral Interface Flash File System. E’ un File System che può essere utilizzato nelle nostre applicazioni per salvare, ad esempio, files sulla memoria interna dell’ESP8266. In pratica la memoria interna è partizionata in memoria programma e memoria riservata allo SPIFFS. Capite quindi il senso di quel “4M (3M spiffs)” che sta per: 4 Megabytes in totale di memoria programma, di cui 3 Megabytes riservati allo SPIFFS (e quindi 1MB riservato al programma). Riprogrammando la scheda il contenuto dello SPIFFS non viene perso (in realtà penso che il contenuto potrebbe venir perso se si fa qualche operazione sbagliata, tipo selezionare una configurazione con una diversa quantità di memoria riservata allo SPIFFS, ma non sono sicuro di questo). Questa area può quindi essere vista come una sorta di “scheda di memoria” inclusa nel sistema. Ulteriori informazioni sullo SPIFFS e sul suo utilizzo li potete trovare qui:

Aggiornamento 

Con la nuova versione delle librerie per ESP8266 sono stati aggiunti altri parametri. I parametri che trovate in più potete lasciarli come default.

Bene, siamo riusciti a configurare tutto… manca ancora poco!

Corrispondenza PIN

Quando in Arduino IDE scriviamo uno sketch per Arduino e impostiamo il numero di pin come ingresso o uscita, tale numero corrisponde allo stesso numero serigrafato sulla scheda.

pinMode(pin, OUTPUT);

Purtroppo per le schede con ESP8266 non è così, o meglio: è vero parzialmente. Nell’IDE di Arduino, difatti, il numero di pin che andiamo ad impostare come ingresso o uscita corrisponde allo stesso numero di GPIO del modulino ESP8266 (se ad esempio impostiamo il pin n°4 come uscita, di conseguenza il GPIO4 sarà impostato come uscita) fin qui tutto logico e ineccepibile.

Il problema è che sulle varie schede sono riportate delle indicazioni molto diverse. Tanto per fare un esempio, sulle schede NodeMCU devkit il GPIO4 è riportato come D2: capite che comincia a diventare complicato capire quale pin stiamo impostando.

A tal proposito esistono svariati disegni in rete che illustrano la corrispondenza dei pin digitali da impostare in Arduino con i vari I/O presenti sui diversi modelli di NodeMCU devkit. Nell’immagine seguente è illustrato un esempio (è molto simile al tipo di NodeMCU devkit che ho io a parte il chip seriale/USB e i due pin “Reserved” che a me sono riportati come G (GND) e VU (tensione da USB)): 

nodemcu_devkit_pinout

Ho fatto un po’ più chiarezza (o più confusione?) con la tabella seguente che illustra anche la corrispondenza dei pin sulle altre due schede:

tabella_corrispondenza_pin_esp8266

Particolare attenzione meritano i pin indicati in rosso, che sono destinati sui moduli ESP a gestire le schede di memoria Secure Digital: a me è capitato che se provo ad impostarli come I/O, non mi funziona nulla e ho un’output del genere sulla seriale:

esp8266_arduino_illegal_io

 

Probabilmente per poterli utilizzare come normali I/O bisogna fare altre operazioni che per ora ignoro.

La Linknode R4 utilizza soltanto 4 I/O, quelli a cui sono collegati i relè (che corrispondono ai GPIO 12,13,14 e 16). Per completezza ho indicato anche quali led indicano l’accensione del rispettivo relè.

La Linknode D1, come dicevo, ha alcuni pin duplicati sugli header (ad esempio il GPIO4 è riportato su un header come D14/SDA/D4 e come D14/SDA su un altro header, ecco perchè su alcuni pin ho scritto il pin digitale corrispondente a quello originale di Arduino, in blu: perchè anche sulla scheda su un GPIO è riportato e sull’altro duplicato no). L’ultima colonna affianco riporta in pratica a quale pin della scheda Arduino sono collegati. Sulla LinkNode D1 i pin in rosso non sono proprio riportati all’esterno, quindi ad utilizzarli non ci proviamo proprio.

Bene… direi che possiamo cominciare con un esempio pratico:

Controllare 4 relè tramite la rete wi-fi domestica

Io per comodità utilizzerò la LinkNode R4, ma ho fatto le prove collegando 4 relè sia alla LinkNode D1 che alla NodeMCU devkit: non cambia assolutamente nulla, per cui non deve cambiarvi nulla nemmeno se usate un modulo ESPxx singolo (chiaramente adattando il codice agli I/O che avete a disposizione).

Se volete provare anche voi con dei relè anzichè con semplici led e non avete la LinkNode R4, potete usare una scheda qualsiasi basata su ESP8266 e può tornarvi utile questo mio vecchio e semplicissimo progetto di una scheda con su due relè a 5V. Le mie prove con le altre schede le ho fatte utilizzando proprio 2 di queste schede: funzionano perfettamente anche pilotate dagli I/O a 3.3V.

Dato che nello sketch ho nominato i relè come 1,2,3 e 4, riporto qui una foto di come li ho identificati nel caso voi utilizziate la stessa scheda:

Numeri con cui ho identificato i Relè nell'applicazione

Nella mia applicazione i 4 relè sono collegati ai GPIO 12,13,14 e 16 che, per facilitarvi le cose, sulle 3 schede che ho usato, hanno questa corrispondenza:

Identificazione RelèGPIO ESP8266Pin su NodeMCU devkitRelè su LinkNode R4Pin su LinkNode D1
114D5S3D13/SCK
212D6S4D12/MISO
313D7S5D11/MOSI
416D0S2D2

Lo sketch che ho caricato è una variazione di quelli già presenti nella cartella degli esempi che vi ritrovate dopo aver incluso in Arduino IDE le schede ESP8266. Si tratta di uno dei tanti esempi di WiFi Client che ho cercato di aggiustare un po’ facendo in modo che l’output sia un po’ più carino e soprattutto valido dal punto di vista della sintassi HTML:

Sorgente della pagina generata
Sorgente della pagina generata

Come vedete nel sorgente della pagina ho anche aggiunto un commento HTML che riporta lo stato dei 4 relè. Anche se si tratta solo di un semplice commento, in realtà questo è un dato utilizzato dalla app android che ho realizzato appositamente per questa demo.

Nello sketch ho aggiunto la possibilità di inviare un comando seriale (si invia la lettera i maiuscola o minuscola) per restituire l’indirizzo IP della scheda nel caso in cui dopo il primo avvio ce lo fossimo perso.

Per aver il codice operativo da subito dovete modificare unicamente le righe:

// put here your wi-fi network data
const char* ssid = "[YOUR SSID]";
const char* password = "[YOUR PASSWORD]";

per fare in modo che i dati combacino con quelli della vostra rete wi-fi di casa.

Una volta finita di programmare la scheda (e messa in modalità di utilizzo: GPIO0 verso 3.3V per le schede che non lo fanno in automatico), l’ESP8266 prova a collegarsi alla vostra rete di casa. Potete seguire l’andamento delle procedure utilizzando il monitor seriale di Arduino.

Server avviato. Appena aprite il monitor seriale sull'ESP8266 capita di vedere dei caratteri apparentemente a caso all'inizio
Server avviato. Appena aprite il monitor seriale sull’ESP8266 capita di vedere dei caratteri apparentemente a caso all’inizio

Se passa troppo tempo viene restituito un messaggio: controllate che i dati relativi a SSID / password siano scritti correttamente (rispettate maiuscole e minuscole) e che la rete wi-fi sia accesa e accessibile nel punto in cui state facendo le prove. Quando il collegamento va a buon fine viene restituito un messaggio e l’indirizzo IP della scheda, che dovrebbe iniziare con 192.168. Sulla rete wi-fi di casa mia in genere l’indirizzo IP rimane sempre lo stesso. Quando invece creo una rete col cellulare, l’ultima parte cambia ogni volta. Per evitare ogni tipo di problema bisognerebbe trovare un metodo per bypassare l’assegnazione automatica dell’IP e dare un indirizzo fisso.

Potete quindi aprire un browser su un PC collegato alla stessa rete wi-fi, digitando HTTP:// seguito dall’indirizzo IP della scheda.

Deve comparire una paginetta molto semplice in cui viene indicato lo stato dei 4 relè con affianco ad ognuno di essi un pulsante per invertirne lo stato.

Pagina visualizzata su PC
Pagina visualizzata su PC

La pagina generata è ottimizzata per i dispositivi mobili, per cui se la usate col cellulare, dovrebbe riempire tutto lo schermo (ho fatto le prove sia su smartphone android che windows).

Il meccanismo di funzionamento è molto semplice: la scheda resta in attesa di request http, quando le riceve, analizza la stringa di richiesta, se è presente qualcosa del tipo Rx=n (dove x da 1 a 4 indica il numero di relè e n vale 0 se bisogna spegnere il relè o 1 se bisogna accenderlo), allora esegue la modifica sullo stato di uscita del rispettivo I/O e aggiorna la visualizzazione della pagina. In pratica un url di esempio è il seguente:

http://192.168.0.110/?R1=1

Non ho usato refresh nè Ajax, per cui se accedete allo stesso IP con dispositivi differenti, la pagina potrebbe non visualizzare il reale stato corrente dei relè, ma queste semplici modifiche potete farle voi: in passato ho già fatto una cosa del genere usando il ChipKIT™ MAX32.

Se non volete utilizzare la pagina web generata in questo esempio, ho realizzato un’App Android apposta

ESP8266WebServer o WiFiServer ?

Come potete vedere, nel codice ho incluso la libreria WiFiServer. Molti esempi includono sia questa che la ESP8266WebServer. La differenza sta qui: la WiFiServer server per implementare il server TCP, la ESP8266WebServer implementa un server HTTP appoggiandosi al server TCP. In pratica nel mio codice faccio uso di tecniche “grezze” per generare la pagina, utilizzando anche il server HTTP è possibile gestire in maniera più completa la comunicazione.

In aggiunta, come dicevo più sopra, ho realizzato una semplicissima applicazione Android che potete usare sia da tablet che da cellulare per collegarvi alla scheda ed eseguire il toggle dei relè. Ma di questa ne parlerò nella terza e ultima parte.

relay_remote_app

 

Nel frattempo avete già tutto l’occorrente per sperimentare il vostro sistema domotico a basso costo. Nel paragrafo successivo c’è il download con lo sketch già pronto. Buon divertimento!

Clicca qui per andare alla parte precedente di questo tutorial

Troubleshooting

Elenco qui gli errori più comuni:

Impossibile riuscire a programmare la scheda

  • Il pin GPIO0 non è a massa
  • La porta seriale non è quella giusta
  • Il baudrate non è quello giusto
  • Le impostazioni della scheda non sono quelle giuste
  • Sono state invertite le linee TX/RX del convertitore seriale/USB
  • Il monitor seriale è aperto mentre cerchiamo di programmare la scheda
  • La porta seriale dell’adattatore non è stata creata (verificare nel pannello di controllo e installare i driver giusti)
  • I punti precedenti sono tutti corretti e verificati ma continua a non programmare: usate il rimedio universale (spegnere e riaccendere la scheda)

Il programma non parte/non funziona

  • Il pin GPIO0 non è stato portato a 3.3V
  • I parametri SSID/password non sono stati scritti correttamente
  • La rete Wi-Fi è spenta
  • La rete Wi-Fi non è accessibile
  • L’ESP8266 si è bloccato, provate il rimedio universale: spegnere e riaccendere

Downloads

Relay Remote Demo (2180 download) Datasheet ESP8266EX (2148 download)
Se questo articolo ti è piaciuto, condividilo su un social:
Se l'articolo ti è piaciuto o ti è stato utile, potresti dedicare un minuto a leggere questa pagina, dove ho elencato alcune cose che potrebbero farmi contento? Grazie :)