Buonasera, mi chiamo Davide ed è la prima volta che scrivo su questo forum (mi scuso in anticipo se ho sbagliato sezione o qualcos'altro), le mie competenze sulla programmazione di Arduino sono scarsissime ma ne ho di buone in elettronica, detto ciò vi illustro il funzionamento del mio progetto: ho 4 Led rgb che quando si accendono creano ciascuno un colore diverso in modo casuale, il loro spegnimento deve avvenire esclusivamente tramite i 4 pulsanti(ovviamente ne devo premere uno a scelta), il problema è che quando premo uno di questi quattro pulsanti i Led non si spengono ma diventano tutti e quattro bianchi come se si sovrapponessero tutti i case, io ho provato a far spegnere le luci tramite il cambio di valore a una variabile tramite l'impulso di un pulsante ma sicuramente ho sbaiato ad usare la variabile.
Sarò grato e ringrazio in anticipo tutti ma soprattutto chi mi saprà dare consigli utili alla risoluzione del problema.
Buonasera,
essendo il tuo primo post, nel rispetto del regolamento della sezione Italiana del forum (… punto 13, primo capoverso), ti chiedo cortesemente di presentartiIN QUESTO THREAD (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con MOLTA attenzione il su citato REGOLAMENTO ... Grazie.
EDITEDITEDIT
Ciao, ti avevo scritto tutto ed ora offline dal portatile ed è sparito tutto!
Ti ripeto in breve!
cancella tutto il codice e parti da zero è molto gozzo e pieno di variabili inutili
Guarda il file di esempio su Arduino File->Examples->Digital->Button e parti da li per costruire il tuo codice.
Fai accendere e spegnere il led ad intermittenza con un colore casuale
Prova ad accenderlo e spegnerlo con il pulsante con un colore casuale, fatto quello prova ad unire le cose ed implementa il tuo "gioco" poi posta il codice se qualcosa non funziona.
Da quello che ho capito tu vuoi fare accendere inizialmente tutti i led con un colore random ed quando premi il pulsante si spegne e se lo ripremi si accende con un altro colore casuale. Ogni led ha il proprio pulsante. Giusto?
Prova e poi posta il codice, siamo qui!!!
Ti consiglio, dopo esserti presentato, di mettere mano al codice e commentarlo, poi ricaricarlo.
I commenti sono fondamentali alle persone che mettono mano al codice altrui per capire più facilmente come funziona l'algoritmo.
I commenti servono anche a chi ha scritto il codice, è facile perdersi o dimenticarsi perchè si aveva fatto una scelta piuttosto che un altra specie a distanza di qualche settimana/mese.
Vedrai che cercando di spiegare con i commenti il funzionamento, troverai da solo i bug.
Le mie prime domande:
Cosa servono quei delay(analogRead(7));
Ogni case sembra una combinazione di colori quindi spiega nei commenti che colore è.
Poi perchè chiami random(11)? randNumber può assumere un valore da 0 a 10 e i case sono da 0 a 9?
Visto che ha messo la presentazione, provo anche io a capire.
gianlucaf:
Cosa servono quei delay(analogRead(7));
Immagino che abbia messo un potenziometro per cui con quello regola la velocità del gioco.
Certo, se oltre ai commenti usasse anche le macro, sarebbe stato più semplice capire, se avesse fatto
@define POT_RITARDO 7 // Potenziometro per regolare la velocità
delay(analogRead(POT_RITARDO));
Tra l'altro ha messo 20 delay, quando bastava:
delay(analogRead(POT_RITARDO)*20);
Visto che il valore dell'analog va da 0 a 1023 si ha un delay che va da 0 a 20 secondi (che mi pare tantino...).
Ogni case sembra una combinazione di colori quindi spiega nei commenti che colore è.
Ma più che quello, direi che se mette sempre HIGH il pin di un colore e non mette LOW gli altri, è il motivo per cui alla fine diventano tutti bianchi...
Infine, al di là di tutto DEVE INDENTARE DECENTEMENTE!
Cavolo, ma se anche uno non volesse farlo mentre scrive il codice, ci vuole tanto a premere Ctrl-T nell'IDE? Boh...
buon pomeriggio, come ho detto nella presentazione ho scarsissime conoscenze in programmazione, i delay servivano per far spegnere le luci per massimo 20 secondi ma ora ho corretto con: delay(analogRead(tempo)*20); poi come inserisco i low per i led? con un else dopo while?
grazie mille per l'aiuto che mi state dando,(ho rimesso in allegato il programma con i commenti)
vi auguro buon proseguimento di giornata.
Davidejack:
(ho rimesso in allegato il programma con i commenti)
Bene, i commenti sono sempre una cosa ottima (anche e soprattutto per chi scrive il programma, ma anche per chi poi deve leggere il tuo listato) ma, scusa se insisto, puoi dare un Ctrl-T e farlo indentare dall'IDE, così anche noi capiamo meglio senza dover "interpretare" o riformattarlo noi per te?
@Davidejack Appena riesci a dare un occhiata al mio commento che ho modificato
Secondo me dovresti come ho gia' detto partire dalla base e svilupparlo lentamente!
Se ti metti in 1-2 ore lo fai tranquillamente
@Triko93 il funzionamento è questo: dopo 0-20 secondi dall'accensione di arduino i led si accendono casualmente(e senza che premo niente),affinché non premo uno dei quattro pulsanti rimangono accese tutte le luci, premo uno dei quattro pulsanti e si spengono tutte le luci, passano 0-20 secondi e le luci si riaccendono senza che premo alcun pulsante per poi fare tutto questo ciclo affinché non spengo arduino
Davidejack: @Triko93 il funzionamento è questo: dopo 0-20 secondi dall'accensione di arduino i led si accendono casualmente(e senza che premo niente),affinché non premo uno dei quattro pulsanti rimangono accese tutte le luci, premo uno dei quattro pulsanti e si spengono tutte le luci, passano 0-20 secondi e le luci si riaccendono senza che premo alcun pulsante per poi fare tutto questo ciclo affinché non spengo arduino
@Davidejack aaaaaah ok, ora ho capito, ancora piu' facile
Dammi 10 minuti che ti scrivo il codice non completo cosi' ti facilito un po' le cose
Poi in cambio mi darai un help con il mio progetto
Davidejack:
... dopo 0-20 secondi dall'accensione di arduino i led si accendono casualmente ...
Se intendi si accendono di un colore casuale ti ho allegato il codice incompleto che dovrai completare tu
Poi all'interno leggi i commenti e se hai dubbi chiedi!!!
Patrick_M: @Triko93 lo scopo del forum è aiutare si, ma soprattutto a capire e imparare cosa uno sta facendo in modo da poter crescere
non so se hai presente quella cosa che dice:
se dai un pesce ad un affamato lo sfamerai per un giorno, se gli insegni a pescare lo sfamerai per una vita....
Ecco, qui è lo stesso tu gli fai il programma lui lo usa ed è contento e alla prossima difficoltà non avrà imparato nulla
Ciao boss, difatti gli ho scritto il codice parziale e siccome non ha esperienza in programmazione gli ho lasciato le 2 parti piu' complicate diciamo, il resto l'ho solamente pulito e chiarito meglio cosi' puo' vedere cos'ha sbagliato anche prima. Siccome son sicuro avra' gia' provato piu' di una volta ora gli faccio vedere la soluzione parziale! Inoltre son contento di aiutare anche regalando codice ai nuovi utenti e non mi dispiace e concordo con quel che dici e ricordo che anche io all'inizio ho avuto molto sostegno su come risolvere determinati problemi altrimenti giravo in tondo per ore e non risolvevo nulla e scrivevo cose a caso!
Poi non son nemmeno sicuro che quel che ho scritto sia esattamente quello che stava cercando ma spero di si!
Buona sera, @Triko93 con il codice che mi hai inviato mi sono avvicinato tantissimo alla soluzione!!!
ora lo sto adattando e provando, naturalmente sto riscontrando problemi sul funzionamento ma spero di risolverli da solo, tante grazie!!(comunque il tempo che va da 0 a 20 secondi non è random ma varia con il resistore variabile)
Davidejack:
Buona sera, @Triko93 con il codice che mi hai inviato mi sono avvicinato tantissimo alla soluzione!!!
ora lo sto adattando e provando, naturalmente sto riscontrando problemi sul funzionamento ma spero di risolverli da solo, tante grazie!!(comunque il tempo che va da 0 a 20 secondi non è random ma varia con il resistore variabile)
Bene!
Ok allora avrai gia' tolto il delay random che avevo inserito! @davidejack Appena l'hai completato ti ricordo di caricare la soluzione completa per aiutare altri che dovessero trovarsi in un problema simile!
Davidejack:
buonasera, @Triko93 è possibile incorporare quel codice in un sistema switch case? più che altro una volta che ho spento le luci come esco dal case?
Guarda lascia perdere lo switch case per il momento, il codice che ti avevo scritto andava abbastanza bene!
Inoltre non ho capito cosa intendi con uscire dallo switch una volta che hai spento i led. Se mi alleghi codice con commenti capisco meglio!
Comunque siccome sei dentro loop() dovresti usare una variabile globali che fa da trigger e se attiva esegue lo switch case se non lo e' esegue altro codice.
ho pensato allo switch case perche io voglio delle sequenze casuali ma già precompilate: perche in ogni case c'è una sequenza scritta da me ma quale si estrae io non lo so perche la estraggo con randNumber.
oppure al posto del case posso usare degli if?
Davidejack:
ho pensato allo switch case perche io voglio delle sequenze casuali ma già precompilate: perche in ogni case c'è una sequenza scritta da me ma quale si estrae io non lo so perche la estraggo con randNumber.
oppure al posto del case posso usare degli if?
Allora ci son delle incongruenze nel codice.
Per prima cosa togli i define ed usa const su tutte le variabili come ti avevo messo io poi nello swtich che hai usato ci son 2 while che controllano se il buttonstate == 0 mentre il primo controlla se e' == 1. E' intenzionale o l hai missato?
Comunque puoi usare si anche lo switch case se ti va meglio il problema e' che cosi' facendo con il dowhile non esci piu' e non viene piu' rilevato quando premi il pulsante che sarebbe la 2 istruzione del ciclo loop().
Poi altra cosa
#define tempo 7
...
delay(analogRead(tempo) * 20); //la sequenza di luci parte dopo il tempo che voglio io
ti consiglio di usare semplicemente delay(tempo che ti pare) senza tirare in balle analogread ed altro
Ultima cosa, prova a fare lo stesso usando gli if da dove ero partito io, oppure modifica anche questo!