ESP8266 e Alexa controllano neopixels ws2812B

ESP8266 e Alexa controllano neopixels ws2812B ti mostra come usare Alexa per controllare dei dispositivi DIY

ESP8266 e Alexa controllano neopixels ws2812B.

Usi delle luci led a strip di tipo neopixel WS2812B come esempio iniziale e puoi estendere il controllo a tutti i tuoi dispositivi DIY.

In pratica potrai realizzare dei dispositivi di tua invenzione e controllarli con Alexa.

Il primo esperimento che leggi in questo articolo lo potrai realizzare velocemente usando la libreria espalexa di aircoockie.

Grazie al lavoro di Aircoockie realizzare un dispositivo su ESP8266, in questo esempio userai una WeMos, sarà facile ed intuitivo.

Video esempio ESP8266 e Alexa controllano neopixels ws2812B

Il video del progetto ti mostra come, con la mia voce, ho attivato sia i tre giochi di luce presenti nello sketch, sia controllato la loro luminosità:

Puoi creare molti più giochi ed effetti se lo desideri e puoi cambiare per ciascuno l’intensità della luminosità.

La libreria espalexa di Aircoockie

Il primo passo per usarla è caricarla nell’IDE arduino.

Puoi usare il Gestore Librerie presente nell’IDE Arduino in quanto la libreria è presente tra quelle installabili con tale strumento:

ESP8266 Alexa show library espalexa

come nell’esempio ti basta cercare Alexa nel campo di ricerca in alto a destra e vedrai elencate le librerie che puoi utilizzare.

In questo primo esempio userai la espalexa, in futuro proverai anche la FaxumoESP, e vedrai le differenze sia nell’approccio alla realizzazione dello sketch sia nel metodo per farsi riconoscere da Alexa.

L’installazione sai già come eseguirla, se necessiti di istruzioni specifiche ti consiglio la lettura del mio corso arduino gratuito on-line.

Una volta installato troverai tra gli esempi presenti nell’Arduino IDE i nuovi aggiunti dalla libreria espalexa:

ESP8266 Alexa espalexa examples

partendo come sempre da un esempio Basic svilupperai il progetto che ha visto in funzione nel video.

ESP8266 e Alexa controllano neopixels ws2812B

Dopo aver caricato la libreria passa alla realizzazione del progetto ESP8266 e Alexa controllano neopixels ws2812B.

Come vedi dalla foto il collegamento è davvero semplice, non ho realizzato uno schema, trattandosi di soli 3 pin di connessione di cui due per l’alimentazione:

ESP8266 e Alexa controllano neopixels ws2812B.

Lo sketch necessita di delucidazioni più approfondite perché ti possa essere facile comprenderlo ed adattarlo al tuo progetto ESP8266 e Alexa controllano neopixels ws2812B.

Lo sketch

Partendo dall’esempio espalexaBasic e leggendo la documentazione che trovi sul gitHub dell’autore potrai realizzare gran parte dei progetti con Alexa, ESP8266, WS2812B, ecc…

/*
   This is a basic example on how to use Espalexa and its device declaration methods.
*/
#ifdef ARDUINO_ARCH_ESP32
#include <WiFi.h>
#else
#include <ESP8266WiFi.h>
#endif
#include <Espalexa.h>
#include <Adafruit_NeoPixel.h>

#define PIN            2
#define NUMPIXELS      27

// prototypes
boolean connectWifi();

//callback functions
void firstLightChanged(uint8_t brightness);
void secondLightChanged(uint8_t brightness);
void thirdLightChanged(uint8_t brightness);

// Change this!!
const char* ssid = "[il tuo SSID]";
const char* password = "[la password dell'SSID]";

boolean wifiConnected = false;

Espalexa espalexa;

EspalexaDevice* device3; //this is optional

Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);

void setup()
{
  Serial.begin(115200);
  // Initialise wifi connection
  wifiConnected = connectWifi();

  if (wifiConnected) {

    // Define your devices here.
    espalexa.addDevice("Luce Uno", firstLightChanged, 0); //simplest definition, default state off
    espalexa.addDevice("Luce Due", secondLightChanged, 0); //third parameter is beginning state (here fully off)

    device3 = new EspalexaDevice("Luce Tre", thirdLightChanged); //you can also create the Device objects yourself like here
    espalexa.addDevice(device3); //and then add them
    device3->setValue(0); //this allows you to e.g. update their state value at any time!

    espalexa.begin();

    pixels.begin();
    pixels.setBrightness(255);
    for(int i=0;i<NUMPIXELS;i++){
      pixels.setPixelColor(i, pixels.Color(255,255,255));
      pixels.show();
      delay(5);
    }
    for(int i=0;i<NUMPIXELS;i++){
      pixels.setPixelColor(i, pixels.Color(0,0,0));
      pixels.show();
      delay(10);
    }

  } else
  {
    while (1) {
      Serial.println("Cannot connect to WiFi. Please check data and reset the ESP.");
      delay(2500);
    }
  }
}

void loop()
{
  espalexa.loop();
  delay(1);
}

//our callback functions
void firstLightChanged(uint8_t brightness) {
  Serial.print("Device 1 changed to ");

  if (brightness) {
    Serial.print("ON, brightness ");
    Serial.println(brightness);
    goColor( pixels.Color(brightness,brightness,brightness) );
  }
  else  {
    Serial.println("OFF");
    goColor( pixels.Color(0,0,0) );
  }
}

void secondLightChanged(uint8_t brightness) {
  if (brightness) {
    Serial.print("ON, brightness ");
    Serial.println(brightness);
    fadeColor( pixels.Color(255,120,0),brightness );
  }
  else  {
    Serial.println("OFF");
    goColor( pixels.Color(0,0,0) );
  }
}

void thirdLightChanged(uint8_t brightness) {
  if (brightness) {
    Serial.print("ON, brightness ");
    Serial.println(brightness);
    fadeColor( pixels.Color(255,8,127),brightness );
  }
  else  {
    Serial.println("OFF");
    goColor( pixels.Color(0,0,0) );
  }
}

void goColor(uint32_t c) {
  for(int i=0;i<NUMPIXELS;i++){
    pixels.setPixelColor(i, c);
    pixels.show();
    delay(20);
  }  
}

void fadeColor(uint32_t c, byte b) {
  
  for(byte i=0;i<NUMPIXELS;i++) { pixels.setPixelColor(i, c); pixels.show(); }
  pixels.setBrightness(b); 
  pixels.show();
}


// connect to wifi – returns true if successful or false if not
boolean connectWifi() {
  boolean state = true;
  int i = 0;

  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  Serial.println("");
  Serial.println("Connecting to WiFi");

  // Wait for connection
  Serial.print("Connecting...");
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
    if (i > 20) {
      state = false; break;
    }
    i++;
  }
  Serial.println("");
  if (state) {
    Serial.print("Connected to ");
    Serial.println(ssid);
    Serial.print("IP address: ");
    Serial.println(WiFi.localIP());
  }
  else {
    Serial.println("Connection failed.");
  }
  return state;
}

Lo sketch è adatto sia all’ESP8266 sia all’ESP32, come vedi sin dalle prime linee, in cui riconosce quale sia l’architettura su cui sarà caricato e include la libreria per il WiFI corrispondente;

linee 009-010: includi le librerie espalexa e adafruit_neopixel su cui ci sono poche spiegazioni da dare;

linee 012-013: imposta i due valori relativi al pin a cui hai connesso i WS2812B ed il numero di questi ultimi;

linea 016: crea una funzione booleana che chiami connectWifi() e che definirai alla linea 137;

linee 019-021: crea tre funzioni di tipo void:

  • firstLightChanged()
  • secondLightChanged()
  • thirdLightChanged()

che sono definite alle linee 082-118;

linee 024-025: definisci le variabili con le credenziali di connessione WiFi;

linea 027: imposta la variabile booleana wifiConnected a false, la userai per determinare se la connessione WiFi è ancora attiva;

linee 029-031: imposta l’istanza espalexa con cui ti interfacci alla libreria ed il numero di device che vuoi sia reso disponibile ad Alexa. In questo esempio simuli la presenza di 3 device;

linea 033: definisci l’istanza per il controllo dei led;

nella funzione setup esegui la connessione al wifi e quando questa è avvenuta esegui la definizione dei device:

if (wifiConnected) {

    // Define your devices here.
    espalexa.addDevice("Luce Uno", firstLightChanged, 0); //simplest definition, default state off
    espalexa.addDevice("Luce Due", secondLightChanged, 0); //third parameter is beginning state (here fully off)

    device3 = new EspalexaDevice("Luce Tre", thirdLightChanged); //you can also create the Device objects yourself like here
    espalexa.addDevice(device3); //and then add them
    device3->setValue(0); //this allows you to e.g. update their state value at any time!

    espalexa.begin();

per definire i device puoi utilizzare due metodi distinti, come spiegato dall’autore della libreria:

  • il metodo addDevice, linea 044 o 045, a cui passi come parametri:
    • nome del device
    • funzione di callback da chiamare per questo device
    • valore di stato iniziale del device
  • definire un device ( device3 ), linee 047-049, come new EspalexaDevice a cui passi:
    • nome del device
    • funzione di callback da chiamare per questo device

Il secondo metodo richiede che il nuovo device3 sia aggiunto con il metodo AddDevice ed il valore di stato iniziale impostato con il metodo setValue([valore]) direttamente sul device3;

linea 051: usa il metodo begin() della libreria espalexa per attivare le configurazioni appena eseguite;

void loop()
{
  espalexa.loop();
  delay(1);
}

La funzione loop() è davvero semplice in quanto rimanda tutte le attività alle funzioni di callback che seguono.

Alle linee 81-94 definisci la funzione firstLightChanged():

//our callback functions
void firstLightChanged(uint8_t brightness) {
  Serial.print("Device 1 changed to ");
 
  if (brightness) {
    Serial.print("ON, brightness ");
    Serial.println(brightness);
    goColor( pixels.Color(brightness,brightness,brightness) );
  }
  else  {
    Serial.println("OFF");
    goColor( pixels.Color(0,0,0) );
  }
}

che alla linea 085 controlla se il valore di brightness sia definito;

linee 086-087: scrive sil monitor seriale il valore ricevuto oltre al messaggio “ON, brightness”;

linea 088: richiama la funzione goColor passandole come colore il risultato del metodo Color(R,G,B) della libreria Adafruit_Neopixel. Poichè i tre valori sono identici avrai un bianco a diverse intesità;

linee 091-092: eseguono le stesse operazioni delle precedenti descritte ma scrivendo “Off” nel monitor seriale e portando a 0,0,0 il colore dei led, di fatto spenge la striscia di led;

linee 096-118: definisci le altre due funzioni di callback che, come per la prima appena descritta, applicano il secondo ed il terzo effetto alla striscia led usando la funzione fadeColor() invece della goColor();

void goColor(uint32_t c) {
  for(int i=0;i<NUMPIXELS;i++){
    pixels.setPixelColor(i, c);
    pixels.show();
    delay(20);
  }  
}

linea 120: definisci la funzione goColor();

linea 121: esegui un ciclo for da 0 fino al numero di led definito e per sciascuno esegui le linee successive;

linee 122-123: applica ad ogni led il valore colore che ti è stato indicato ( uint32_t c );

linea 124: per ciascun led attendi 20 millisecondi prima di passare al led successivo;

void fadeColor(uint32_t c, byte b) {
   
  for(byte i=0;i<NUMPIXELS;i++) { pixels.setPixelColor(i, c); pixels.show(); }
  pixels.setBrightness(b); 
  pixels.show();
}

linea 128: definisci la funzione fadeColor() richiamata dal secondo e terzo effetto luminoso o device se lo consideri come Alexa;

linea 130: con un ciclo for imposta tutti i led al colore passato alla funzione;

linee 131-132: imposta la luminosità definita nella variabile (byte b) e applica alla striscia led;

Alle linee 136-167 definisci la funzione connectWiFi():

// connect to wifi – returns true if successful or false if not
boolean connectWifi() {
  boolean state = true;
  int i = 0;
 
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  Serial.println("");
  Serial.println("Connecting to WiFi");
 
  // Wait for connection
  Serial.print("Connecting...");
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
    if (i > 20) {
      state = false; break;
    }
    i++;
  }
  Serial.println("");
  if (state) {
    Serial.print("Connected to ");
    Serial.println(ssid);
    Serial.print("IP address: ");
    Serial.println(WiFi.localIP());
  }
  else {
    Serial.println("Connection failed.");
  }
  return state;
}

che ha il compito di eseguire la connessione wifi sia al primo avvio sia ad ogni successivo controllo da parte della libreria espalexa usata nel progetto esp8266 e alexa controllano neopixels ws2812B.

Collegamento con Alexa

Ora che il tuo device, o meglio sarebbe dire, i tuoi nuovi devices, sono configurati sulla WeMos è il momento di aprire il monitor seriale e controllare che la connessione wifi sia eseguita in modo corretto.

Successivamente puoi aprire nel tuo browser l’url: https://alexa.amazon.it/ e andare alla voce “Casa Intelligente” e successivamente cliccare su “Dispositivi” ed avviare la ricerca di nuovi dispositivi.

Al termine della ricerca, vedrai una schermata simile alla seguente:

ESP8266 Alexa devices

in cui i dispositivi di tipo Royal Philips Electronics smart device denominati:

  • Luce Uno
  • Luce Due
  • Luce Tre

sono i tre dispositivi che hai configurato sulla WeMos ed a cui potrai impartire comandi vocali come nel video:

Se osservi il monitor seriale dopo aver impartito alcuni dei comandi del video vedrai un tracciato simile al seguente:

ESP8266 Alexa serial monitor output

In cui per ciascuna linea trovi il numero del device, l’informazione in merito al cambio di stato da ON ad OFF e viceversa e la luminosità in 2^8 ( 255 valori ).

Ora sai come puoi creare i tuoi device personalizzati con Alexa.

  • Questo sito ed i suoi contenuti è fornito "così com'è" e Mauro Alfieri non rilascia alcuna dichiarazione o garanzia di alcun tipo, esplicita o implicita, riguardo alla completezza, accuratezza, affidabilità, idoneità o disponibilità del sito o delle informazioni, prodotti, servizi o grafiche correlate contenute sul sito per qualsiasi scopo.
  • Ti chiedo di leggere e rispettare il regolamento del sito prima di utilizzarlo
  • Ti chiedo di leggere i Termini e Condizioni d'uso del sito prima di utilizzarlo
  • In qualità di Affiliato Amazon io ricevo un guadagno dagli acquisti idonei qualora siano presenti link al suddetto sito.

Permalink link a questo articolo: https://www.mauroalfieri.it/elettronica/esp8266-e-alexa-controllano-neopixels-ws2812b.html

6 commenti

Vai al modulo dei commenti

    • rudy il 4 Novembre 2020 alle 10:32
    • Rispondi

    Ciao Mauro , ho seguito passo per passo tutto ma non riesco a trovare in Alexa i tre device.

    1. Ciao Ruby,
      controlla che la libreria sia aggiornata per funzionare con Alexa.
      Potrebbe essere necessario usare una libreria più aggiornata perchè ci sono variazioni lato Alexa.

    • Marco Caldara il 8 Dicembre 2020 alle 09:56
    • Rispondi

    ciao e complimenti x il tuo Blog…
    volevo realizzare una striscia led comandata da alexa (praticamente identica alla tua) ma non riesco in nessun modo a far riconoscere il dispositivo ad alexa
    wemos D1 connesso alla rete wifi
    sketch compilato e caricato correttamente senza errori
    puo’ essere un problema di libreria?
    ho installato le ultime versioni di espalexa

    1. Ciao Marco,
      è da un po’ che non provo a modificare il mio progetto e potrebbe essere cambiato qualcosa nelle librerie da allora, prova a verificare nella documentazione della libreria se hai eseguito tutti i passaggi necessari o se ci siano delle modifiche di impostazioni da eseguire.

    • Jacques il 1 Febbraio 2021 alle 09:16
    • Rispondi

    Buongiorno Mauro,
    ho apprezzato molto la sua guida siccome è proprio quello che vorrei fare con Arduino mkr 1010 wifi, ovvero comandare una striscia led ARGB. Ho seguito passo passo, sono nuovo in questo splendido mondo di arduino, e volevo sapere come potevo fare ad usare il mio modulo al posto del wemos d1 siccome non utilizzandolo mi restituisce gli errori del esp2866.
    Grazie mille

    1. Ciao Jacques,
      ho pubblicato da poco un articolo che sfrutta un servizio gratuito connesso ad una skill Alexa che potrebbe agevolare il tuo progetto.
      Hai provato a verificare che tra i codici rilasciati dall’autore della libreria ce ne sia qualcuno già pronto per l’MKR1010 Wifi ?

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.