Giochi di luce IoT Cloud

Giochi di luce IoT Cloud rimane in tema festività natalizie aggiungendo un pizzico di IoT al progetto.

giochi di luce IoT Cloud 1080

avrai già letto, probabilmente gli articoli dedicati alle luci di natale e al controllo IoT dell’Arduino Uno R4 WiFI:

Giochi di luce natalizi Arduino R4

Arduino Uno R4 WiFI IoT Cloud

ed ho pensato… perché non unire i due progetti e realizzare un sistema di controllo delle luci direttamente controllato dal Cloud Arduino ?

Ecco fatto .. in questo articolo leggerai come realizzare i tuoi giochi di luce IoT cloud.

Giochi di luce IoT Cloud

Rispetto all’articolo in cui hai letto come controllare le luci dei giochi natalizi con una Arduino Uno R4 Minima, in questo progetto avrai bisogno della uno R4 WiFi.

L’Arduino Uno R4 WiFi dispone, infatti, della componente WiFi per connettersi alla tua rete ed al Cloud.

Ho mantenuto il pulsante per cambiare i giochi di luce in modo che il progetto sia utilizzabile anche quando non è disponibile una connessione internet.

To mostro prima il video per comprendere meglio come funziona:

Lo schema del progetto

lo schema del progetto giochi di luce IoT Cloud non cambia rispetto a quello che hai visto usando l’arduino uno r4 minima, infatti non ho modificato la scheda utilizzata nel disegno:

giochi di luce natalizi arduino r4 schema

tuttavia nelle immagini e nel video avrai visto che la scheda da utilizzare è la R4 WiFi.

Lo sketch dei giochi di luce IoT Cloud

Lo sketch che puoi utilizzare è diviso in 3 parti:

  • giochi di luce IoT:  main sketch;
  • frames.h: contiene il codice dei numeri da visualizzare sulla matrice led;
  • thingProperties.h: con le impostazioni per connetterti all’Arduino Cloud IoT;

avrai quindi nell’IDE arduino 3 tab, una situazione simile:

giochi di luce IoT Cloud IDE

Partendo dal primo iniziamo a vedere come sono composti:

Giochi di luce IoT

l’ho definito main sketch in quanto contiene le funzioni principali: setup e loop:

#include "thingProperties.h"
#include "Arduino_LED_Matrix.h"
#include "frames.h"

int minpin = 2;
int maxpin = 8;
int fadeUp = 1000;
int fadeDown = 1000;
int fadeUpPin[]   = {0,0,0,0,0,0,0,0,0};
int fadeDownPin[] = {0,0,0,0,0,0,0,0,0};
int currFadeVal[] = {0,0,0,0,0,0,0,0,0};
int pinButton = 13;
int game = 0;
int totalGame = 9;
int fLampeggio = 500;
int status = WL_IDLE_STATUS;
boolean pressButton = false;

ArduinoLEDMatrix matrix;

/**************************************************************************************************/

void SoftPWMBegin() { Serial.begin( 115200 ); Serial.println( "Start" ); delay(1500); };

void SoftPWMSet(int pin, int value) {
  if (value == HIGH) value=255;
  if (value == LOW)  value=0;
  
  if (value > currFadeVal[pin] ) { 
    
    if (fadeDownPin[pin] == 0) { analogWrite( pin,value );
    } else if (fadeUpPin[pin] == 255) { analogWrite( pin,value );
    } else {
      int stepTime = (fadeUpPin[pin]/(value-currFadeVal[pin]))+1;      
      for (int v=currFadeVal[pin]; v<=value; v++) { if (digitalRead( pinButton ) == HIGH) { return; } analogWrite( pin,v ); delay(stepTime); };
    }
  } 
  if (value < currFadeVal[pin] ) { 
    if (fadeDownPin[pin] == 0) {
      analogWrite( pin,value );
    } else {
      int stepTime = (fadeDownPin[pin]/(currFadeVal[pin]-value))+1; 
      for (int v=currFadeVal[pin]; v>=value; v--) { if (digitalRead( pinButton ) == HIGH) { return; } analogWrite( pin,v ); delay(stepTime);  };
    }
  } 
  currFadeVal[pin]=value;
}

void SoftPWMSetFadeTime(int pin, int fadeUp, int fadeDown) { fadeUpPin[pin] = fadeUp; fadeDownPin[pin] = fadeDown; }

void SoftPWMSetPercent(int pin, int percent) { SoftPWMSet(pin, ((uint16_t)percent * 255) / 100); }

/**************************************************************************************************/

void resetLinee() { Serial.println( " ..reset.. " ); for ( int l=minpin; l<=maxpin; l++) { SoftPWMSetFadeTime(l, 0, 0); SoftPWMSet(l, LOW); } }
 
void game_one() {
  Serial.println( " ..one.. " );
  for ( int i=minpin; i<=maxpin; i++) { SoftPWMSetFadeTime(i, fadeUp, fadeDown); }
  for ( int l=minpin; l<=maxpin; l++)
  {
    if ((digitalRead( pinButton ) == HIGH) || (pressButton)) { break; }
    SoftPWMSetPercent(l, 100);
    if (l >= (minpin+1)) { SoftPWMSetPercent((l-1), 0); }
    if (l == minpin)     { SoftPWMSetPercent((maxpin), 0); }
    delay(fadeUp);
  }  
}
 
void game_two() {
  Serial.println( " ..two.. " );
  for ( int i=minpin; i<=maxpin; i++) { SoftPWMSetFadeTime(i, fadeUp/2, fadeDown/2); }
  int middle=int ((maxpin/2)+1);
  int cur1=0;
  for ( int b=minpin; b<=middle; b++) {
    if ((digitalRead( pinButton ) == HIGH) || (pressButton)) { break; }
     
    int e=(maxpin-cur1);
    SoftPWMSetPercent(b, 100);
    SoftPWMSetPercent(e, 100);
    cur1++;
    delay(fadeUp);
  }
   
  for ( int b=middle; b>=minpin; b--) {
    if ((digitalRead( pinButton ) == HIGH) || (pressButton)) { break; }
     
    int e=(maxpin-cur1)+1;
    SoftPWMSetPercent(b, 0);
    SoftPWMSetPercent(e, 0);
    cur1--;
 
    delay(fadeDown);
  }
   
  delay(fadeUp);
}
 
void game_three() {
  Serial.print( " ..three.. " );
  for ( int i=minpin; i<=maxpin; i++) { SoftPWMSetFadeTime(i, 0, 0); } 
  for ( int i=minpin; i<=maxpin; i++) {
    if ((digitalRead( pinButton ) == HIGH) || (pressButton)) { break; }
     
    float val=int (i/2);
    if ( (float(i)/2) == val) SoftPWMSetPercent(i, 0);
    else                      SoftPWMSetPercent(i, 100);
  }
   
  delay(fadeUp/2);
   
  for ( int i=minpin; i<=maxpin; i++) {
    if ((digitalRead( pinButton ) == HIGH) || (pressButton)) { break; }
     
    float val=int (i/2);
    if ( (float(i)/2) == val) SoftPWMSetPercent(i, 100);
    else                      SoftPWMSetPercent(i, 0);
  }
   
  delay(fadeUp/2);
  Serial.println( " ..three end .. " );
}
 
void game_four() {
  Serial.println( " ..four.. " );
  for ( int i=minpin; i<=maxpin; i++) { SoftPWMSetFadeTime(i, 0, 0); }  
  for ( int i=minpin; i<=maxpin; i++) {

    if ((digitalRead( pinButton ) == HIGH) || (pressButton)) { break; }

    SoftPWMSetPercent(i, 0);
    delay(100);
    SoftPWMSetPercent(i, 100);
    delay(100);
  }
}
 
void game_five() {
  Serial.println( " ..five.. " );
  for ( int i=minpin; i<=maxpin; i++) { SoftPWMSetFadeTime(i, 0, 0); }  
  for ( int i=minpin; i<=maxpin; i++) { if ((digitalRead( pinButton ) == HIGH) || (pressButton)) { break; } SoftPWMSetPercent(i, 0); }
  delay(100);
  for ( int i=minpin; i<=maxpin; i++) { if ((digitalRead( pinButton ) == HIGH) || (pressButton)) { break; } SoftPWMSetPercent(i, 100); }
  delay(100);
}
 
void game_six() {
  Serial.println( " ..six.. " );
  for ( int i=minpin; i<=maxpin; i++) { SoftPWMSetFadeTime(i, fadeUp, fadeDown); }  
  for ( int i=minpin; i<=maxpin; i++) {
    if ((digitalRead( pinButton ) == HIGH) || (pressButton)) { break; }
     
    float val=int (i/2);
    if ( (float(i)/2) == val) SoftPWMSetPercent(i, 0);
    else                      SoftPWMSetPercent(i, 100);
  }
   
  delay(fadeUp/2);
   
  for ( int i=minpin; i<=maxpin; i++) {
    if ((digitalRead( pinButton ) == HIGH) || (pressButton)) { break; }
     
    float val=int (i/2);
    if ( (float(i)/2) == val) SoftPWMSetPercent(i, 100);
    else               SoftPWMSetPercent(i, 0);
  }
   
  delay(fadeDown/2);
}
 
void game_seven() {
  Serial.println( " ..seven.. " );
  for ( int i=minpin; i<=maxpin; i++) { SoftPWMSetFadeTime(i, 0, 0); }    
  int middle=int ((maxpin/2)+1);
    int cur1=0;
    for ( int b=minpin; b<=middle; b++) {
      if ((digitalRead( pinButton ) == HIGH) || (pressButton)) { break; }
      
      int e=(maxpin-cur1);
      SoftPWMSetPercent(b, 100);
      SoftPWMSetPercent(e, 100);
      cur1++;
      delay(fadeUp/2);
    }
    
    for ( int b=middle; b>=minpin; b--) {
      if ((digitalRead( pinButton ) == HIGH) || (pressButton)) { break; }
      
      int e=(maxpin-cur1)+1;
      SoftPWMSetPercent(b, 0);
      SoftPWMSetPercent(e, 0);
      cur1--;
  
      delay(fadeDown/2);
    }
    
    delay(fadeUp/2);
 
}
 
void game_eight() {
  Serial.println( " ..eight.. " );
  for ( int i=minpin; i<=maxpin; i++) { SoftPWMSetFadeTime(i, fadeUp*2, fadeDown*2 ); }  
  for ( int i=minpin; i<=maxpin; i++) { if ((digitalRead( pinButton ) == HIGH) || (pressButton)) { break; } SoftPWMSetPercent(i, 100); }
  delay(fadeUp);
  for ( int i=minpin; i<=maxpin; i++) { if ((digitalRead( pinButton ) == HIGH) || (pressButton)) { break; } SoftPWMSetPercent(i, 0); }
  delay(fadeDown);
}

/**************************************************************************************************/

void setup() {
  SoftPWMBegin();
  
  matrix.begin();
  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();

  for ( int i=minpin; i<=maxpin; i++) { pinMode( i,OUTPUT ); SoftPWMSetFadeTime(i, 0, 0); SoftPWMSet(i, HIGH); }
  for ( int i=minpin; i<=maxpin; i++) { SoftPWMSetFadeTime(i, fadeUp/2, fadeDown/2); SoftPWMSet(i, LOW); }
  pinMode(pinButton, INPUT);
 
}

/**************************************************************************************************/

void loop() { 
  ArduinoCloud.update(); 
  if (digitalRead( pinButton ) == LOW) {
   if ( pressButton ) { pressButton = false; game += 1; resetLinee(); }
    
   if (game == 1) { game_one(); }
   if (game == 2) { game_two(); }
   if (game == 3) { game_three(); }
   if (game == 4) { game_four(); }
   if (game == 5) { game_five(); }
   if (game == 6) { game_six(); }
   if (game == 7) { game_seven(); }
   if (game == 8) { game_eight(); }
    
   if (game == 9) { 
     Serial.print("In Game: "); Serial.println( game );
      
     game_one();                                    if ((digitalRead( pinButton ) == HIGH) || (pressButton)) { return; }
     game_two();                                    if ((digitalRead( pinButton ) == HIGH) || (pressButton)) { return; }
     for ( int n=0; n<=10; n++ ) { game_three(); }  if ((digitalRead( pinButton ) == HIGH) || (pressButton)) { return; }
     for ( int n=0; n<=10; n++ ) { game_four();  }  if ((digitalRead( pinButton ) == HIGH) || (pressButton)) { return; }
     for ( int n=0; n<=10; n++ ) { game_five();  }  if ((digitalRead( pinButton ) == HIGH) || (pressButton)) { return; }
     game_six();                                    if ((digitalRead( pinButton ) == HIGH) || (pressButton)) { return; }
     for ( int n=0; n<=10; n++ ) { game_seven(); }  if ((digitalRead( pinButton ) == HIGH) || (pressButton)) { return; }
     game_eight();                                  if ((digitalRead( pinButton ) == HIGH) || (pressButton)) { return; }
   }
    
   if (game > totalGame) {  game = 1; } ;
 } else { pressButton = true; }
}

/*
  Since LedBuiltin is READ_WRITE variable, onLedBuiltinChange() is
  executed every time a new value is received from IoT Cloud.
*/
void onLedBuiltinChange()  {
  // Add your code here to act upon LedBuiltin change
  digitalWrite(LED_BUILTIN, led_Builtin);
}

/*
  Since LedMatrix is READ_WRITE variable, onLedMatrixChange() is
  executed every time a new value is received from IoT Cloud.
*/
void onLedMatrixChange()  {
  matrix.loadFrame( matrixNumber[led_Matrix] );
  if ( game != led_Matrix ) { game = (led_Matrix-1); pressButton = true; }
}

è certamente la parte più corposa ed impegnativa del progetto, ma per il 90% identica a quanto letto nei due precedenti articoli da cui siamo partiti.

Analizzeremo solo le parti nuove come la linea 016: che introduce la variabile status in cui sarà memorizzato lo stato della connessione ad internet;

le linee 053-210: sono le stesse che hai già letto nel precedente articolo dedicato ai giochi di luce con Arduino Minima, sono solo state spostate prima delle funzioni setup e loop;

linea 216: richiama la funzione  initProperties che troverai nel file thingProperties e che serve ad inizializzare la connessione verso il Cloud IoT;

allo stesso modo le linee 219-229: sono state copiate dallo sketch di connessione all’arduino cloud;

nella funzione setup è rimasto tutto invariato.

Nella funzione loop trovi una modifica alla prima linea la 240: che richiama, ad ogni ciclo di loop il metodo update dell’ArduinoCloud;

nel gioco 9 alle linee 256-263: ho aggiunto, per ogni linea, un check simile a quello presente in ogni gioco di luce, il cui scopo è verificare che il pulsante sia stato premuto per cambiare gioco prima che la sequenza finisca.

Infine alla linea 285: nella funzione onLedMatrixChange quando un nuovo numero viene inviato dall’IoT Dashboard controlli se il gioco di luce in esecuzione è differente da quello impostato e lo reimposti.

Frames.h

Come anticipato contiene il codice dei numeri da visualizzare sulla matrice led, lo hai già letto nell’articolo dedicato all’utilizzo della matrice led della R4 wifi:

const uint32_t matrixNumber[][4] = {
        { 0x600f019, 0x81981981, 0x980f0060, 66 },
        { 0xe01e036, 0x600600, 0x601f81f8, 66 },
        { 0x600f019, 0x80300600, 0xc01801f8, 66 },
        { 0xf019801, 0x80300300, 0x181980f0, 66 },
        { 0xf01f03b, 0x3303fc3, 0xfc030030, 66 },
        { 0x1f81f818, 0x1f00f80, 0x181f81f0, 66 },
        { 0x600f018, 0x1f01981, 0x981980f0, 66 },
        { 0x1f81f801, 0x80300600, 0xc0180180, 66 },
        { 0xf019819, 0x80f01981, 0x981980f0, 66 },
        { 0xf019819, 0x80f80180, 0x181f00e0, 66 }
};

si tratta del medesimo file presentato nell’articolo della matrice di led via Iot Cloud solo compattata per vederla meglio nel suo insieme.

ThingProperties.h

Contiene le impostazioni SSID, Password, Device key necessarie per connettere il progetto all’Arduino Cloud IoT.

Anche questo file lo hai incontrato nel progetto dedicato all’IoT Cloud e matrice led.

// Code generated by Arduino IoT Cloud, DO NOT EDIT.

#include <ArduinoIoTCloud.h>
#include <Arduino_ConnectionHandler.h>

const char DEVICE_LOGIN_NAME[]  = "[device login name ricavato dall'IoT Cloud]";

const char SSID[]               = "[SSID del tuo WiFi]";    // Network SSID (name)
const char PASS[]               = "[Pass del WiFi]";    // Network password (use for WPA, or use as key for WEP)
const char DEVICE_KEY[]         = "[key device id o Secret device password fornita dal Cloud Arduino]";    // Secret device password

void onLedMatrixChange();
void onLedBuiltinChange();

int led_Matrix;
bool led_Builtin;

void initProperties(){

  ArduinoCloud.setBoardId(DEVICE_LOGIN_NAME);
  ArduinoCloud.setSecretDeviceKey(DEVICE_KEY);
  ArduinoCloud.addProperty(led_Matrix, READWRITE, ON_CHANGE, onLedMatrixChange);
  ArduinoCloud.addProperty(led_Builtin, READWRITE, ON_CHANGE, onLedBuiltinChange);

}

WiFiConnectionHandler ArduinoIoTPreferredConnection(SSID, PASS);

non ci sono molte differenze rispetto al progetto da cui siamo partiti, e di cui trovi il link sopra, dovrai sostituire i valori relativi al tuo device_login_name, ssid, password e secret password.

In questo modo il tuo device si collegherà alla tua rete WiFi ed al cloud IoT Arduino pronto a ricevere i comandi e far partire i giochi di luce.

  • 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/giochi-di-luce-iot-cloud.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.