Le strip LED RGB fanno davvero la loro figura ovunque, che siano usate per illuminare un ambiente o integrate nei modi più svariati. Pensate a quanto possa essere utile poter assegnare colori differenti a porzioni differenti della stessa strip, dando vita a nuovi scenari di utilizzo. Tutto ciò è reso possibile dal WS2812 (o neopixel), vediamo come funziona, come collegarlo ad un ESP8266 e gestirlo mediante Node-RED.
Il led RGB WS2812B
Il led RGB WS2812B è un led RGB intelligente realizzato dalla cinese World Semi che é indirizzabile e quindi configurabile a proprio piacimento, anche in una serie. Ha le seguenti caratteristiche tecniche:
- Connessione: 4 pin
- Tensione di alimentazione : 5 VDC
- Modello chip : WS2811
- Assorbimento : 0.24W
- Contenitore : SMD5050
Il LED è a montaggio superficiale e viene commercializzato su internet in innumerevoli configurazioni: strisce, anelli, matrici, ecc.:
La peculiarità di questi led è che possono essere collegati in serie. Ognuno di essi è indirizzabile e quindi configurabile a proprio piacimento. Questo grazie al chip WS2812B integrato in ogni LED.
La comunicazione tra ogni singolo LED è possibile grazie ai due pin, uno di ingresso ed uno di uscita (DIN e DOUT) presenti per ogni LED:
Colleghiamolo al Wemos D1 mini
Per provare velocemente questo LED con il Wemos D1 mini (ESP8266) ho utilizzato questo fantastico shield (lo puoi comprare su Amazon a questo indirizzo):
Lo shield si connette direttamente al Wemos grazie ai connettori a pettine. Il pin sul quale è collegato il LED è il D2 che corrisponde al GPIO4. La gestione del LED è stata fatta tramite il protocollo MQTT (broker Mosquitto), gestendo la logica e l’interfaccia grafica con Node-RED (ecco come puoi installarlo).
La board Wemos è stata configurata con firmware ESPEasy (leggi il nostro tutorial su come installarlo). Per le prove ho utilizzato la versione Mega ma sicuramente non avrete nessun problema ad utilizzarlo con altre revisioni.
Per la configurazione di Mosquitto e Node Red rimando ai tutorial presenti su questo sito. Stesso discorso anche per la configurazione del firmware ESPEasy.
Partiamo da ESPEasy. Per prima cosa andiamo sulla pagina “Device” e creiamone un nuovo, selezionando come tipologia di device “Output – NeoPixel (Basic)“. Si aprirà la seguente pagina:
Configuriamo il device come indicato nella schermata.
Creiamo il flow su Node-RED
Adesso spostiamoci su Node-RED, ed inseriamo sul nostro flow tre controlli Slider ed un controllo Colour Picker:
Impostiamo per ogni Slider creato il nome del topic e il range da 0 a 255:
Facciamo la stessa cosa per il Verde ed il Blu.
Per adesso tralasciamo il blocco funzione e dedichiamoci al blocco che invia i dati al server MQTT. Editiamolo così:
Pilotiamo il WS2812B con Node-RED
Per dire al nostro LED di accendersi e sopratutto di assumere un determinato colore, dobbiamo inviare/pubblicare un comando preciso al topic “cmd” dell’ESPEasy.
Il comando è il seguente:
Neopixel,<n. led>,<G>,<R>,<B>
Per inviare questo comando ci serviamo del nodo funzione al quale arrivano in ingresso i valori dei tre slider e restituirà in uscita il comando completo dei tre valori selezionati.
Apriamo il blocco funzione ed inseriamo il seguente codice:
if (msg.topic === "red") { global.set("rosso",msg.payload); } if (msg.topic === "green") { global.set("verde",msg.payload); } if (msg.topic === "blue") { global.set("blu",msg.payload); } msg.payload = "Neopixel,1," + global.get("verde") + "," + global.get("rosso") + "," + global.get("blu"); return msg;
Abbiamo utilizzato il metogo global.set per impostare il valore delle variabili e renderle globali. Questo perchè ad ogni modifica degli slider la funzione viene richiamata e quindi una variabile locale perderebbe il suo valore precedente.
Viceversa, il metodo global.get serve per leggere questi valori.
Adesso possiamo provare i nostri slider e verificare con il led sullo shield se funziona:
Discorso un pò più complicato per il “Colour Picker”. Quest’ultimo restituisce una stringa con il seguente formato:
Interpone tra ogni valore una virgola ed uno spazio. A noi servono solo i tre valori numerici, pertanto và fatto un parsing della stringa per estrapolare i tre valori e poi inviarli nel formato GRB richiesto dal comando Neopixel.
Ecco il codice:
var comma = 0; var red ="", green ="", blue=""; for (i=4; i<msg.payload.length-1; i++) { test = msg.payload.substring(i,i+1); if (test != "," && test != " ") { if (comma === 0) { red += test; } if (comma === 1) { green += test; } if (comma === 2) { blue += test; } } else { if (test === " ") { comma++; } } } msg.payload = "Neopixel,1," + green + "," + red + "," + blue; return msg;
A questo punto anche il “Colour Picker” funziona.
Risorse:
Datasheet del WS2812B
Domotica – Primi passi con Node RED – Guida in italiano all’installazione
Flashare il Wemos D1 mini (ESP8266) con il firmware ESPEasy
Impara a configurare il firmware ESPEasy