buongiorno, sto realizzando una centralina che mi genera giochi di luce con dei led, ho fatto il programma per il gioco e anche un potenziometro che mi vara la velocità dei del singolo gioco, ora con il pulsante quando premuto voglio far cambiare gioco di luce il problema e che per cambiare lo devo tenere premuto a lungo e a me non piace, posto lo sketch mi potete indicare dove sbaglio, grazie anticipatamente..
int puls=12;
int val=0;
int contatore=0;
int i = 0;
void setup () {
DDRD=B11111111;
pinMode(puls,INPUT);
}
void loop () {
val=digitalRead(puls);
if (val==1){
contatore=contatore +1;
}
for (i = 0; i < 5; i++)
if (contatore==1) {
PORTD = B10000001;
delay(analogRead(0));
PORTD = B11000011;
delay(analogRead(0));
PORTD = B10100101;
delay(analogRead(0));
PORTD = B10011001;
delay(analogRead(0));
PORTD = B10100101;
delay(analogRead(0));
PORTD = B11000011;
delay(analogRead(0));
}
for (i = 0; i < 5; i++)
if (contatore==2) {
PORTD = B11111111;
delay(analogRead(0));
PORTD = B11111111;
delay(analogRead(0));
PORTD = B11111111;
delay(analogRead(0));
PORTD = B11111111;
delay(analogRead(0));
PORTD = B11111111;
delay(analogRead(0));
PORTD = B11111111;
delay(analogRead(0));
}
if (contatore==3) {
contatore=0;
}
}
Ti è stato già detto un'infinità di volte che il codice, in conformità al REGOLAMENTO, punto 7, DEVE essere racchiuso tra i tag CODE (... sono quelli che in edit inserisce il bottone fatto così: </>, tutto a sinistra).
Quindi ora devi editare il tuo post qui sopra (quindi NON scrivendo un nuovo post, ma utilizzando il bottone More -> Modify che si trova in basso a destra del tuo post) e racchiudere il codice all'interno dei tag CODE (... sono quelli che in edit inserisce il bottone con icona fatta così: </>, tutto a sinistra).
Non è che sbagli è che per ogni gioco di luce hai impostato dei delay in base alla lettura del potenziomento, così com'è scritto il programma finché non esce da un gioco di luci e quindi torma all'inizio del loop non leggo lo stato del pulsante e non cambia quindi il gioco di luci.
Per far si che alla pressione del pulsante il gioco cambi immediatamente devi smettere di usare delay e for e gestire il tutto con millis() in modo che ad ogni cambio di stato del gioco di luci fai solo quello e torni all'inizio a leggere il pulsante.
Usare direttamente i registri (PORTD ecc) e il delay è un ossimoro
millis è una funzione semplice ma difficile da padroneggiare alla prima, senza tentare di applicarla immediatamente al tuo programma fai una prova con un led (l'esempio BlinkWithoudDelay è nell'IDE) e prova a variare la frequenza ecc per capire come funziona poi prova a implementare la cosa sul tuo programma con un solo gioco di luci senza preoccuparti del pulsante degli N giochi di luce ecc. quando un solo gioco di luci funziona con tempistiche lette dal potenziometro il resto sarà immensamente più facile. Senza voler risultare antipatico si vede che il codice non è farina del tuo sacco ma un mero copia ed incolla e appena qualcosa non va non si riesce (senza le basi) a risolvere, qui di solito funziona che si correggono/aiuta a correggere programmi che ti fai da solo e non fornire codice già fatto e finito. Prova a fare le cose per gradi e vedrai che con studio e l'aiuto del forum arrivi ad ottenere un programma che fa quel che vuoi tu
Se ti limiti a "leggere" velocemente quegli articoli ... NON ne verrai MAI fuori ... :
Sono articoli che vanno "studiati" con molta attenzione e capiti a fondo, dopo di ché, provati con semplici esempi sino a quando non si ha la padronanza completa dell'uso della funzione millis() per programmare compiti senza bloccare tutto il programma.