Arduino IoT Cloud neopixel sketch

L’arduino IoT Cloud neopixel sketch riprende l’articolo che hai letto qualche giorno fa in merito ad un progetto test che puoi realizzare con il cloud IoT messo a disposizione, gratuitamente, da Arduino.

Arduino IoT cloud sketch

Come hai letto nel precedente articolo il Team Arduino ti offre la possibilità di usare gratuitamente l’IoT Cloud, per i tuoi esperimenti.

Inoltre l’IoT Cloud è in grado di scrivere per te tutta la parte di codice relativa allo scambio di informazioni tra il tuo device ed il cloud stesso e lasciandoti libero di concentrati solo sul codice specifico del progetto.

Limiti della licenza Free

La licenza free, ossia quella a cui puoi accedere semplicemente registrandoti al cloud stesso, ha i seguenti limiti:

arduino iot clod limits

  • 2 Things contemporanei: i thins sono i progetti veri e propri;
  • Nessun limite sulle dashboard che puoi realizzare;
  • 100Mb di spazio per salvare i tuoi sketch;
  • 1 giorno di conservazione dei dati;
  • 200 secondi al giorno di tempo di compilazione;

Mi concentro sul primo e l’ultimo punto in quanto posso sembrare un limite che ti spinge a desistere dall’uso del cloud per i tuoi progetti.

2 Things contemporanei

Non costituisce un vero limite in quanto puoi eliminare i things dei progetti che non desideri più utilizzare quando vuoi e/o sostituirli con degli altri.

Ricorda che è un servizio del tutto gratuito e che non presenta limiti al numero di device che desideri collegare.

e con soli 1,99€ al mese, rinunciando a meno di due caffè, puoi arrivare ad avere 10 progetti in contemporanea.

200 secondi al giorno di tempo di compilazione

Il tempo di compilazione, trattandosi di un cloud, come probabilmente sai è legato all’utilizzo delle cpu messe a disposizione dal cloud stesso.

In pratica: uno dei parametri che dovrai considerare quando acquisti un cloud è il tempo di cpu che usi, spesso bastano pochi secondi, come nel caso dell’Arduino IoT Cloud per compilare il tuo sketch.

200/60 = 3,3333333

circa 3 ore e 1/2 di compilazione in un giorno, questo significa dedicare al tuo progetto moltissimo tempo, in quanto la compilazione è solo una piccola parte della realizzazione dello sketch e del test.

Inoltre se lo esaurisci, un giorno, basta attendere il giorno dopo.

Anche in questo caso, sempre per meno di due caffé al mese, puoi rendere illimitato questo tempo.

Demo del progetto

Ho realizzato un breve video in cui puoi vedere il funzionamento del progetto:

In cui avrai notato come la risposta da parte del device ai comandi impartiti sulla dashboard è alquanto rapida.

Passiamo allo sketch vero e proprio del progetto:

Arduino IoT Cloud neopixel sketch

Analizziamo insieme lo sketch, che hai letto nel precedente articolo:

/* 
  Sketch generated by the Arduino IoT Cloud Thing "Untitled"
  https://create.arduino.cc/cloud/things/af0bf717-1239-40dc-aeb5-c7794c284ee0 
 
  Arduino IoT Cloud Variables description
 
  The following variables are automatically generated and updated when changes are made to the Thing
 
  CloudColoredLight ledRGB;
 
  Variables which are marked as READ/WRITE in the Cloud Thing will also have functions
  which are called when their values are changed from the Dashboard.
  These functions are generated with the Thing and added at the end of this sketch.
*/
 
#include "thingProperties.h"
#include <FastLED.h>
  
#define LED_PIN     2
#define NUM_LEDS    1
#define BRIGHTNESS  64
#define LED_TYPE    WS2811
#define COLOR_ORDER GRB
#define UPDATES_PER_SECOND 100
  
CRGB leds[NUM_LEDS];
 
byte rgb[3];
int  hsv[3];
 
const byte dim_curve[] = {
    0,   1,   1,   2,   2,   2,   2,   2,   2,   3,   3,   3,   3,   3,   3,   3,
    3,   3,   3,   3,   3,   3,   3,   4,   4,   4,   4,   4,   4,   4,   4,   4,
    4,   4,   4,   5,   5,   5,   5,   5,   5,   5,   5,   5,   5,   6,   6,   6,
    6,   6,   6,   6,   6,   7,   7,   7,   7,   7,   7,   7,   8,   8,   8,   8,
    8,   8,   9,   9,   9,   9,   9,   9,   10,  10,  10,  10,  10,  11,  11,  11,
    11,  11,  12,  12,  12,  12,  12,  13,  13,  13,  13,  14,  14,  14,  14,  15,
    15,  15,  16,  16,  16,  16,  17,  17,  17,  18,  18,  18,  19,  19,  19,  20,
    20,  20,  21,  21,  22,  22,  22,  23,  23,  24,  24,  25,  25,  25,  26,  26,
    27,  27,  28,  28,  29,  29,  30,  30,  31,  32,  32,  33,  33,  34,  35,  35,
    36,  36,  37,  38,  38,  39,  40,  40,  41,  42,  43,  43,  44,  45,  46,  47,
    48,  48,  49,  50,  51,  52,  53,  54,  55,  56,  57,  58,  59,  60,  61,  62,
    63,  64,  65,  66,  68,  69,  70,  71,  73,  74,  75,  76,  78,  79,  81,  82,
    83,  85,  86,  88,  90,  91,  93,  94,  96,  98,  99,  101, 103, 105, 107, 109,
    110, 112, 114, 116, 118, 121, 123, 125, 127, 129, 132, 134, 136, 139, 141, 144,
    146, 149, 151, 154, 157, 159, 162, 165, 168, 171, 174, 177, 180, 183, 186, 190,
    193, 196, 200, 203, 207, 211, 214, 218, 222, 226, 230, 234, 238, 242, 248, 255,
};
 
void setup() {
  // Initialize serial and wait for port to open:
  Serial.begin(9600);
  // This delay gives the chance to wait for a Serial Monitor without blocking if none is found
  delay(1500); 
 
  // Defined in thingProperties.h
  initProperties();
 
  // Connect to Arduino IoT Cloud
  ArduinoCloud.begin(ArduinoIoTPreferredConnection);
   
  /*
     The following function allows you to obtain more information
     related to the state of network and IoT Cloud connection and errors
     the higher number the more granular information you’ll get.
     The default is 0 (only errors).
     Maximum is 4
 */
  setDebugMessageLevel(2);
  ArduinoCloud.printDebugInfo();
   
  FastLED.addLeds<LED_TYPE, LED_PIN, COLOR_ORDER>(leds, NUM_LEDS).setCorrection( TypicalLEDStrip );
  FastLED.setBrightness(  BRIGHTNESS );
  leds[0] = CRGB(0,255, 0);  FastLED.show(); delay(500);
  leds[0] = CRGB(246,232, 0); FastLED.show(); delay(500);
  leds[0] = CRGB(255, 144, 0); FastLED.show(); delay(500);
  leds[0] = CRGB(255, 0, 0); FastLED.show(); delay(500);
 
  leds[0] = CRGB(0, 0, 0);     FastLED.show(); delay(500);
   
}
 
void loop() {
  ArduinoCloud.update();
  // Your code here 
   
}
 
/*
  Since LedRGB is READ_WRITE variable, onLedRGBChange() is
  executed every time a new value is received from IoT Cloud.
*/
void onLedRGBChange()  {
  // Add your code here to act upon LedRGB change
  hsv[0] = ledRGB.getHue();
  hsv[1] = ledRGB.getSaturation();
  hsv[2] = ledRGB.getBrightness();
  byte swt = ledRGB.getSwitch();
   
  Serial.print("Hue: "); Serial.println(hsv[0]);
  Serial.print("Sat: "); Serial.println(hsv[1]);
  Serial.print("Bri: "); Serial.println(hsv[2]);
  Serial.print("Swt: "); Serial.println(swt);
  if (swt) {
    HSVtoRGB(hsv,rgb); 
  } else {
    rgb[0] = 0;
    rgb[1] = 0;
    rgb[2] = 0;
  }
  Serial.print("R: "); Serial.println(rgb[0]);
  Serial.print("G: "); Serial.println(rgb[1]);
  Serial.print("B: "); Serial.println(rgb[2]);
  leds[0] = CRGB(rgb[0],rgb[1],rgb[2]);
  FastLED.show();
  delay(10);
}
 
void HSVtoRGB(int hsv[], byte rgb[]) { 
  /* convert hue, saturation and brightness ( HSB/HSV ) to RGB
     The dim_curve is used only on brightness/value and on saturation (inverted).
     This looks the most natural.      
  */
  hsv[2] = dim_curve[hsv[2]];
  hsv[1] = 255-dim_curve[255-hsv[1]];
 
  int r; int g; int b; int base;
 
  if (hsv[1] == 0) { // Acromatic color (gray). Hue doesn't mind.
    rgb[0]=hsv[2]; rgb[1]=hsv[2]; rgb[2]=hsv[2];  
  } else  { 
    base = ((255 - hsv[1]) * hsv[2])>>8;
 
    switch(hsv[0]/60) {
    case 0:
        r = hsv[2];
        g = (((hsv[2]-base)*hsv[0])/60)+base;
        b = base;
    break;
 
    case 1:
        r = (((hsv[2]-base)*(60-(hsv[0]%60)))/60)+base;
        g = hsv[2];
        b = base;
    break;
 
    case 2:
        r = base;
        g = hsv[2];
        b = (((hsv[2]-base)*(hsv[0]%60))/60)+base;
    break;
 
    case 3:
        r = base;
        g = (((hsv[2]-base)*(60-(hsv[0]%60)))/60)+base;
        b = hsv[2];
    break;
 
    case 4:
        r = (((hsv[2]-base)*(hsv[0]%60))/60)+base;
        g = base;
        b = hsv[2];
    break;
 
    case 5:
        r = hsv[2];
        g = base;
        b = (((hsv[2]-base)*(60-(hsv[0]%60)))/60)+base;
    break;
    }
 
    rgb[0]=r;
    rgb[1]=g;
    rgb[2]=b; 
  }   
}

come hai letto sopra gran parte dello sketch è generato automaticamente dall’Arduino Cloud.

Noi ci concentreremo sulle parti aggiunte per il controllo del led neopixel connesso al pin 2 della Arduino Nano IoT BLE.

La linea 017: include la libreria FastLed che userai per il controllo del led;

linee 019-024: ti permettono di definire tutti i parametri relativi al neopixel:

  • il pin a cui è connesso;
  • il numero di led che desideri controllare;
  • la luminosità iniziale, potrai cambiarla nel corso dello sketch se vuoi;
  • la tipologia di led;
  • il color order;

il numero di update possibili in un secondo;

sono tutti valori che avrai certamente riconosciuto se hai letto i miei altri articoli dedicati ai neopixel, o se hai già sviluppato progetti con questa tipologia di led.

linea 026: definisci la matrice di tipo CG^RGB che utilizzerai per indirizzare il colore voluto sul led;

linee 028-048: servono a definire variabili e matrici per la conversione dai valori HSB ad RGB.

Per quanto possibile in questo articolo ti spiegherò parte dell’algoritmo, senza addentrarmi nella complessa matrice definita alla linea 031 e che risulta fondamentale per la conversione.

Le linee 050-070: sono state scritte dall’Arduino Cloud e non devono essere modificate, nel tuo caso dovrai farle generare al IoT Cloud per il tuo device e la tua connessione WiFi;

linea 072: imposti l’istanza FastLED in modo da poterle impartire i comandi di controllo e inviare al led i valori desiderati;

linea 073: imposti la luminosità comedefinita alla line 021;

linee 074-079: fai un primo giro di test colori sul led (0), nel mio caso l’unico, per controllare che tutto funzioni, poi spegni il led alla line 079;

Funzione Loop()

La funzione Loop è scritta dal Cloud in modo automatico e puoi lasciarla così in questo esempio.

La funzione che andrai a modificare è la onLedRGBChange();

Funzione onLedRGBChange

Questa funzione sarà creata dal generatore di codice Arduino in funzione della tipologia di variabile che avrai definito sul cloud, se non ricordi come si fa puoi leggere il mio precedente articolo.

In cui hai visto come definire una variabile per il tuo Thing:

Arduino IoT neopixel project variable defined

denominata ledRGB e con Update Policy: On Change.

Queste impostazioni dicono al generatore di codice arduino di creare una funzione all’interno del tuo sketch denominata onLedRGBChange() e che ospiterà il tuo codice personalizzato.

Le linee 095-097: impostano un array ( hsv ) a tre valori, uno per ciascuna componente HSB. Poi con i metodi:

  • getHue();
  • getSaturation();
  • getBrightness();

applicati al nome della tua variabile ledRGB ( in questo caso si tratta più propriamente di una istanza ) ricavi le tre componenti;

linea 098: usando il metodo getSwitch(); puoi conoscere lo stato del pulsante centrale dell’interdfaccia:

che avrà valore true per on e false per off;

linee 100-103: puoi usarle come Debug seriale per visualizzare i valori che la dashboard ti invia mediante App;

linea 105: se il valore di swt, impostato alla linea 098 è true, ossia il pulsante è stato premuto allora potrai richiamare la funzione HSVtoRGB() passandole sia il valor hsb sia l’array rgb in cui vuoi che siano messi i valori dopo la conversione;

linee 107-109: se il pulsante della dashboard è off allora imposta la matrice rgb a 0 per tutte le sue compomnenti.

linee 11-113: sono usate come debug dopo la conversione da HSB in RGB;

linea 114: assegna al led 0, ossia l’unico led del progetto, i valori RGB calcolati dalla funzione HSVtoRGB();

linea 115: usando il metodo show() della FastLED invii il valore al led neopixel connesso al pin 2;

Funzione HSVtoRGB()

Nell’arduino IoT Cloud neopixel sketch è una funzione che ricopre un aspetto molto importante.

Come hai letto sopra è stata scritta da kasperk e condivisa on-line perchè tutti potessimo beneficiarne.

usando la matrice dim-curve vista alle linee 031-048 ed una serie di calcoli si ricava i valori RGB che inserisce nella matrice rgb[] alle linee 172-174 e che ti ritroverai dopo aver eseguito la funzione stessa.

Il risultato è ciò che puoi vedere nel video:

 

  • 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/arduino-iot-cloud-neopixel-sketch.html

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.