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 modifica 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:
 
 
 
 
Buona epifania
  • Questo sito ed i suoi contenuti è fornito "così com'è" e Mauro Alfieri non rilascia alcuna dichiarazione o garanzia di alcun tipo, esplicita o implicita, riguardo alla completezza, accuratezza, affidabilità, idoneità o disponibilità del sito o delle informazioni, prodotti, servizi o grafiche correlate contenute sul sito per qualsiasi scopo.
  • Ti chiedo di leggere e rispettare il regolamento del sito prima di utilizzarlo
  • Ti chiedo di leggere i Termini e Condizioni d'uso del sito prima di utilizzarlo
  • In qualità di Affiliato Amazon io ricevo un guadagno dagli acquisti idonei qualora siano presenti link al suddetto sito.

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

15 commenti

Vai al modulo dei commenti

    • Mattia il 25 Febbraio 2014 alle 18:25
    • Rispondi

    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. 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.

    • Johna832 il 4 Settembre 2014 alle 09:04
    • Rispondi

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

    • luigi il 10 Dicembre 2015 alle 16:53
    • Rispondi

    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. 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 🙂

    • Antonio il 27 Marzo 2017 alle 19:07
    • Rispondi

    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. 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.

        • Antonio il 30 Marzo 2017 alle 22:49
        • Rispondi

        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. Ciao Antonio,
          se non riesci cambiando le librerie IR, prova a cambiare l’altra 🙂

            • Antonio il 4 Aprile 2017 alle 21:15

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

          1. 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.

    • Antonio il 17 Giugno 2017 alle 07:41
    • Rispondi

    Salve,sono uno studente molto appassionato di elettronica e informatica e amo molto il tuo sito.
    Vorrei dei chiarimenti..sto realizzando un distributore di bevande con arduino,dove ho avuto l’idea di metterci dei led strip a 12 v con alimentazione esterna e quindi sono a luce fissa. Desidero che i led avessero una dissolvenza,essendo rgb,ma il mio dubbio è : devo usare dei transistor? Perché ho avuto l’idea di darle la ccc esterna ma collegare i pin dei led ad arduino in pwm,ma funzionano? Avrà problemi arduino? Spero di no visto che mi alimenta anche modulo hc 05 e sensore di prossimità insieme ai relè.
    Grazie mille in anticipo.

    1. Ciao Antonio,
      se sono led RGB classici e non Neopixel dovrai usare una shield o dei mosfet per non danneggiare arduino ed i led.
      Trovi nel blog molti articoli dedicati al controllo di led con schemi ed esempi.

    • Fabio il 2 Febbraio 2021 alle 19:31
    • Rispondi

    Buonasera,
    Grazie per la guida, la trovo molto interessante. Sono riuscito a fare tutti i giochi , solo non riesco a capire se è possibile far eseguire solo l’ultimo comulativo.
    Ho fatto varie prove ma ahimè non ne sono venuto a capo.
    Grazie

    1. Ciao Fabio,
      cosa intendi per “eseguire solo l’ultimo comulativo” ? vuoi che i giochi siano eseguiti in sequenza dal primo all’ultimo?

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.

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