Probleme code débutant

Bonjour,
J'ai decouvert l'Arduino depuis peu en remettant en route mon train electrique pour mon fils que j'aimerai controler automatiquement.

Je bute deja sur un probleme que je n'arrive pas à resoudre et qui parait pourtant trés simple

Pour contrôler le tout, j' utilise des boutons poussoirs pour ne pas avoir de commutateurs qui gardent une position physique.

mon but: un "tronçon de voie" a 3 états : arret(3), en attente pour arret(2) et marche(1)

je veux qu'a chaque pression sur le bouton poussoir, je change d'état, hors, à chaque fois le code "if"s'execute" plusieurs fois jusqu'a ce que je sois à l'état 3. lorsque je ré-appuie sur le bouton "if" se rejoue 3 fois.
A chaque fois, j'affiche dans le serial "fin de switch", donc je pense que c'est bien un probleme sur mon code if.
Merci beaucoup !!

int pinBoutonTroncon1=2; //variable des pins ou sont branchés les boutons
int pinBoutonTroncon2;
int pinBoutonTroncon3;
int pinBoutonTroncon4;

int pinTroncon1=2;  //pin des sorties vers relais des troncons 
int pinTroncon2;
int pinTroncon3;
int pinTroncon4;

int troncon1=1;  //etat des troncons :
int troncon2=0;  //etat 1 : train passe, feu vert
int troncon3=0;  //etat 2 : voie alimentée, feu rouge, detecteur de mouvement
int troncon4=0;  //etat 3 : voie coupée, feu rouge

int pinFeuRougeT1=3; // feu rouge
int pinFeuVertT1;





void setup() {
  Serial.begin(9600);
  pinMode(pinBoutonTroncon1,INPUT);
  pinMode(pinBoutonTroncon1,INPUT);
  pinMode(pinBoutonTroncon1,INPUT);
  pinMode(pinBoutonTroncon1,INPUT);

  pinMode(pinTroncon1,OUTPUT);
  pinMode(pinTroncon1,OUTPUT);
  pinMode(pinTroncon1,OUTPUT);
  pinMode(pinTroncon1,OUTPUT);

  pinMode(pinFeuRougeT1,OUTPUT);

} //Fin Void setup

void loop() {

 
  boolean b1=digitalRead(pinBoutonTroncon1); //surveillance du bouton 1
  
  if (b1==1) {   
    delay(100);      
    b1=0;
    Serial.println(b1);
    troncon1++;
    if (troncon1==4) {troncon1=1;}
    Serial.print("Bouton troncon 1 enfoncé . Etat actuel :");
    Serial.println(troncon1);
    switch(troncon1){
      case 1:
           // passage à l etat 2 : la voie passe toujours et le feu doit passer au rouge, la led rouge doit clignoter, la verte doit s'eiteindre
         Serial.println("passage à l etat 2"); 
         digitalWrite(pinTroncon1, HIGH );
         digitalWrite(pinFeuRougeT1, HIGH);
         digitalWrite(pinFeuVertT1, LOW);
         
       
         break;
          
         
      case 2:
         // passage à 2 etat 3 : le train s'arrete et le feu reste au rouge, la led est rouge
         Serial.println("passage à l état 3");
         digitalWrite(pinTroncon1, LOW);
         digitalWrite(pinFeuRougeT1, HIGH);
         digitalWrite(pinFeuVertT1, LOW);
         
         
         
         break; 
             
            
      case 3:
        // passage à 3 etat 1 : la voie passe et le feu passe au vert, la led doit rouge doit s'éteindre et la verte s'allumer
         Serial.println("passage à l état 1"); 
         digitalWrite(pinTroncon1, HIGH);
         digitalWrite(pinFeuRougeT1, LOW);
         digitalWrite(pinFeuVertT1, HIGH);
         
         break;
         

       
      }//fin de switch
      
    Serial.println("fin du switch");
    
    }//fin de if
    b1=0;
 
 
}


// fin void loop

Va regarder dans les tutoriel et cours il y a un sujet de JML sur les machines à états, je pense que ce sera plus adapter à ce que tu veux faire.

Tu n'as pas initialisé pinFeuVertT1 donc les digitalWrite peuvent poser des problèmes.

Si tu envisages plusieurs tronçons, tu auras intérêt à déclarer tes pins dans un tableau pour simplifier ton code avec des boucles for.

int pinBoutonTroncon1=2; //variable des pins ou sont branchés les boutons
int pinBoutonTroncon2;
int pinBoutonTroncon3;
int pinBoutonTroncon4;

int pinTroncon1=2;  //pin des sorties vers relais des troncons
int pinTroncon2;
int pinTroncon3;
int pinTroncon4;

çà me semble bizarre

A LIRE

Se pose aussi la question du câblage des boutons.

Ici je comprend qu'il se trouve entre vcc (+5v ou +3.3V) et pin de l'arduino ainsi que la présence d'une résistance de tirage à 0.

Est-ce le cas?

Tu boucles à travers tous les états car tu ne testes pas si le bouton a été relâché après avoir détecté un appui.
Il faudrait modifier ton code ainsi:

      }//fin de switch
      while(digitalRead(pinBoutonTroncon1)==1); // attente tant que le bouton est appuyé
    Serial.println("fin du switch");

Merci de vos retours, je m'en suis sorti et j'ai réécrit mon code de façon plus logique

Bien vu Elektrax,j'avais mis des valeurs au pif, pour l'instant rien n'est branché sauf la led feu rouge et j'avais affecté 2 fois le pin 2 c'est ce qui me désactivait le bouton dans le cas 3.
De ce fait, ce dernier fournissait des infos aléatoires dont des 1

Pour le fonctionnement en machine a état, j'était pas mal parti. En suivant le code de JML, La grande simplification a par contre été l'utilisation de la bibliothèque simple bouton.

fdufnews:
Tu boucles à travers tous les états car tu ne testes pas si le bouton a été relâché après avoir détecté un appui.
Il faudrait modifier ton code ainsi:

      }//fin de switch

while(digitalRead(pinBoutonTroncon1)==1); // attente tant que le bouton est appuyé
    Serial.println("fin du switch");

Non, c'est vrai mai j'avai mis un delay de 100ms et un remise à zero de b1, je pense que ça fonctionnait pour un appui court. j'ai maintenant remplacé par simlpeBouton

Mettre b1 à zéro ne change rien, si tu relis son état et qu'il est toujours appuyé.
La temporisation peut être pénalisante pour le reste du programme.
Il y a plusieurs façon de gérer le problème:

  • attendre le relâchement du bouton c'est le plus simple mais cela bloque le reste du programme ce qui peut être facheux
  • mémoriser l'état du bouton et à l'itération suivante de la boucle regarder s'il a changé. Cette solution est un peu plus complexe mais elle présente l'avantage de ne pas bloquer l'exécution du programme.