Giochi di luce natalizi Arduino R4

Giochi di luce natalizi Arduino R4 nasce da un commento ricevuto qualche giorno fa da un appassionato lettore del blog.

giochi di luce natalizi arduino r4

Facciamo un passo indietro di qualche anno ed arriviamo al 14 Dic 2011 quando ho pubblicato il prima di una serie di articoli dedicati a 9 giochi di luce natalizi con arduino.

Nel 2011 l’arduino che avevamo a disposizione era l’arduino Uno in quanto l’arduino Uno r4 minima è uscita da qualche mese.

A questa premessa aggiungo quanto anticipato nella prima frase del presente articolo: qualche giorno fa mi è stato segnalato, da un lettore, che dopo la pubblicazione singolare dei 9 giochi di luce non era presente un articolo riassuntivo.

Mi è stato chiesto se avessi scritto uno sketch unico in cui inserire tutti i giochi di luce selezionabili, ad esempio, con un pulsante.

Ho colto l’occasione per provare la retro compatibilità dell’Arduino Uno R4 Minima con l’arduino Uno.

Giochi di luce natalizi Arduino R4

Sono consapevole che i codici riportati in questo articolo siano semplici ed il test con la R4 minima è semplice, tuttavia, se oggi decidi di realizzare questo progetto ed è il tuo primo con Arduino acquisterai di certo una R4 minima.

Ma passiamo al progetto: quello che vedrai in questo articolo è come combinare tutti gli sketch presentati nei 10 articoli pubblicati nel 2011 in un unico sketch.

I precedenti articoli dedicati ai giochi di luce natalizi Arduino R4:

e passiamo alo schema elettronico, anch’esso non pubblicato per i precedenti articoli:

 

giochi di luce natalizi arduino r4 schemain cui vedi che i led sono connessi ai pin dal 2 all’8 dell’arduino ed il pulsante è connesso al pin 13 in modalità digitale.

Giochi di luce natalizi Arduino R4 sketch

Lo sketch per i giochi di luce natalizi Arduino R4 combina i 9 giochi di luce in un unico sketch e gestisce un pulsante per la selezione del gioco da eseguire:

 

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 = 9;
int totalGame = 9;
int fLampeggio = 500;
boolean pressButton = false;

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

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 setup() {
  SoftPWMBegin();
  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() {
 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();
     game_two();
     game_three();
     game_four();
     game_five();
     game_six();
     game_seven();
     game_eight();
   }
    
   if (game > totalGame) {  game = 1; } ;
 } else { pressButton = true; }
}

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) { 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, fadeDown); }
  int middle=int ((maxpin/2)+1);
  int cur1=0;
  for ( int b=minpin; b<=middle; b++) { if (digitalRead( pinButton ) == HIGH) { 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) { 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) { 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) { 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) { 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) { break; } SoftPWMSetPercent(i, 0); }
  delay(100);
  for ( int i=minpin; i<=maxpin; i++) { if (digitalRead( pinButton ) == HIGH) { 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) { 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) { 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) { 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) { 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*3, fadeDown*3 ); }  
  for ( int i=minpin; i<=maxpin; i++) { 
    if (digitalRead( pinButton ) == HIGH) { break; } 
   
    SoftPWMSetPercent(i, 100);
  }
  delay(fadeUp*3);
  for ( int i=minpin; i<=maxpin; i++) { 
    if (digitalRead( pinButton ) == HIGH) { break; }
     
    SoftPWMSetPercent(i, 0);
  }
  delay(fadeDown*3.5);
   
}

come avrai notato ciascuna funzione game_* racchiude un gioco di luce legato ai led connessi dal minpin al maxpin;

le linee 001-012: definiscono tutte le variabili che userai nello sketch. In particolare le linee 001 e 002 impostano le variabili minpinmaxpin definiscono i pin a cui sono connessi i led, dal 2 all’8. La linea 008 imposta il pin a cui il pulsante è connesso. Gli altri valori servono allo sketch per determinare i tempi di dissolvenza e/o lampeggio ed il numero totale di giochi previsti;

quindi dalla line 014 alla linea 055 trovi le funzioni della softPWM riscritte, dedicherò un articolo a questa parte.

la linea 064 controlla se il pulsante è premuto controllando il valore di LOW;

la linea 065: controlla il valore della variabile pressButton in modo da definire se il pulsante è stato premuto da poco: si tratta di un semplice e rudimentale controllo di antirimbalzo del pulsante.

In caso di pressione imposta il valore della medesima variabile a false, per i loop successivi, incrementa la variabile game e resetta tutte le luci spegnendole ( vedi funzione resetLinee() );

le linee 067-075: per ciscun gioco di luce impostato, in funzione della variabile game usata come contatore e richiama la funzione corrispondente al gioco;

le linee 076-087: definisce cosa accade quando il valore della variabile game arriva a 9: partono in sequenza tutti i giochi di luce.

la linea 089: controlla che il valore della variabile game non superi il valore totale dei giochi ( variabile totalGame )

linee 093-096: definisci la funzione resetLinee() che non hai trovato nei precedenti articoli, il cui scopo è resettare le luci, spegnendole.

linee 098-241: sono riportate le funzioni relative a ciascun gioco di luce dal primo all’ultimo.

Sul mio canale Youtube puoi trovare alcuni video relativi ai diversi giochi di luce pubblicati nel 2011.

  • 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-natalizi-arduino-r4.html

2 commenti

    • Bruno il 20 Febbraio 2024 alle 08:46
    • Rispondi

    Buongiorno Mauro, vorrei realizzare qualche gioco di luce da te pubblicato.
    Ti chiedo se è possibile realizzarlo con il mio Arduino R3.
    Grazie.
    Bruno

    1. Ciao Bruno,
      certo, i primi giochi di luce che ho realizzato erano sviluppati con un Arduino Uno R3 o precedente.
      Certo non avrai la connettività WiFi per controllarli dal Cloud Arduino, tuttavia puoi realizzarli senza problemi.
      Ti consiglio di prendere gli articoli precedenti così non dovrai adattarli.

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.