«

»

Gen 06

Stampa Articolo

Giochi di luce con Arduino – nono gioco

Buona Epifania a tutti, oggi concludiamo questa serie di articoli dedicati alle luci di Natale con il nono gioco.

Giochi di luci natalizie nono gioco

Forse avrai tirato un sospiro di sollievo per la fine di questi articoli, oppure sei tra coloro che mi hanno scritto in questo periodo natalizio per ringraziarmi, in ogni caso, anche se questa serie di articoli non ha suscitato in te molto interesse hai avuto modo, leggendoli, di apprendere numerosi giochi di calcolo e tecniche di programmazione che potrai ritrovare utili per i tuoi lavori.

Il nono gioco di luci è un gioco cumulativo, esegue in sequenza dal primo all’ultimo tutti i giochi di luce descritti fino a questo punto.

La prima modifica riguarda la variabile totalGame con cui dici ad Arduino della presenza di un nuovo gioco:

int totalGame=9;

Passa quindi all’unica modofica da eseguire nella funzione loop(), io consiglio di inserire le righe di codice seguenti solo dopo le altre, per comodità di lettura dello sketch:

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

      for ( int i=minpin; i<=maxpin; i++) {
        SoftPWMSetFadeTime(i, fadeUp, fadeDown);
      }
      game_two();

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

      for ( int i=minpin; i<=maxpin; i++) {
        SoftPWMSetFadeTime(i, 0, 0);
      }
      game_four();

      for ( int i=minpin; i<=maxpin; i++) {
        SoftPWMSetFadeTime(i, 0, 0);
      }
      game_five();

      for ( int i=minpin; i<=maxpin; i++) {
        SoftPWMSetFadeTime(i, fadeUp, fadeDown);
      }
      game_six();

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

      for ( int i=minpin; i<=maxpin; i++) {
        SoftPWMSetFadeTime(i, fadeUp*3, fadeDown*3 );
      }
      game_eight();
    }

Avrai già notato come funziona, il principio è molto semplice: se il valore della variabile game è 9 ( linea 01 ) esegue le linee successive del listato; per ciascun gioco dal primo all’ottavo Arduino esegue prima il settaggio dei pin secondo la modalità prevista dal gioco da eseguire.

Ad esempio se il gioco da eseguire è il primo game_one() devi resettare i pin dal minpin al maxpin impostando come tempi di fadeUpfadeDown quelli definiti nelle variabili corrispondenti, se il gioco da eseguire è ad esempio il quarto game_four() allora il settagio dei pin dal minpin al maxpin è 0 come tempo di fade sia per la fase ascendente ( fadeUp ) sia discendente ( fadeDown );
In questo modo Arduino esegue tutti i giochi in sequenza e poi rilascia il controllo alla funzione loop() che provvede a rieseguire l’intero gioco ripartendo dal primo.
Avrai notato che alcuni giochi di luce hanno una durata inferiore rispetto ad altri, prova a pensare come rendere quei giochi di inferiore durata più simili a quelli di durata maggiore, con delle semplici righe di codice e proponile a tutti i lettori di questa serie di articoli come commento a questo articolo.
Riepilogo di seguito ciascuno dei giochi di luce così come li vedrai eseguiti selezionando il nono gioco di luce:


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

11 comments

Vai al modulo dei commenti

  1. Mattia

    Ciao Mauro, ti chiedo un favore, mi sono da poco cimentato nel mondo Arduino…..ho seguito i tuoi insegnamenti nel tuo sito e sono riuscito a fare qualche piccola programmazione.
    Mi sono piaciuti un sacco i giochi di luce che hai fatto, solo che volevo apportare alcune modifiche, se noti per passare da un gioco all’altro bisogna premere il pulsante in corrispondenza della fine del gioco (lo noti solo se i tempi di fadeup e fadedown sono alti), come faccio a far “sentire” il pulsante ad arduino in qualsiasi momento?
    Un’altra cosa, nel nono gioco per far durare più a lungo ogni singolo gioco ho copiato più volte la stringa da eseguire….come nell’esempio:
    game_three();
    game_three();
    game_three();
    vedo che funziona ma volevo sapere se era il modo corretto!
    Ciao e grazie della pazienza, sono nuovo e sto imparando ora…..

    1. Mauro Alfieri

      Ciao Mattia,
      per il primo quesito devi sostituire la logica dei giochi di luce in modo che usino il millis() al posto del delay() in questo modo il sistema non si interrompe e puoi inserire il controllo dei pulsanti.
      Tuttavia millis() lavora in modo differente dal delay() per cui dovrai modificare il codice.

      Per il secondo quesito puoi fare in moti modi, uno è quello che hai usato, un’altro è creare un for di n cicli che richiami la game_three(), un’altro ancora potrenne essere intervenire sulla funzione game_three(), ecc..

      Ogni scketch puoi scriverlo in tanti modi dipende da quanto complesso sai scrivere il codice e cosa vuoi ottenere da ogni istruzione.

  2. Johna832

    Thanks so much for sharing this excellent info! I’m seeking forward to see much more posts! dkeafdabcebe

  3. luigi

    Ciao Mauro complimenti per i giochi di luce che hai creato.Io sono alle prime armi con Arduino quindi come materiale di studio mi è servito molto,anche se ancora alcune variabile del codice non le comprendo.
    Seguendo un po le richieste di Mattia che ho letto nei post precedenti sono riuscito ad incrementare la durata di ogni GIOCO semplicemente usando un ciclo FOR.
    esempio

    [[ codice rimosso in automatico ]]

    Poi non contento del tastino per cambiare i giochi ho fatto una piccola modifica evitando di dover riscrivere parte del codice

    semplicemente il pin 13 l'ho portato a gnd e nella sketch nel VOID RESET ho modificato il valore LOW impostandolo come HIGH,questo perchè il il pin 13 mi mandava in reset l'arduino senza motivo apparente.
    questa è la linea di codice

    [[ codice rimosso in automatico ]]

    ora funziona tutto…
    credo che comunque continuerò a smanettarci su per provare nuove soluzioni.
    grazie

    Luigi

    1. Mauro Alfieri

      Ciao Luigi,
      i codici non sono permessi nei commenti come hai letto in fondo ad ogni articolo, vengono rimossi in automatico.
      Non ho compreso cosa hai fatto con il pin 13 e come mai ti mandasse in reset l’arduino, penso ad un errore di connessione elettronica o altro componente malfunzionante.
      Continua e sperimenta .. è lo spirito giusto 🙂

  4. Antonio

    Ciao Mauro.
    Sto aiutando mio nipote a realizzare un progetto scolastico con Arduino. Abbiamo pensato di partire dal tuo programma giochi di luci e di comandarlo con un telecomando IR per selezionare i giochi di luci e magari aumentare la velocità e/o l’intensità dei led.

    Ci siamo imbattuti in questo problema purtroppo e spero tu ci possa dare una dritta/mano per risolverlo.

    Se carichiamo la libreria #include per gestire il telecomando e lanciamo la compilazione appare il seguente messaggio:

    libraries\IRremote\IRremote.cpp.o (symbol from plugin): In function `MATCH(int, int)’:
    (.text+0x0): multiple definition of `__vector_7′
    libraries\SoftPWM\SoftPWM.cpp.o (symbol from plugin):(.text+0x0): first defined here
    collect2.exe: error: ld returned 1 exit status
    exit status 1
    Errore durante la compilazione per la scheda Arduino/Genuino Uno.

    Da quello che ho intuito entrambe le librerie utilizzano una stessa variabile giusto?
    Ho provato ad aprire il codice di entrambe le librerie ma onestamente non saprei dove mettere le mani.

    Hai qualche idea/suggerimento?

    GRAZIE MILLE.

    1. Mauro Alfieri

      Ciao Antonio,
      si è un conflitto tra le librerie, prova a cambiare una delle due con una che fa cose simili ma non crea conflitto.
      Io proverei un altra IR.

      1. Antonio

        Niente da fare Mauro.
        Ho provato varie librerie IR che ho trovato sul Web, ma tutte danno lo stesso problema.

        Vorrà dire che cambieremo progetto.

        1. Mauro Alfieri

          Ciao Antonio,
          se non riesci cambiando le librerie IR, prova a cambiare l’altra 🙂

          1. Antonio

            Ho provato a cercarne altre ma non ne ho trovate. Tu per caso non è che ne hai qualcuna a portata di mano. 😀

          2. Mauro Alfieri

            Ciao Antonio,
            io uso la IRremote by shirriff ver 2.0.1 presente nel “Gestore Librerie” dell’IDE ed ho provato a includere un esempio dalla PWMlib che ho trovato sempre nel medesimo Gestore.
            Il conflitto non si genera, non ho provato lo sketch e non so bene cosa tu voglia ottenere ma puoi verificare se funziona.

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>