Giochi di luce natalizi Arduino R4 nasce da un commento ricevuto qualche giorno fa da un appassionato lettore del blog.
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:
- Tutorial: Giochi di luce con Arduino
- Giochi di luce con Arduino – secondo gioco – prima parte
- Giochi di luce con Arduino – secondo gioco – seconda parte
- Giochi di luce con Arduino – terzo gioco
- Giochi di luce con Arduino – quarto gioco
- Giochi di luce con Arduino – quinto gioco
- Giochi di luce con Arduino – sesto gioco
- Giochi di luce con Arduino – settimo gioco
- Giochi di luce con Arduino – ottavo gioco
- Giochi di luce con Arduino – nono gioco
e passiamo alo schema elettronico, anch’esso non pubblicato per i precedenti articoli:
in 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 minpin e maxpin 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;
Notice
Provando lo sketch ed i giochi di luce sull’Arduino Uno R4 minima mi sono accorto che la libreria SoftPWM non è supportata sul microcontrollore Renesas RA4M1 (Arm® Cortex®-M4) ed ho queinid deciso di leggere come fossero scritte le funzioni che utilizzavo nei giochi di luce natalizi Arduino R4 ed adattarle
Warning!
Rispetto a quanto indicato nel datasheet della scheda ( https://store.arduino.cc/products/uno-r4-minima?gad_source=1 ) sulla R4 ho scoperto che i pin dal 2 all’8, e non solo, sono in grado di generare segnali PWM senza simularli via swoftware 😀
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.
2 commenti
Buongiorno Mauro, vorrei realizzare qualche gioco di luce da te pubblicato.
Ti chiedo se è possibile realizzarlo con il mio Arduino R3.
Grazie.
Bruno
Autore
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.