«

»

Dic 19

Stampa Articolo

Giochi di luce con Arduino – secondo gioco – prima parte

Continua la serie dei miei articoli sui giochi di luce per il tuo albero o per le decorazioni Natalizie.
In questo articolo realizzerai un secondo gioco di luce e una importante modifica che ti permetterà di selezionare i quale gioco eseguire.

Luci di Natale con Arduino

Riporto tutto lo sketch evidenziando i punti e spiagando quali sono le modifiche che puoi realizzare e lo scopo di ciascuna modifica. Ho anche modificato il numero di pin utilizzabili per i giochi dovendone utilizzare 1 ( il pin 13) per eseguire la scelta del gioco.
In pratica il pin 13 è utilizzato come INPUT digitale che commutato a +5v indica allo sketch la tua volontà di cambiare gioco di luci. Passiamo allo sketch:

/**
 * Giochi di luce con Arduino
 * Version 0.2 Dec, 2011
 * Copyright 2011 Alfieri Mauro
 * info at mauroalfieri dot it
 *
 * This example code is in the public domain.
 */

 #include <SoftPWM.h>

 int minpin = 2;
 int maxpin = 8;
 int fadeUp = 1000;
 int fadeDown = 1000;
 int pinButton = 13;
 int game = 1;
 int totalGame=2;
 boolean pressButton = false;

 void setup() {
   SoftPWMBegin();
   for ( int i=minpin; i<=maxpin; i++)
   {
     SoftPWMSet(i, HIGH);
   }
   for ( int i=minpin; i<=maxpin; i++)
   {
     SoftPWMSet(i, LOW);
     SoftPWMSetFadeTime(i, fadeUp, fadeDown);
   }

   pinMode(pinButton, INPUT);
 }

 void loop() {
  if (digitalRead( pinButton ) == LOW) {
    if ( pressButton == true ) {
      pressButton = false;
      game += 1;
      resetLinee();
    }

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

    if (game > totalGame) game = 1;
  } else { pressButton = true; }
 }

 void resetLinee() {
   for ( int l=minpin; l<=maxpin; l++) { SoftPWMSet(l, LOW); }
 }

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

     Serial.print("B: ");
     Serial.print(b);
     Serial.print(" E: ");
     Serial.println(e);
     delay(fadeDown);
   }

   delay(fadeUp);
 }

Le prime linee ono invariate nella sostanza, l’unica variazione riguarda ilnumero di pin utilizzati per i tuoi giochi di luce.

linee 12-13: nel precedente articolo il valore maxpin era impostato a 13, in questa nuova versione al max potrai impostare questo valore a 12 in quanto il pin 13 ti occorre per selezionare il gioco di luce successivo.

Aggiungi le linee 16-19: settando alcuni valori necessari al funzionamento del nostro gioco di luce;

linea 16: imposta il pin che utilizzerai come INPUT per impartire i comandi;

linea 17: definisci il gioco di luce da cui partire, di default il primo;

linea 18: imposta il numero massimo di giochi utilizzabili;

linea 19: definiamo una variabile di tipo boolean (true o false) che determina la pressione del nostro bottone;

Nella funzione di setup() devi eseguire una modifica alla linea 33;

linea 33: imposta il pin definito con la variabile pinButton come pin di tipo INPUT, grazie a questa definizione potrai leggere con la funzione digitalRead() il valore del pin 13 alla pressione del pulsante;

La funzione loop(), che nel precedente sketch era necessaria a far partire solo il prmo gioco di luce, in questo sketch deve occuparsi di leggere quando il pulsante viene premuto e cambiare il gioco in eseguzione.

linea 37: verifica che il valore letto dalla funzione digitalRead() sul pin pinButton (13) sia impostato a LOW, di default il pulsante è di tipo NA (Normalmente Aperto) per cui il valore letto è sempre basso (LOW o 0) quindi ad ogni loop di Arduino saranno eseguite le istruzioni contenute all’interno delle parentesi graffe {}; alla linea 44 definisci la condizione alternativa, lo sketch entra nella condizione di else ogni tutte le volte che il pulsante è premuto;

linea 38: ti sarà più chiara dopo aver copreso quelo che accade nella linea 44, per adesso l’importante è capire che quando il valore della variabile booleana pressButton è true, lo sketch esegue quando definito alle linee 39-41;

linea 39: reimposta la variabile pressButton a false, in modo che al circolo successivo non riesegua più le istruzioni definite nelle linee 40 e 41;

linea 40: incrementa il valore di game di 1 ogni volta che entri in questo ciclo;

linea 41: esegue la funzione resetLinee();

Nelle linee successive imposterai quale gioco eseguire in funzione del valore assunto dalla variabile game e controllerai che il valore di game non superi mai il numero massimo di giochi disponibili;

linee 44-45: sono identiche, in ciascuna verifichi il valore raggiunto dalla variabile game ed in funzione di questo valore esegui il gioco corrispondente;

linea 47: verifica che il valore della variabile game non superi il numero di giochi disponibili, se ciò si verificasse lo sketch non saeebbe in grado di determinare il gioco da eseguire al successivo loop();

linea 48: è il fulcro di tutto il codice appena visto; la condizione di pressione del pulsante commuta a +5v il pinButton che corrisponde alla lettura di un valore HIGH sul pin corrispondente (13) e lo sketch esegue la condizione di else, imposta quindi il valore di pressButton  a true in modo che al primo ciclo successivo al rilascio del pulsante lo sketch possa entrare nella consizione presente alla linea 38; in pratica fino a quando tieni premuto il pulsante lo sketch resta nella condizione di else e la variabile pressButton è impostata a true, al rilascio del pulsante il codice eseguito è quello presente dopo la condizione di if definita alla linea 37 e nei cicli successivi continua ad eseguire il codice delle linee 44-47;

Ci sono 2 nuove funzioni, una è il secondo gioco di luce mentre la prima è il resetLinee() che hai visto chiamare alla linea 41, il suo scopo è quello di resettare tutte le uscite dedicate ai giochi di luce per poi passare al gioco successivo. Per questo motivo è chiamata dalla linea 41, ossia quando lo sketch rileva il cambio di gioco dopo una pressione e rilascio del pulsante.

linea 52: esegui un ciclo partendo dal valore di minpin fino al maxpin impostando a LOW (0) il valore dell’uscita corrispondente;

In questo articolo ho già riportato il nuovo gioco di luce che descriverò nel dettali nel prossimo articolo, l’ho anticipato per consentirti di verificare che le modifiche che stiamo apportando funzionino, con un unico gioco non avresti potuto verificarle.

Chiudo questo articolo con un ultima importante modifica al primo gioco, la modifica in questione riguarda la linea 58:  la devi collocare all’interno del ciclo for che esegue il gico stesso, il suo scopo è intercettare in qualsiasi momento la pressione del pulsante e innescare il cambio del gioco. Per fare ciò devi definire una condizione di verifica del valore rilevato dalla fiunzione digitalRead() sul pin pinButton (13), quando il pulsante viene premuto tale valore è uguale a HIGH e lo sketch interrompe la funzione in eseguzione per tornare all’eseguzione del ciclo di loop() iniziale. In questo modo in qualsiasi momento potrai premere il pulsante certo che l’effetto di cambio del gioco sia immediato, grazie alle linee 37-48.

Riporto un video che ho realizzato in cui con 7 led vedrai arduino che esegue il primo gioco di luci:

Buon natale.

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

6 comments

1 ping

Vai al modulo dei commenti

  1. Pasquale

    bellissimo!!! ma questo gioco è realizzabile anche con una striscia led?

    1. Mauro Alfieri

      Si, considera che una striscia di led di cui hai il controllo di ogni singolo led puoi realizzare tutti i giochi di luce che ho presentato con Arduino.

      Mauro

  2. Loris

    Salve,

    sto cercando di ricreare l’effetto di una fiammella con arduino ed un led solo che nonriesco trovare la giusta sequenza non è che riuscirebbe indicrmi lo schetc più adatto?

    1. Mauro Alfieri

      Ciao Loris,
      penso che con un solo led sia impossibile o quanto meno poco realistico, io proverei con almeno 2 led: uno rosso ed uno giallo alternandone il tremolio.

  3. luigi

    SALVE HO UN PROBLEMA E VORREI ESSERE AIUTATO HO UN ARDUINO E DUE SCHEDE RELE AD 8 CANALI FATTO I VARI COLLEGAMENTI CARICATO ARDUINO RIESCO A FAR ACCENDERE LUCI AD INTERMITTENZA SOLO A 240V STESSO COLLEGAMENTO LO FACCIO PER STRISCE LED RGB MA NON EMETTONO NESSUNA INTERMITTENZA O CAMBIO DI COLORE PERCHE COSA HO SBAGLIATO SE QUALCUNO MI AIUTA GRAZIE

    1. Mauro Alfieri

      Ciao Luigi,
      in primo luogo ti suggerisco di non inserire in chiaro il tuo indirizzo email nei commenti in quanto ti troveresti la casella piena di messaggi di spam legati ai bot che continuamente cercano nel web email a cui inviare posta malevola.
      In merito al tuo dubbio hai verificato che le strisce di led che stai utilizzando possano essere alimentate con la tensione che gli stai fornendo ? Solitamente i led usano 12v per funzionare e non 240

  1. Mauro Alfieri » Blog Archive » Giochi di luce con Arduino – sesto gioco

    […] gioco di luce con Arduino, prima e seconda […]

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>