semaforo (maquina de estado y millis)

buenos días , tengo un problema con mi código desarrolle con la información de los foros y Internet, un semáforo con maquina de estado y la función millis para que mi código detecte el pulso en cualquier tiempo en el cual le agregue un pulso de regreso (resetear el verde, regrese al primer case y empezar el tiempo de nuevo)pero me doy cuenta que no lo hace sino hasta el final del tiempo, y deseo en el tiempo completo del verde capte el pulso del botón y se reinicie el verde. espero y me entienda, saludos

const int verde1 = 4;                // Semaforo 1
const int amarillo1 = 3;
const int rojo1 = 2;
const int button1 = 13;                          //Boton 
int time=0;                          //Declarar el valor de la variable time (case
unsigned long previusMillis=0;       // Funcion millis
unsigned long interval=1000;
int ledState=LOW;
int buttonState1=0;                   //Declarar el valor de la variable boton S1
int buttonState2=0;                   //Declarar el valor de la variable boton S2


void setup() {                        // Declarar los pines de salida indicadores y botones
pinMode(amarillo1, OUTPUT);
pinMode(rojo1,OUTPUT);
pinMode(verde1,OUTPUT);
pinMode(button1,INPUT);

}

void loop()
{
  buttonState1 = digitalRead(button1);
  
unsigned long currentMillis = millis();
if ((unsigned long)(currentMillis - previusMillis) >= interval)
{
previusMillis = currentMillis;

switch(time)
{
case 1:                         // verde encendido 1sg
digitalWrite(verde1,HIGH);
digitalWrite(amarillo1,LOW);
digitalWrite(rojo1,LOW);
     
  if (buttonState1 == HIGH) {         //boton S1 resetea el semaforo 1
  delay(100);
    // turn LED on:
   time = 0;
    }
 interval=5000;   
break;

case 2:                          
digitalWrite(verde1,LOW);
digitalWrite(amarillo1,LOW);
digitalWrite(rojo1,LOW);
  interval=1000;

if (buttonState1 == HIGH) {        
  delay(100);
    // turn LED on:
   time = 0;
    }

break;

case 3:                               
digitalWrite(verde1,HIGH);
digitalWrite(amarillo1,LOW);
digitalWrite(rojo1,LOW);
  interval=1000;

if (buttonState1 == HIGH) {           
    delay(100);
    
   time = 0;
    }   

   
break;
case 4:                                                
digitalWrite(verde1,LOW);
digitalWrite(amarillo1,HIGH);
digitalWrite(rojo1,LOW);
  interval=1000;

if (buttonState1 == HIGH) {             
      delay(100);
   time = 0;
    }

break;
case 5:
digitalWrite(verde1,LOW);
digitalWrite(amarillo1,LOW);
digitalWrite(rojo1,HIGH);
interval = 1000;
  
break;



}
time++;
if(time>8)
time=1;
}
}

Hola Entonces quieres que aunque esté en cualquier color al pulsar el botón, el semáforo regrese al verde? o solo si está en verde se regrese el tiempo a 0? Veo varios errores en tu código, voy a modificarlo y te pongo con mayúsculas los comentarios para distinguirlos de los tuyos Ah, y porque tienes un interval=1000 y luego lo cambias a 5000? cuanto tiempo quieres que dure cada color?

Yo pago la ronda de cervezas, alguien que usa millis() y máquina de estados!!! Qué esta pasando en el mundo?

Venga! yo pido la primera! Estamos cerca de que todo mundo lea las normas del foro antes de su primer post

Que tal así :

const byte verde1 = 4;           //4     // Semaforo 1
const byte amarillo1 =3;        //3
const byte rojo1 = 2;            //2
const byte button1 = 13;        //13                    //Boton 

byte time=1;                          //Declarar el valor de la variable time (case
unsigned long previusMillis=0;       // Funcion millis
unsigned long interval;

//AQUI  TIENES LOS TIEMPO DE DURACION DE CADA LUZ  
unsigned long tiempoVerde=5000,        //puedes cambiarlos segun tus necesidades
              tiempoAmarillo=1000,
              tiempoRojo=8000; 

//int ledState=LOW;
bool buttonState1=0;                   //Declarar el valor de la variable boton S1
//bool buttonState2=0;                   //Declarar el valor de la variable boton S2


void setup() {                        // Declarar los pines de salida indicadores y botones
pinMode(amarillo1, OUTPUT);
pinMode(rojo1,OUTPUT);
pinMode(verde1,OUTPUT);
pinMode(button1,INPUT);

}

void loop()
{
  buttonState1 = digitalRead(button1);
    
    if (buttonState1)
      time=1;
    

//unsigned long currentMillis = millis(); ESTO ES REDUNDANTE
/// ESTO NO VA ASI: if ((unsigned long)(currentMillis - previusMillis) >= interval)    lo correcto seria asi: if(millis()-previusMillis >= interval)

    switch(time)
    {
        case 1:                         // verde encendido 1sg
            digitalWrite(verde1,HIGH);
            digitalWrite(amarillo1,LOW);
            digitalWrite(rojo1,LOW);
                        interval=tiempoVerde;
            previusMillis=millis();
            time=2;
     
  //if (buttonState1 == HIGH) {         //boton S1 resetea el semaforo 1
  //delay(100);      NO DEBES USAR DELAY SI QUIERES QUE LAS COSAS FUNCIONEN BIEN
    // turn LED on:
   //time = 0;     //PARA QUE PONES 0? Si no hay ningún case 0?
    //}
 //interval=5000;     //
            break;

        case 2:
            

            if(millis() -previusMillis>=interval){
              digitalWrite(verde1,LOW);
              digitalWrite(amarillo1,HIGH);
                digitalWrite(rojo1,LOW);
                time=3;
                previusMillis=millis();
                interval=tiempoAmarillo;   
            } 

            break;
            
        case 3:

            if(millis() -previusMillis>=interval){
              digitalWrite(verde1,LOW);
                digitalWrite(amarillo1,LOW);
                digitalWrite(rojo1,HIGH);
                time=4;
                previusMillis=millis();
                interval=tiempoRojo;
                }      
             break;

        case 4:
            if(millis() -previusMillis>=interval)
                  time=1;
               break;   

//if (buttonState1 == HIGH) {        
 // delay(100);        //SACA LOS DELAY DE TU VIDA...  NI PARA  ELIMINAR LOS REBOTES LOS USES
    // turn LED on:
   //time = 0;
    //}
//time++;
//if(time>8)    PORQUE: TIME >8? si solo llegas a case 5
//time=1;
}
}

buenos dias, gracias si tenia errores por que lo habia hecho mas extenso por que lo estoy haciendo con dos semaforos pero preferi borrarlos para que mi programacion sea mas entendible, aunque igual ya vi errores que si estaba mal, ps si RIG solo en verde deseo por que lo quiero resetear para no afectar por ejemplo en una avenida(por un control una comunicacion nrf en un futuro), gracias se lo agradezco lo probare.

gracias a los post de arduino ya estoy utilizando en vez de delay a millis, ya investigare los rebotes sin delays gracias disculpen si tuve un error en las normas (Cual fue? si las lei ja ), surbyte que tiene maquina de estados y en conjunto con millis jaj? no sea muy duro conmigo jaja, saludos a los dos gracias por sus opiniones

Bien, el código quedó para regresar a verde en cualquier estado, entonces cambia la lineas

    if (buttonState1)
      time=1;

por

if(buttonState1 && time==2)
                   previusMillis=millis();

Con eso solo se regresara el tiempo solo cuando el semáforo esté en verde Ahora si miras bien, no utilice ningún antirrebote, esto porque en este caso en especifico la función que realiza el botón no afectan los rebotes, inclusive sirve para que si se deja presionado el botón, la luz verde se quedara siempre encendida hasta que éste suelte En cuanto a lo que dijo @Surbyte lo dijo como un cumplido, porque la gran mayoría que viene con problemas es por usar delay() y tu hiciste lo correcto al utilizar millis()

buenos días, así es ya me di cuenta que queda en el case 1 y no afecta el rebote gracias RIG.

así quedaría (le agregue el parpadeo de verde)

//by RIG
//by lalo

const byte verde1 = 4;           //4     // Semaforo 1
const byte amarillo1 =3;        //3
const byte rojo1 = 2;            //2
const byte button1 = 12;        //13                    //Boton 
int ledState = LOW;
byte time=1;                          //Declarar el valor de la variable time (case
unsigned long previusMillis=0;       // Funcion millis
unsigned long interval;

//AQUI  TIENES LOS TIEMPO DE DURACION DE CADA LUZ  
unsigned long tiempoVerde=4000,        //puedes cambiarlos segun tus necesidades
              tiempoVerdeparpadeo=1000, 
              tiempoAmarillo=2000,
              tiempoRojo=3000; 


bool buttonState1=0;                   //Declarar el valor de la variable boton S1


void setup() {                        // Declarar los pines de salida indicadores y botones
pinMode(amarillo1,OUTPUT);
pinMode(rojo1,OUTPUT);
pinMode(verde1,OUTPUT);
pinMode(button1,INPUT);

}

void loop()
{
  buttonState1 = digitalRead(button1);
    
    if(buttonState1 && time==2)
                   previusMillis=millis();
                   
   
//unsigned long currentMillis = millis(); ESTO ES REDUNDANTE
/// ESTO NO VA ASI: if ((unsigned long)(currentMillis - previusMillis) >= interval)    lo correcto seria asi: if(millis()-previusMillis >= interval)

  switch(time)
  {
    case 1:                         // verde encendido 1sg
      digitalWrite(verde1,HIGH);
      digitalWrite(amarillo1,LOW);
      digitalWrite(rojo1,LOW);
       interval=tiempoVerde;
      previusMillis=millis();
      time=2;
     
  //if (buttonState1 == HIGH) {         //boton S1 resetea el semaforo 1
  //delay(100);      NO DEBES USAR DELAY SI QUIERES QUE LAS COSAS FUNCIONEN BIEN
    // turn LED on:
   //time = 0;     //PARA QUE PONES 0? Si no hay ningún case 0?
    //}
 //interval=5000;     //
        break;
  case 2:
        if(millis() -previusMillis>=interval){
          
   digitalWrite(verde1,LOW);
              digitalWrite(amarillo1,LOW);
            digitalWrite(rojo1,LOW);
         time=3;
        previusMillis=millis();
          interval=tiempoVerdeparpadeo;      
        }
                     
          break;
     case 3:
        if(millis() -previusMillis>=interval){
          
   digitalWrite(verde1,HIGH);
              digitalWrite(amarillo1,LOW);
            digitalWrite(rojo1,LOW);
         time=4;
        previusMillis=millis();
          interval=tiempoVerdeparpadeo;      
        }
                     
          break;      
        
         case 4:
        if(millis() -previusMillis>=interval){
          
   digitalWrite(verde1,LOW);
              digitalWrite(amarillo1,LOW);
            digitalWrite(rojo1,LOW);
         time=5;
        previusMillis=millis();
          interval=tiempoVerdeparpadeo;      
        }
                     
          break;
        case 5:
            

          if(millis() -previusMillis>=interval){
              digitalWrite(verde1,LOW);
              digitalWrite(amarillo1,HIGH);
            digitalWrite(rojo1,LOW);
            
        time=6;
        previusMillis=millis();
        interval=tiempoAmarillo;   
          } 

            break;
            
    case 6:

      if(millis() -previusMillis>=interval){
              digitalWrite(verde1,LOW);
        digitalWrite(amarillo1,LOW);
        digitalWrite(rojo1,HIGH);
        time=7;
        previusMillis=millis();
        interval=tiempoRojo;
                }     
          break;
  

    case 7:
      if(millis() -previusMillis>=interval)
               time=1;
        break;  
  }
}

y ya con la condición anterior me funcionaria para que regrese al case que yo quiera, ya que deseo agregar mas semáforos.

 if (buttonState1 && time==6)  //ejemplo 
          time =1;                       // ejemplo

muchas gracias, ya agregare mas semáforos saludos.