Traverse pieton à deux zone ( deuxieme pieton)

Bonjour,
Je ne suis pas un pro de la programmation mais j'aime bien essayer... je suis sur un petit projet depuis quelques temps mais il me reste quelques bugs à regler dont celui décrit ci-dessous.

voici la description
.
Une traverse de piéton dans les vois de chariot élévateur.
J'ai deux zone a couvrir

le projet couvre trois porte de garage dans lesquels j'ai mis des strips RGB

la zone1 a deux portes (1 et 2)

la zone2 a 1 seul porte mais comme la porte 2 est entre les deux zone j'ai garder l'option de pouvoir la controller avec une ou l'autres des zone C'est pourquoi elle n'est pas directement connecter avec la porte 1.

il y a aussi des enseignes illumimées pour signaler au piéton qu'il peut traversé ( pictogram Main et Marcheur)

Les leds sont vert et les mais sont allumées au depart.

Si quelqu'un appuis sur un bouton voici ce qui ce passe dans la zone ou il veut traversé

Jaune et main allumée pendant 2500mS.
rouge et Marcheur allumé Pendant 5000mS.
rouge clignotte et Main allimée 2500mS.

Là ou ca accroche c'est quand un deuxieme piéton veux traversé et que la premiere étape ( Jaune et main allumée ), le cycle recommence au début plutot que de recommencer à l'étape (rouge et Marcheur allumé Pendant 5000mS)

j'ai essayé plusieurs facon dont celle-ci mais sans succes.

if ((buttonState2==HIGH) && (buttonflag2==1) && (currentMillis2 - previousMillis2 >= 2500 ))
//then
previousMillis2 = currentMillis2 + 2501;
if ((buttonState2==HIGH) && (buttonflag2==0))

voici le code entier

Merci

//CONSTANTS

const int BUTTON_PIN9 = 9; // Button2
const int BUTTON_PIN10 = 10; // Button3
const int Zone1Vert = 7;
const int Zone1Rouge = 8;
const int Zone2Vert = 3;
const int Zone2Rouge = 4;
const int Zone3Vert = 5;
const int Zone3Rouge = 6;
const int Stop1 = A0; //relay 13
const int Walk1 = A1; //relay 10
const int Stop3 = A2; //relAY 11
const int Walk3 = A4; //relay14

//VARIABLES


int buttonState1 = 0;         // current state of the button
int buttonState2 = 0;         // current state of the button
int lastButtonState = 0;     // previous state of the button
bool relayOn1 = false;
bool relayOn2 = false;
bool relayOn3 = false;
bool buttonflag = 0;
bool buttonflag2 = 0;

//MILLIS
unsigned long previousMillis = 0;
unsigned long previousMillis2 = 0;
const unsigned long interval = 10000;
const unsigned long redLedInterval = 2500;

//const unsigned long redLedInterval2 = 2500;


void setup()
{
  pinMode(BUTTON_PIN9, INPUT);
  digitalWrite(BUTTON_PIN9, HIGH); // pull-up
  pinMode(BUTTON_PIN10, INPUT);
  digitalWrite(BUTTON_PIN10, HIGH); // pull-up
  Serial.begin(9600);
  
  pinMode(Zone1Vert, OUTPUT);
  pinMode(Zone1Rouge, OUTPUT);
  pinMode(Zone2Vert, OUTPUT);
  pinMode(Zone2Rouge, OUTPUT);
  pinMode(Zone3Vert, OUTPUT);
  pinMode(Zone3Rouge, OUTPUT);
  pinMode(Stop1, OUTPUT);
  pinMode(Walk1, OUTPUT);
  pinMode(Stop3, OUTPUT);
  pinMode(Walk3, OUTPUT);
  
  
  //SWITCH HANDLERS
  
  digitalWrite(Zone1Vert, HIGH);
  
  digitalWrite(Zone2Vert, HIGH);
  
  digitalWrite(Zone3Vert, HIGH);
  
  digitalWrite(Stop1, HIGH);
  digitalWrite(Walk1, LOW);
  
  digitalWrite(Stop3, HIGH);
  digitalWrite(Walk3, LOW);
  
}


void loop(){
  
  // read the pushbutton input pin:
  buttonState1 = digitalRead(BUTTON_PIN9);
  buttonState2 = digitalRead(BUTTON_PIN10);
  unsigned long currentMillis1 = millis();
  unsigned long currentMillis2 = millis();
  
  
   //if 
  if ((buttonState1==HIGH) && (buttonflag==1) && (currentMillis1 - previousMillis >= 2500 ))
    //then
    previousMillis = currentMillis1 + 2501; 
   if ((buttonState1==HIGH) && (buttonflag==0))
   
  {
    previousMillis = currentMillis1;
    digitalWrite(Zone1Rouge, HIGH);
    digitalWrite(Zone2Rouge, HIGH);
    digitalWrite(Zone2Vert, HIGH);
    digitalWrite(Zone1Vert, HIGH);
    digitalWrite(Stop1,HIGH);
    buttonflag = 1;
    relayOn1 = true;
  }
  
  
  if( relayOn1 )
  { 
    
     
    if (currentMillis1 - previousMillis >= 2500 ){
      digitalWrite(Zone1Vert, LOW);
      digitalWrite(Walk1, HIGH);
      
      }
    
    if (currentMillis1 - previousMillis >= 2500 ){
      digitalWrite(Zone2Vert, LOW);
      digitalWrite(Stop1,LOW);
      
    }  
    // if enough time has elapsed, turn of the relay
    if (currentMillis1 - previousMillis >= 7500 )
    {
      digitalWrite(Walk1,LOW);
      digitalWrite(Stop1, (millis()/100)%2);
      digitalWrite(Zone1Rouge, (millis()/100)%2);
      digitalWrite(Zone2Rouge, (millis()/100)%2); 
      
      }   
    
    if (currentMillis1 - previousMillis >= interval)
    {
      buttonflag = 0;
      digitalWrite(Zone1Vert, HIGH);
      digitalWrite(Zone2Vert, HIGH);
      digitalWrite(Stop1, HIGH);
      digitalWrite(Zone1Rouge, LOW);
      digitalWrite(Zone2Rouge, LOW);
      //digitalWrite(Walk1, LOW);
      relayOn1 = false;
    }
    
  
    Serial.write("Pieton present zone 1");   
    Serial.println(relayOn1);
  }
  
  
  
  // boucle zone 2 
  
  
    //if 
  if ((buttonState2==HIGH) && (buttonflag2==1) && (currentMillis2 - previousMillis2 >= 2500 ))
    //then
    previousMillis2 = currentMillis2 + 2501; 
   if ((buttonState2==HIGH) && (buttonflag2==0))
  
  {
    previousMillis2 = currentMillis2;
    //digitalWrite(Walk3, LOW);
    digitalWrite(Zone3Rouge, HIGH); 
    digitalWrite(Zone3Vert, HIGH);
    digitalWrite(Stop3, HIGH);
    buttonflag2 = 1;
   relayOn2 = true; 
    
  }
  
  
  if( relayOn2 )
  {
    
    
    if (currentMillis2 - previousMillis2 >= 2500 ){
      digitalWrite(Zone3Vert, LOW);
      digitalWrite(Walk3, HIGH);}
    
    if (currentMillis2 - previousMillis2 >= 2500 )
    {
      
      digitalWrite(Stop3, LOW);
      }
    if (currentMillis2 - previousMillis2 >= 7500 ){
      digitalWrite(Walk3,LOW);
      digitalWrite(Stop3, (millis()/100)%2);
      digitalWrite(Zone3Rouge, (millis()/100)%2);
     
      }
    
    if (currentMillis2 - previousMillis2 >= interval)
      
    
    {
       buttonflag2 = 0;
      digitalWrite(Zone3Vert, HIGH);
      digitalWrite(Stop3, HIGH);
      digitalWrite(Zone3Rouge, LOW);
      digitalWrite(Walk3, LOW);
      relayOn2 = false;
    }
    
     
  }
}

C'est typiquement une (ou des) machine(s) à états.
Je pense que tu gagnerais à partir dans cette voie cela simplifierait ton code et le rendrait, je pense, plus lisible.
Déjà il faudrait être clair sur l'indépendance de la gestion des zones, cela fixera s'il y a une ou plusieurs machines à états à coder.
Ensuite décrire précisément pour chaque machine à état ses entrées, ses états et les conditions qui font passer d'un état à un autre.
Une fois ce travail fait le codage devrait être plus facile. Et la maintenance de ton code sera plus facile si tu dois faire plus tard des modifications ou des corrections.

ok je vais regarder ca

j'ai trouvé ce tutoriel de J-M-L qui explique les machine à état

Merci