Ciao a tutti. Vorrei capire come far lampeggiare un led, già acceso, totalmente a caso. All'avvio esso si accende subito e vorrei che, a caso, ogni tanto facesse un lampeggio per poi tornare acceso fisso. Quindi senza nessuna determinazione del tempo che intercorre tra l'ultimo lampeggio e il successivo. Quale comando potrei usare per ottenere questo risultato?
Ok...quindi dopo potrei mettere un if per dire "se il valore che conterrà il valore estratto è uguale al numero che mi interessa, allora esegui tali righe di codice... Corretto?
Puoi calcolare, di volta in volta, dopo quanto tempo si deve spegnere nuovamente:
setup:
pausa=casuale tra 1 e 10 secondi.
loop:
Dopo pausa spegni per 0,3s e calcola nuova pausa casuale.
Ok ho fatto qualche prova con il comando random. Quello che voglio ottenere è che un determinato led, che è acceso fisso,lampeggi in modo totalmente casuale solo in un certo arco di tempo di esecuzione del programma.
Esempio:
Led in questione acceso fisso. In un tempo di 30000 ms potrebbe casualmente lampeggiare, ma può anche non farlo. Dipende dal giro , diciamo così... Magari se non viene estratto un determinato numero da random a quel giro, non lampeggia e lampeggerà al prossimo. Passato questo tempo, in cui potrebbe lampeggiare, torna ad essere fisso e il programma prosegue. Voglio che il lampeggio casuale avvenga solo in quel preciso arco di tempo. Si può realizzare?
Non si capisce molto bene cosa vuoi fare.
Un led fisso è semplice, anche se la loop() continua a girare e fare altro, una volta attivata uscita di un pin con digitalWrite(pin,HIGH) il led è acceso.
Ma per farlo lampeggiare non basta. Devi alternare acceso/spento, tipo esempio blink
Ancora meglio esempio blinkwithoutdelay che evita i delay() che impediscono di fare altre cose mentre la loop() gira.
Se il tuo programma fa altre cose oltre all'eventuale lampeggio, non è così semplice.
Dopo varie prove ho capito che quello che volevo fare non si può... Tornando alla base della questione sono arrivato a questo punto . Questa parte di codice si trova dentro loop.Voglio che quando stato =1 i numeri non vengano estratti per 15 secondi e quindi il led non possa lampeggiare se viene estratto il numero 11.Successivamente,quando stato torna a 0,deve ricominciare a estrarre e lampeggiare se viene estratto il numero 11.Guardando il monitor seriale funziona, ma c'è un problema.Non capisco perché ricomincia a estrarre dopo 30 secondi e non dopo 15 come indicato nel delay dentro al case 1. Si comporta come se ci fosse scritto delay(30000) . Tutto il resto del codice funziona correttamente.Va in tilt nel case 1.
if (millis()-rosso >=30000)
{
rosso=millis();
stato++;
if(stato>1)
{
stato=0;
}
}
switch (stato)
{
case 0 :
randomSeed(analogRead(A0));
num=random(9,12);
Serial.println(num);
if(num==11)
{
digitalWrite(ledTR,LOW);
delay(900);
digitalWrite(ledTR,HIGH);
}
pausa=random(2000,4000);
Serial.println(pausa);
delay(pausa);
break;
case 1 :
delay(15000);
break;
}
}
Usi una macchina a stati finiti e ci metti i delay???... No! Usa millis()!
Non capisco come correggere e perché quel delay si blocca fino a 30000
Lo switch/case deve girare alla velocità della luce! Ogni delay deve essere fatto con un case con if(millis()-t_casex > ritardo_x) stato+=1;
Grazie. Quindi come ritardo ovviamente 15000.
Questo che hai scritto dovrei sostituirlo in case 1 e anche nella parte finale del case 0?dove c'è pausa.
This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.