«

»

Dic 23

Stampa Articolo

Giochi di luce con Arduino – terzo gioco

Si arricchisce la serie di giochi di luce che puoi far eseguire alle tue serie di natale. In questo articolo realizzerai il terzo gioco luminoso con cui stupire parenti e amici.

Luci di Natale con Arduino

Innanzitutto dovrai eseguire un’altra piccola modifica alla funzione loop() dello sketch visto fino a questo punto, introdurrai così la possibilità di realizzare giochi di luce non solo con l’effetto dissolvenza ( fade ) ma anche con l’alternarsi delle luci.

Ecco la modifica, nei precedenti sketch la selezione del gioco di luce era simile a questa:

if (game == 1) game_one();
if (game == 2) game_two();

dovrai moficarla in questo modo:

if (game == 1) {
   for ( int i=minpin; i<=maxpin; i++) {
      SoftPWMSetFadeTime(i, fadeUp, fadeDown);
   }
   game_one();
}
if (game == 2) {
   for ( int i=minpin; i<=maxpin; i++) {
      SoftPWMSetFadeTime(i, fadeUp, fadeDown);
   }
   game_two();
}

cosa cambia: in precedenza la funzione setup() definiva in modo univoco ed una volta sola per tutta l’eseguzione dello sketch i tempi di fade sia in accensione (fadeUp) sia nella fase di spegnimento (fadeDown), in questo modo non avresti potuto più variare tali tempi tra un gioco ed il successivo; aggiungerndo per ogni linea di scelta del gioco anche un ciclo for da minpini a maxpin ed impostando al suo interno per ofni pin un tempo di fadeUp ed uno di fadeDown potrai in seguito variare questo tempo per ciascun gioco, vedrai di volta in volta cosa questo comporta.

Per inserire un nuovo gioco non devi far altro che realizzarlo, ossia realizzare una nuova funzione di tipo void, ossia senza parametri di input e di output che accenda e spenga ciascuna serie di luce collegata ad un pin corrispondente.

Ogni volta che inserirai un nuovo gioco ricordati anche di avvisare Arduino del nuovo arrivato, farlo è semplicissimo, hai definito una variabile di tipo integer: totalGame che rappresenta il numero massimo di giochi disponibili e selezionabili, dovrai portare il suo valore a 3:

 int totalGame=3;

ora dovrai definire una nuovacondizione nella funzione loop() che esegua il gioco 3 quando lo selezionerai con il pulsante:

if (game == 3) {
   for ( int i=minpin; i<=maxpin; i++) {
      SoftPWMSetFadeTime(i, 0, 0);
   }
   game_three();
}

Avrai notato che è molto simile a quelle definite per il gioco 1 e 2 ( game_one e game_two ), le sole 2 differenze sono:

  1. alla funzione softPWMSetFadeTime come valore di fadeUp e fadeDown imposta 0;
  2. alla linea 5 chiami il nuovo gioco (game_three).

Ed ecco il gioco di luce:

void game_three() {
   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);
 }

Puoi incollare le linee di codice dove preferisci nello sketch purchè non all’interno di una funzione già definita, per comodità e con un po’ di snso logico ti consiglio di incollarlo alla fine, e di fare altrettanto con i giochi di luce successivi.

Che cosa fa il gioco 3, puoi vederlo nel video in fondo all’articolo, ma come lo fa è tutta questione di codice:

linea 02: imposta un ciclo for dal pin minimo ( minpin ) al pin massimo ( maxpin );

linea 04: è un controllo che già conosci se hai letto gli articoli precedenti il suo scopo è intercettare la pressione del pulsante ed uscire immediatamente dal gioco in eseguizione per cambiare in un gioco nuovo;

linea 06: definisci una nuova variabile di tipo float ossia che può contenere anche numeri non interi, e vi assegni il valore dell’intero risultante dall’operazione (i/2): in pratica se i vale 2 -> val vale 1.00 (2/2) = 1 siccome è float 1.00; se i vale 3 allora (3/2) = 1.50 siccome lo forza a int sarà 1.00;

linea 07: confronta che il risultato dell’operazione float(i/2) con val, poichè float(i/2) non è forzata ad int il suo valore sarà 1.00 se i = 2 e 1.50 se i = 3; ne deriva che questa condizione sarà verificata solo per i valori di i pari; per tali valori il pin corrispondente viene spento grazie alla finzione SoftPWMSetPercent(pin,%).

linea 08: rappresenta la condizione alternativa alla precedente e sarà quindi verificata per tutti i pin dispari, che porterà a 100%;

linea 11: imposta un tempo di attesa, normalmente questo tempo dovrebbe essere identico a quello necessario al fadeUp o Fade Down, secondo la fase in cui sei, per consentire alle luci di ultimare l’effetto impartito; in questo caso è dimezzato in modo da ottenere un effetto differente.

linee 13-22: eseguono le stesse operazioni appena viste nelle righe precedenti con la sola differenza per le linee 18 e 19 dove i pin pari li imposterai per raggiungere il 100% della loro luminosità e i pin dispari a 0%;

L’effetto finale che otterrai è simile al seguente:

Se vuoi aumentare la frequenza in cui si alternano i cambi di luce sui pin puoi dividere fadeUp per un numero maggiore, es.: 3 o maggiore.

Buon natale.

Permalink link a questo articolo: http://www.mauroalfieri.it/elettronica/giochi-di-luce-con-arduino-terzo-gioco.html

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Puoi usare i seguenti tag ed attributi HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>