Giochi di luce con Arduino – settimo gioco

Buon 2012 !! Capodanno è appena passato ma un nuovo anno pieno di speranze e di nuovi interessanti tutorial, ricette e appunti è pronto per te.

Giochi di luce con Arduino

Oggi e fino all’epifania la serie di articoli che leggerai sono tutti dedicati ai giochi di luce con Arduino, l’epifania che “tutte le feste porta via” conclude questo ciclo di articoli e ti lascio un anno per sperimentare, provare, modificare tutto quello che fino ad oggi hai letto sui giochi di luce. Se te ne inventi degli altri e vuoi condividerli con tutti noi appassionati, commenta uno degli articoli:

  1. giochi di luce con Arduino
  2. secondo gioco di luce con Arduino, prima e seconda parte
  3. terzo gioco di luce con Arduino
  4. quarto gioco di luce con Arduino
  5. quinto gioco di luce con Arduino
  6. sesto gioco di luce con Arduino

o questo stesso ed io sarò felice di poterti lasciare lo spazio che meriti sul blog. Ogni giorno siamo sempre di più e questo grazie alla dilagante passione comune per Arduino.

Passiamo subito al nuovo gioco di luce:  il settimo.

Come funziona? E’ abbastanza semplice come già hai vsto per i giochi precedenti il codice relativo al suo funzionamento altro non è che una serie di cicli controllati dalla funzione loop() e dalla libreria SoftPWM.

void game_seven() {

   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);

 }

A prima vista piò sembrarti complesso ma dopo la lettura della descrizione linea per linea ti accorgerai che non è molto differente da altri giochi di luce che hai già realizzato:

linea 01: definisci la nuova funzione game_seven() in cui sono contenute tutte le righe necessarie al gioco di luce;

linea 03: calcoli il pin a metà tra quelli definiti nell’intervallo minpin-maxpin, il calcolo è semplice (maxpin/2) taglia in due il conteggio dei pin, ad esempio se il maxpin vale 8 il calcolo restituisce 4, a cui sommi 1 per ottenere un valore di pin esatto considerado che il conteggio dei pin parte dal pin 2: per cui (8/2)+1 = 5 che considerando il minpin=2 e maxpin = 8 è esattamente il pin centrale: 2 3 4 5 6 7 8;

linea 04: imposta un cursore denominato cur1 con valore predefinito 0;

linea 05: inizia un ciclo for dal minpin fino al pin centrale middle calcolato alla linea 03;

linea 07: controlla che il pulsante designato l cambio del gioco luminoso non sia stato premuto;

linea 09: definisci una variabile intera e il cui valore è calcolato come la differenza tra il maxpin ed il cursore definito alla linea 04 cur1 questa operazione ti consente di conoscere per ogni valore assunto da b, controllato dal ciclo for, il valore del pin specchio partendo dalla fine; in un semplice esempio se siamo al primo ciclo del for cur1 vale 0 => e=maxpin; al secondo ciclo cur1 vale 1 (vedi linee successive) e di conseguenza e=maxpin-1=7 se consideriamo maxpin=8;

linea 10: imposta il valore del pin b a 100%, il pin b lo hai incrementato con il ciclo for;

linea 11: imposta il valore del pin e a 100%, il pin e lo hai calcolato alla linea 09;

linea 12: incrementa il valore del cursore cur1 in modo che al successivo passaggio il calcolo di e restituisce il pin inferiore nella scala tra maxpin e middle;

linea 13: imposta un tempo di attesa prima di iniziare nuovamente il ciclo for pari a fadeUp/2 ossia alla metà del tempo che hai indicato alla libreria SoftPWM per eseguire il ciclo di accensione da 0% a 100%;

linee 16-26: eseguono le medesime istruzioni che hai appena visto con solo alcune piccole variazioni, il ciclo for parte dal valore middle calcolato alla linea 03 e prosegue decrementando b fino al minpin;

linea 20: e è calcolata sempre come maxpin-cur1 ma cur1 in questo momento parte dal suo valore massimo, in aggiunta al calcolo devi sommare 1 (maxpin-cur1)+1 per correggere l’errore derivante dal range che non parte da 0 o 1 ma dal pin 2;

linee 21-22: questa volta imposti a 0% il valore dei pin b ed e;

linea 23: decrementi cur1 ad ogni ciclo, diversamente dalla linea 12 in cui incrementavi tale valore;

linea 25: il delay, tempo di attesa tra un ciclo ed il successivo è calcolato come la metà di quello impostato per lo spegnimento delle serie di luci collegate ai pin b ed e, fadeDown/2;

linea 28: imposta un ulteriore tempo di attesa a conclusione del gioco prima di riportare il controllo alla funzione loop() darai in questo modo maggiore senzazione di continuità al gioco, sopratutto nel passaggio tra tutto spento e le prime serie esterne che si riaccendono.

Il gioco di luce vero e proprio lo hai appena visto e realizzato ma non puoi dimenticare che lo sketch non lo conosce ancora, anche se hai incollato al funzione alla fine dello sketch ti occorrono altre 2 operazioni per rendere attivo ed utilizzabile questo nuovo gioco di luce:

  1. l’incremento della variabile totalGame da 6 a 7;
  2. la linea di gestione del gioco nella funzione loop();

ed ecco le due modifiche:

int totalGame=7;

e le linee di gestione del gioco, da inserire nella unzione loop subito dopo le altre già presenti:

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

Avrai certamente notato che la linea 03 della modifica da aggiungere imposta a 0 i valori di fade sia in accensione che in spegnimento, questo conferisce al gioco di luce un effetto di acceso/spento senza dissolvenza.

Buon anno.

Cortesemente, prima di inserire i commenti leggi il regolamento

Permanent link to this article: http://www.mauroalfieri.it/elettronica/giochi-di-luce-con-arduino-settimo-gioco.html

4 comments

Skip to comment form

    • giacomo on 3 maggio 2013 at 14:59
    • Reply

    Ciao Mauro, volendo mettere insieme tutti i giochi di luce magari selezionandoli con un pulsante come potrei fare ? usare uno switch – case ??

    1. Ciao Giacomo,
      dovrei aver scritto un articolo a chiusura di tutta la serie di giochi in cui trovi l’unione di tutti i giochi.

      Mauro

    • mirko on 20 novembre 2013 at 20:30
    • Reply

    se mi permetti una piccola modifica al tuo programma :
    alla riga numero 3 nel quale calcoli il pin centrale (middle):

    middle=int ((maxpin/2)+1);

    supponendo che la tua serie comincia con l’uscita numero 2 di arduino

    invece modificando nel seguente modo:

    middle=int((maxpin+minpin)/2);

    funziona su qualsiasi serie di uscite utilizzate
    tale modifica dovrebbe andare bene anche x il gioco due !
    puoi controllare ?
    grazie Mirko

    1. Grazie Mirko,
      come sostengo da sempre:
      1. uno stesso problema puoi risolverlo con almeno 100 varianti di codice, e probabilmente 99 sono migliori della mia 🙂
      2. il blog serve anche a condividere idee.

      Il ragionamento che hai postato è corretto, potresti provarlo e rispondere con il risultato del test.

      Mauro

Lascia un commento

Your email address will not be published.

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.