Far lampeggiare un led a caso

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.