Semaforo con millis

Ciao a tutti, dopo aver capito più o meno la funzione millis ho provato realizzare uno sketch con questa funzione. Si tratta di gestire un comune semaforo stradale. Per ora mi limito solo a due funzioni: la prima è quella di pulsante non premuto (stato = 0)semafori spenti;pulsante premuto( stato =1) sequenza semafori. Innanzitutto per prima cosa vorrei sapere se il codice è scritto in modo leggibile, poi non so se la variabile (stato =1) è stata inserita nel posto giusto, perché nel premere il pulsante non sempre si attiva la sequenza dei semafori. Per ultimo mi piacerebbe iniziare la sequenza con il semaforo rosso acceso ma purtroppo non so come fare. Vi ringrazio tutti in anticipo. Guido

int semaforo_rosso  = 2;                   // led rosso  collegato al pin digitale  2
int semaforo_verde  = 3;                   // led verde collegato al pin digitale   3
int semaforo_giallo = 4;                   // led giallo  collegato al pin digitale 4
int puls            = 5;
int val             = 0;
int stato           = 0;
int contatore       = 0;                   // conta la sequenza del semaforo
const long interval       = 5000;          // intervallo di tempo per lampeggio semaforo
unsigned long previousMillis = 0;          // memorizza l'ultima volta che l'intervallo è stato aggiornato 
                                           // usare " unsigned long " per le variabili che tengono il tempo
void setup() {
 pinMode(semaforo_rosso,OUTPUT);           // imposta pin 2 come outpu
 pinMode(semaforo_verde,OUTPUT);           // imposta pin 3 come outpu
 pinMode(semaforo_giallo,OUTPUT);          // imposta pin 4 come outpu
 pinMode(puls,INPUT);                      // imposta pin 5 come input

}

void loop() {
 val=digitalRead(puls);
 if(val==1)
  stato = 1 - stato;
  delay(40);

 if (stato==0){
  digitalWrite(semaforo_rosso,LOW);
  digitalWrite(semaforo_verde,LOW);
  digitalWrite(semaforo_giallo,LOW);
  contatore = 0;
  previousMillis = millis ();
 }
 if (stato==1){
 if (millis() - previousMillis > interval)  {
    previousMillis = millis ();                // dopo che si è verificato vero l'if memorizzo il valore millis nella previousMillis 
    contatore++;
 }  
 }
 switch ( contatore ){
 case 1 :
 digitalWrite(semaforo_rosso,LOW);  
 digitalWrite(semaforo_verde,HIGH);
 break;
 case 2 :  
 digitalWrite(semaforo_giallo,HIGH);
 break;
}
 if (contatore > 2 ){
 digitalWrite(semaforo_rosso,HIGH);
 digitalWrite(semaforo_verde,LOW);
 digitalWrite(semaforo_giallo,LOW);
 contatore=0;
 }
 }
val=digitalRead(puls);
 if(val==1)
  stato = 1 - stato;
  delay(40);

è un generatore di 0 e 1 casuale. Visto che il loop viene eseguito piú volte durante il tempo di presione del pulsante il risultato della variabile "stato" é casuale. Devi lavorare sul cambio di stato del pulsante e non sul stato del pulsante.

switch ( contatore ){
 case 1 :
 digitalWrite(semaforo_rosso,LOW); 
 digitalWrite(semaforo_verde,HIGH);
 break;
 case 2 : 
 digitalWrite(semaforo_giallo,HIGH);
 break;
}
 if (contatore > 2 ){
 digitalWrite(semaforo_rosso,HIGH);
 digitalWrite(semaforo_verde,LOW);
 digitalWrite(semaforo_giallo,LOW);
 contatore=0;
 }

perché quel if? puoi farlo con un case 3 oppure con default.

switch ( contatore ){
 case 1 :
 digitalWrite(semaforo_rosso,LOW); 
 digitalWrite(semaforo_verde,HIGH);
 break;
 case 2 : 
 digitalWrite(semaforo_giallo,HIGH);
 break;
 case 3 :        // oppure default:
 digitalWrite(semaforo_rosso,HIGH);
 digitalWrite(semaforo_verde,LOW);
 digitalWrite(semaforo_giallo,LOW);
 contatore=0;
 break;
 }

non consideri il caso contatore=0;

https://www.arduino.cc/en/Reference/SwitchCase

Ciao Uwe

Ciao Uwe ti ringrazio per la dritta. Guido

Io ho un programma simile da fare:ho un incrocio strdale e devo usare gli switch case e millis ma senza pulsanti…potreste aiutarmi?

NicholasScattolin: Io ho un programma simile da fare:ho un incrocio strdale e devo usare gli switch case e millis ma senza pulsanti...potreste aiutarmi?

Benvenuto. Essendo il tuo primo post, nel rispetto del regolamento, ti chiediamo cortesemente di presentarti QUI (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con attenzione il su citato REGOLAMENTO... Grazie. Qui una serie di link utili, non inerenti al tuo problema: - qui una serie di schede by xxxPighi per i collegamenti elettronici vari: ABC - Arduino Basic Connections - qui le pinout delle varie schede by xxxPighi: Pinout - qui una serie di link [u]generali[/u] utili: Link Utili