in Costruisci la tua rete domotica con Esp8266 e Raspberry Pi, Progetti

Costruisci la tua rete domotica con Esp8266 e Raspberry Pi – Implementazione dell’attuatore: lampada smart RGB

In questo articolo andremo ad illustrare l’idea progettuale di un attuatore capace di dialogare con la rete domotica esposta negli articoli precedenti. In particolare, si è scelto di utilizzare come attuatore una lampada smart, in modo tale da rendere quanto più evidente e semplice possibile il risultato ottenuto.

Questa serie di articoli infatti hanno lo scopo di esporre e illustrare le metodologie usate per realizzare questa rete domotica, con lo scopo di fornire le basi per essere realizzate da chiunque, ovunque, e con pochissime risorse, strizzando un occhio al risparmio.

Sulla base di come si è realizzato il nodo sensore in questo articolo e di come funziona la logica del nodo mediatore discussa in quest’altro articolo, dovremmo avere già una buona struttura sulla quale progettare la lampada smart.

L’idea è quindi quella di effettuare misurazioni continue di temperatura con il nodo sensore, inoltrarle al mediatore che avrà il compito di indirizzarle all’attuatore, in questo caso la lampada RGB. Le informazioni inoltrate dal mediatore e ricevute dall’attuatore sono codificate, per semplicità, con valori numerici in un range da 0 a 5, mappando valori di temperatura che vanno da 0° C a oltre 30° C. Ad ogni valore verrà associato un colore che notificherà in maniera chiara e univoca lo stato della temperatura. Ad esempio se vengono rilevati 35° C, la lampada assumerà una colorazione di rosso acceso. Nell’intorno dei 20° C, valori di temperatura ideali per un’abitazione, la lampada si colorerà di verde. Per valori di temperatura bassi, come 15° C ad esempio, la lampada si colorerà di blu.

Per la comunicazione wireless si userà il fidato ESP8266, qui ampiamente discusso. Per la lampada RGB si utilizzerà una matrice led RGB 8*8 da 64 led modello WS2812B.

Matrice led RGB 8*8 da 64 led modello WS2812B

Di fondamentale importanza è andare ad analizzare le caratteristiche di questa matrice.

Di dimensione 65 x 65 mm, questa tipologia di matrice led permette di concatenarsi per poter alimentarne e programmarne insieme una lunga fila.

Le specifiche elettriche prevedono un alimentazione a 5 Volt. La corrente richiesta in generale dipende dal tipo e numero di led integrati, e dalla loro disposizione. Un singolo LED RGB contiene 3 LED (rosso, verde e blu). Un singolo LED assorbe circa 20 mA di corrente alla massima luminosità, quindi un singolo LED RGB può assorbire 3 x 20 mA = 60 mA alla massima luminosità – bianco. Nel caso di una matrice led RGB da 64 led avremo quindi 64 x 60 mA = 3840 mA (3,84 A) con tutti i LED alla luminosità massima (Colore bianco). Sarebbe consigliabile non utilizzare la luminosità massima, soprattutto per periodi molto prolungati di attività, per aumentare la durata dei singoli led. Ad esempio, con una luminosità al 50%, l’assorbimento in termini di corrente sarà di 3,84 A x 0,5 = 1,92 A. In questo caso, un comune alimentatore da 5V / 2A sarebbe l’ideale.

La matrice avrà dunque bisogno di due pin per l’alimentazione (Vcc e GND) oltre che un singolo connettore per i dati.

Volendo controllare direttamente la matrice con l’ESP8266, bisogna considerare che essa ha una logica a 5V mentre il modulo wifi lavora a 3,3V. Per risolvere il problema è possibile utilizzare un level shifter come questo della Adafruit.

Level Shifter a 4 canali

Per l’alimentazione, in fase prototipale, può essere comodo utilizzare un modulo power supply per breadboard come MB102. Esso è in fatti in grado di accettare in ingresso connettori USB tipo A oppure jack oltre che diversi range di tensioni e correnti, fornendo sulle specifiche piste d’alimentazione della breadboard 3,3V , 5V o entrambe. Inoltre è abbastanza comune e diffuso in molti kit di Arduino.

Modulo power supply per breadboard MB102

Esposti gli elementi che andranno a comporre il dispositivo in fase prototipale, vengono realizzati i collegamenti come nello schematico nella seguente figura.

Schema circuitale
Schema circuitale

Da notare che è stato inserito il modulo FTD232R, necessario nella fase di caricamento del firmware e di debug e test. Una volta assicurato il funzionamento del codice caricato, può essere semplicemente rimosso o comunque non più considerato. Si ricorda che le varie connessioni e accortezze da adottare nel caricamento del firmware sull’ESP8266 sono state già trattate in questo articolo.

La parte di codice risulta essere a primo impatto complessa, ma altro non è se non una riproposizione adattata del codice usato per il sensore di temperatura, consultabile e scaricabile sempre in questo articolo.

In particolare, la struttura che gestisce la connessione Wi-Fi e MQTT risulta essere praticamente la stessa. Ciò che cambia è essenzialmente la dichiarazione del ruolo dell’attuatore come Subscriber. Per questo ruolo è necessario implementare una funzione di Callback, di seguito proposta.

void mqtt_callback(const MQTT::Publish& pub)     // Lo scopo è quello di informare l'applicazione superiore delle attività che si verificano
{
  Serial.println("Ricevuto:");     //può essere omesso
  set =  pub.payload_string().toInt();  
  // Serial.println(set);     // debug print
}

Per il controllo della matrice led RGB si utilizza la libreria FastLED, reperibile direttamente dal gestore librerie dell’IDE di Arduino. Essa permette di controllare diversi dispositivi led in maniera semplice con ottimi risultati.

Una volta inclusa la libreria, sarà necessario indicare il numero di led della matrice e il pin dell’ESP8266 per pilotarla. Successivamente si istanza l’oggetto CRGB leds contenente il numero di led indicato precedentemente e si crea un vettore di interi utile per gestire i tre valori R, G e B.

#include<FastLED.h>

#define NUM_LEDS 64
#define DATA_PIN 2
CRGB leds[NUM_LEDS];
int colore[3];

Nel setup() si indica il modello della matrice, la tipologia colore e si inoltra il primo comando, ovvero quello di mantenerla totalmente spenta durante l’avvio. In questo modo ci si assicura di non avere spiacevoli sfarfallii durante i secondi iniziali.

  FastLED.addLeds<WS2812B, DATA_PIN, GRB>(leds, NUM_LEDS);
  for (int Led = 0; Led < NUM_LEDS; Led = Led + 1) {
    colore[0] = 0;
    colore[1] = 0;
    colore[2] = 0;
    leds[Led].setRGB( colore[0], colore[1], colore[2]);
    FastLED.show();
  }

Il for() è necessario per permettere al comando di scansionare ogni led della matrice. Questa funzione sarà utilizzata ampiamente in seguito per inoltrare i colori alla matrice.

Per interpretare il dato ricevuto e poter pilotare di conseguenza la matrice RGB si utilizza uno switch/case all’interno della funzione loop().

switch (set) {
      case 0:
        for (int Led = 0; Led < NUM_LEDS; Led = Led + 1) {
          colore[0] = 255;
          colore[1] = 255;
          colore[2] = 255;
          leds[Led].setRGB( colore[0], colore[1], colore[2]);
          FastLED.show();
        }
        break;

      case 1:
        for (int Led = 0; Led < NUM_LEDS; Led = Led + 1) {
          colore[0] = 0;
          colore[1] = 0;
          colore[2] = 255;
          leds[Led].setRGB( colore[0], colore[1], colore[2]);
          FastLED.show();
        }
        break;

      case 2:
        for (int Led = 0; Led < NUM_LEDS; Led = Led + 1) {
          colore[0] = 0;
          colore[1] = 150;
          colore[2] = 255;
          leds[Led].setRGB( colore[0], colore[1], colore[2]);
          FastLED.show();
        }
        break;

      case 3:
        for (int Led = 0; Led < NUM_LEDS; Led = Led + 1) {
          colore[0] = 0;
          colore[1] = 255;
          colore[2] = 0;
          leds[Led].setRGB( colore[0], colore[1], colore[2]);
          FastLED.show();
        }
        break;

      case 4:
        for (int Led = 0; Led < NUM_LEDS; Led = Led + 1) {
          colore[0] = 255;
          colore[1] = 255;
          colore[2] = 0;
          leds[Led].setRGB( colore[0], colore[1], colore[2]);
          FastLED.show();
        }
        break;

      case 5:
        for (int Led = 0; Led < NUM_LEDS; Led = Led + 1) {
          colore[0] = 255;
          colore[1] = 0;
          colore[2] = 0;
          leds[Led].setRGB( colore[0], colore[1], colore[2]);
          FastLED.show();
        }
        break;

      case 6:
        for (int Led = 0; Led < NUM_LEDS; Led = Led + 1) {
          colore[0] = 0;
          colore[1] = 0;
          colore[2] = 0;
          leds[Led].setRGB( colore[0], colore[1], colore[2]);
          FastLED.show();
        }
        Serial.println("In attesa / spento");
        break;

      default:
        for (int Led = 0; Led < NUM_LEDS; Led = Led + 1) {
          colore[0] = 0;
          colore[1] = 0;
          colore[2] = 0;
          leds[Led].setRGB( colore[0], colore[1], colore[2]);
          FastLED.show();
        }
        Serial.print("Out of case");
break; }

Oltre ai casi menzionati precedentemente, è stato implementato un sesto per permettere di spegnere totalmente la lampada e un caso definito default che sarebbe buona norma integrare sempre in uno switch/case: in tal modo, se nessuno dei casi precedenti è verificato, si ricade in quello di default che può essere impostato a piacere. Nel caso in esame, si è scelto di mantenere tutto spento ma ciò non toglie che si possa indicare alla lampada di mantenere l’ultima tonalità assunta o altro ancora.

Ovviamente anche la scelta dei colori associati è assolutamente arbitraria e può essere gestita in maniera del tutto personale.

L’intero sketch è disponibile al download qui.

Per questo articolo è tutto.

Per dubbi, errori o semplicemente ringraziamenti, puoi contattarci attraverso i nostri contatti social.

Scrivi un commento

Commento