Arduino IoT neopixel project è nato per raccontare la prima parte del progetto Dolores presentato in occasione dell’Arduino Week 2022.
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:
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:
in cui dovrai creare il tuo primo Thing cliccando su ” CREATE THING” in alto a destra, nella schermata che apparirà, inizialmente vuota:
ti suggerisco di cambiare il Time Zone cliccando nello spazio in basso a destra e selezionando il tuo timezone:
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:
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”;
la schermata finale sarà simile alla seguente:
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:
e potrai passare ad aggiungere il Device associato a questo Things.
Configurazione del Device
Clicca sulla voce “Devices” in alto al centro:
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:
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:
Warning!
Ricorda che per interfacciare la scheda al computer e renderla disponibile per l’Arduino IoT Cloud dovrai aver installato l’ArduinoCreateAgent.
Appena avrai connesso la tua scheda al computer e avviato l’Arduino Create Agent il software procederà oltre:
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:
accettando quello proposto, come nel mio esempio, o definendone uno tuo.
Notice
Il nome del device non è modificabile in seguito !!!
Cliccando su “NEXT” partirà la configurazione vera e propria in 3 step:
nel terzo step viene configurata anche la parte relativa alla sicurezza IoT, cosa non del tutto scontata in questo ambito:
ed al termine ti comparirà il pulsante “DONE”:
premendo il quale potrai finalmente vedere il tuo device tra quelli disponibili :
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:
approfittiamo per rinominare il Thing creato in precedenza, seleziona Rename dai tre puntini sulla destra, nella schermata che ti si presenta:
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”
Selezionalo e ritornerai nella schermata di setup e sketch:
clicca sul pulsante a forma di catena ( link ) come indicato dalla freccia.
Nella schermata successiva, seleziona la scheda “Eirena”:
che sarà associata al tuo progetto:
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:
e inserisci il tuo SSID e la password:
cliccando poi su “SAVE”.
Il Thing è ora configurato:
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 :