Buona Epifania a tutti, oggi concludiamo questa serie di articoli dedicati alle luci di Natale con il 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.
15 commenti
Vai al modulo dei commenti
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…..
Autore
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.
Thanks so much for sharing this excellent info! I’m seeking forward to see much more posts! dkeafdabcebe
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
Autore
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 🙂
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.
Autore
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.
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.
Autore
Ciao Antonio,
se non riesci cambiando le librerie IR, prova a cambiare l’altra 🙂
Ho provato a cercarne altre ma non ne ho trovate. Tu per caso non è che ne hai qualcuna a portata di mano. 😀
Autore
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.
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.
Autore
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.
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
Autore
Ciao Fabio,
cosa intendi per “eseguire solo l’ultimo comulativo” ? vuoi che i giochi siano eseguiti in sequenza dal primo all’ultimo?