Semáforo Automatizado Doble

Hola! Estoy haciendo un proyecto de un cruce de vehículos, en este instante estoy programando el semáforo, pero a la hora del void loop funciona sólo una vez, por que no se vuelven a cumplir las condiciones, alguien me puede ayudar con eso? El código está casi completo, aquí lo mando! De antemano gracias!

// Semaforo de autos 1;
int ledState1 = LOW;   // pin 9 verde         
int ledState2 = LOW;   // pin 8 amarillo
int ledState3 = LOW;   // pin 7 rojo
//Semaforo de autos 2;
int ledState4 = LOW;  // pin 6 verde
int ledState5 = LOW;  // pin 5 amarillo
int ledState6 = LOW;  // pin 4 rojo
void setup() {
 pinMode(9, OUTPUT);
 pinMode(8, OUTPUT);
 pinMode(7, OUTPUT);
 pinMode(6, OUTPUT);
 pinMode(5, OUTPUT);
 pinMode(4, OUTPUT); 




}

void loop() {
long previousMillis1=0;
long previousMillis2=0;
long previousMillis3=0;
long previousMillis4=0; 
long interval1 = 0;
long interval2 = 5000;
long interval3 = 6000;
long interval4 = 10000;
unsigned long currentMillis = millis();

 if(currentMillis - previousMillis1 == interval1)
 {
   ledState2 = LOW;
   ledState3 = LOW;
   ledState4 = LOW;
   ledState5 = LOW;
   if (ledState1 == LOW){
     ledState1 = HIGH;
     ledState6 = HIGH;
      digitalWrite(9,ledState1);
      digitalWrite(8,ledState2);
      digitalWrite(7,ledState3);
      digitalWrite(6,ledState4);
      digitalWrite(5,ledState5);
      digitalWrite(4,ledState6);
   }else{
       ledState1 = LOW;
       ledState6 = LOW;   
       }
      
      }
      
   if(currentMillis - previousMillis2 == interval2 && ledState6 == HIGH)
 {
   
   ledState3 = LOW;
   ledState5 = LOW;
   ledState4 = LOW;
   previousMillis2 = currentMillis;
   if (ledState2 == LOW){
     ledState1 = LOW;
     ledState2 = HIGH;
     ledState6 = HIGH;
      digitalWrite(9,ledState1);
      digitalWrite(8,ledState2);
      digitalWrite(7,ledState3);
      digitalWrite(6,ledState4);
      digitalWrite(5,ledState5);
      digitalWrite(4,ledState6);
   }else{
       ledState1 = LOW;
       ledState6 = LOW;   
       }
      }

    if(currentMillis - previousMillis3 == interval3 && ledState2 == HIGH)
 {
   ledState1= LOW;
   ledState2 = LOW;
   ledState5 = LOW;
   ledState6= LOW;

   previousMillis3 = currentMillis;
   if (ledState3 == LOW){
     ledState3 = HIGH;
     ledState4 = HIGH;
      digitalWrite(9,ledState1);
      digitalWrite(8,ledState2);
      digitalWrite(7,ledState3);
      digitalWrite(6,ledState4);
      digitalWrite(5,ledState5);
      digitalWrite(4,ledState6); 
   }else{
       ledState3 = LOW;
       ledState4 = LOW;   
   } 
 }
 if(currentMillis - previousMillis4 == interval4 && ledState3 == HIGH)
 {
   ledState2 = LOW;
   ledState3 = LOW;
   ledState4 = LOW;
   previousMillis4 = currentMillis;
   if (ledState5 == LOW){
     ledState3 = HIGH;
     ledState5 = HIGH;
      digitalWrite(9,ledState1);
      digitalWrite(8,ledState2);
      digitalWrite(7,ledState3);
      digitalWrite(6,ledState4);
      digitalWrite(5,ledState5);
      digitalWrite(4,ledState6);
   }else{
       ledState3 = LOW;
       ledState5 = LOW;   
       }
      }
      

 }

De las siguientes variables:

long previousMillis1=0;
long previousMillis2=0;
long previousMillis3=0;
long previousMillis4=0;
long interval1 = 0;
long interval2 = 5000;
long interval3 = 6000;
long interval4 = 10000;
unsigned long currentMillis = millis();
  • Los previousMillis deben ser globales o declarados con la palabra static.
  • Los interval deben ser globales y empezar con la palabra const.
  • Solamente currentMillis puede quedarse dentro del loop sin ningún cambio.
  • Todas las variables deberían ser de tipo unsigned long (exonera al microprocesador del sobrecargo que genera lidiar con signo). Además, por el contexto no deberían existir valores negativos.

Cierto, gracias! pero ahora como lo hago para que sea eterno? sigue deteniéndose aún