Arduino IoT neopixel project

Arduino IoT neopixel project è nato per raccontare la prima parte del progetto Dolores presentato in occasione dell’Arduino Week 2022.

Arduino IoT neopixel project welcome Arduino Cloud

In occasione dell’evento live organizzato da WeMake e AUG & Wearable Milano, insieme a Sara Savian abbiamo presentato, come emotionwear,  il progetto Dolores.

Puoi rivedere la presentazione sul canale Youtube di Wemake:

Il progetto Dolores è un wearable che usa una Arduino Nano 33 IoT ed il Cloud messo a disposizione dall’azienda stessa.

Per festeggiare l’Arduino Week 2022 con un progetto che fosse sia realizzato con una scheda arduino ma sfruttasse allo stesso tempo anche l’infrastruttura Cloud ho iniziato a fare delle prove.

Oggi ti racconto come realizzare un tuo progetto usando:

un arduino nano 33 IoT

l’arduino Cloud IoT

la dashboard dell’Iot Cloud

ed il tutto occupandoti di scrivere solo le righe di codice che controllano i led neopixel, lasciando che  l’interazione tra arduino nano e cloud avvenga senza scrivere una linea di codice.

Arduino IoT neopixel project

L’arduino IoT neopixel project parte dalla schermata di benvenuto che trovi digitando https://store.arduino.cc/digital/create dopo aver eseguito il login gratuito:

Arduino IoT neopixel project welcome Arduino Cloud

il passo successivo è decidere con quale app partire per il tuo progetto, seleziona IoT Cloud e arriverai alla schermata dei Things.

Configurazione del Things

Iniziamo con la configurazione del primo Thing:

Arduino IoT neopixel project Things create

in cui dovrai creare il tuo primo Thing cliccando su ” CREATE THING” in alto a destra, nella schermata che apparirà, inizialmente vuota:

Arduino IoT neopixel project Things set timezone

ti suggerisco di cambiare il Time Zone cliccando nello spazio in basso a destra e selezionando il tuo timezone:

Arduino IoT neopixel project Things set timezone detail

il mio è Europe\Rome, siccome alcune funzioni del Cloud fanno uso del tempo per sincronizzarsi penso sia opportuno selezionare il corretto timezone.

Passaggio successivo sarà creare una variabile per la gestione del led rgb neopixel, o meglio, per gestire l’accensione, l’intensità ed il colore che vorrai il led assuma:Arduino IoT neopixel project Things Setup

Clicca su “ADD VARIABLE” e imposta:

  • il nome della variabile, nell’esempio “LedRGB”;
  • il tipo: Colored Light;
  • i permessi: “Read and Write”;
  • policy di update: “on Change”;

Arduino IoT neopixel project variable define

la schermata finale sarà simile alla seguente:

Arduino IoT neopixel project variable defined

potrai cliccare su “ADD VARIABLE” per inserirla nel tuo arduino IoT neopixel project.

Nella schermata di configurazione del Thing ti comparirà la variabile appena inserita:

Arduino IoT neopixel project things add device

e potrai passare ad aggiungere il Device associato a questo Things.

Configurazione del Device

Clicca sulla voce “Devices” in alto al centro:

Arduino IoT neopixel project devices add

e nella mia schermata è già presente un device MKR1000, a cui andrò ad aggiungere la nuova Nano 33 IoT, clicca su “ADD DEVICE” in alto a destra:

Arduino IoT neopixel project device vendor

e scegli tra un device di tipo Arduino o di terze parti, per l’arduino nano 33 IoT seleziona Arduino, nella schermata successiva ti invita a collegare la tua scheda al computer:Arduino IoT neopixel project devices connect

Appena avrai connesso la tua scheda al computer e avviato  l’Arduino Create Agent il software procederà oltre:

Arduino IoT neopixel project devices found

mostrandoti il device che ha riconosciuto.

Cliccando su “CONFIGURE” inizierà la parte di configurazione automatica del device e connessione all’Arduino IoT Cloud, in cui l’unica cosa che dovrai fare è scegliere il nome:

Arduino IoT neopixel project devices name

accettando quello proposto, come nel mio esempio, o definendone uno tuo.

Cliccando su “NEXT” partirà la configurazione vera e propria in 3 step:

Arduino IoT neopixel project devices setup

nel terzo step viene configurata anche la parte relativa alla sicurezza IoT, cosa non del tutto scontata in questo ambito:

Arduino IoT neopixel project devices setuped

ed al termine ti comparirà il pulsante “DONE”:

Arduino IoT neopixel project devices done

premendo il quale potrai finalmente vedere il tuo device tra quelli disponibili :

Arduino IoT neopixel project devices added

ed ovviamente non ancora on-line in quanto non hai ancora eseguito l’upload del codice.

Torna alla configurazione del Things per associare il device al tuo progetto.

Associazione della Nano 33 IoT al progetto 

Per collegare la board appena aggiunta “” all’arduino IoT neopixel project dovrai tornare nella schermata dei Things:

Arduino IoT neopixel project Things rename

approfittiamo per rinominare il Thing creato in precedenza, seleziona Rename dai tre puntini sulla destra, nella schermata che ti si presenta:

Arduino IoT neopixel project Things rename set

scegli il nome, che potrai cambiare anche in seguito con lo stesso metodo, e clicca su “RENAME”.

Il tuo Thing si chiamerà con il nome che hai scelto, nel mio esempio: “LedRGB” 

Arduino IoT neopixel project Things renamed

Selezionalo e ritornerai nella schermata di setup e sketch:

Arduino IoT neopixel project Things select Device

clicca sul pulsante a forma di catena ( link ) come indicato dalla freccia.

Nella schermata successiva, seleziona la scheda “Eirena”:

Arduino IoT neopixel project Things Device nano select

che sarà associata al tuo progetto:

Arduino IoT neopixel project Things Device nano selected

Configurazione della rete

ogni progetto IoT ha necessità di collegarsi ad internet, per farlo dovrai configurare i parametri di accesso alla tua rete WiFi.

Clicca sull’icona a forma di catena nella sezione Network:

Arduino IoT neopixel project Things network settings

e inserisci il tuo SSID e la password:

Arduino IoT neopixel project Things network parameters

cliccando poi su “SAVE”.

Il Thing è ora configurato:

Arduino IoT neopixel project Things network configured

Puoi passare alla parte software, ossia il codice che ti ha generato in modo automatico l’Arduini Cloud e che dovrai solo personalizzare con la parte relativa al controllo del led RGB.

Lo sketch Arduino IoT neopixel project

lo sketch per arduino IoT neopixel project te lo riporto di seguito già completo e testato, poi in un prossimo articolo lo analizzeremo per comprendere ogni sua singola parte:

/* 
  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; 
  }   
}

Per la scrittura del codice ho fatto affidamento su una funzione di conversione dei valori da HSB a RGB che ho trovato on-line e che puoi scaricare qui.

In cui l’autore Kasper ha scritto una funzione davvero ben fatta per eseguire in modo semplice la conversione.

La funzione HSVtoRGB, che ho leggermente modificato per adattarla al mio codice, ti permette di passarle i valori di Hue, Saturation e Brightness ed ottenere il valore RGB corrispondente

Il valore RGB è quello che dovrai passare al led neopixel.

Esiste la possibilità, nella libreria FastLed, di poter passare direttamente i valori HSV per ciascun led, ma mi riservo di provarla in un altro esempio.

Conclusioni

Nei prossimi articoli leggerai la spiegazione dello sketch, nelle linee che ho aggiunto, per il controllo del led neopixel e vedrai come costruire una dashboard per il controllo dello stesso :

Prima di inserire un commento, per favore, leggi il regolamento

Permanent link to this article: https://www.mauroalfieri.it/elettronica/arduino-iot-neopixel-project.html

Lascia un commento

Your email address will not be published.

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