Besoin d'aide bouton poussoir

Bonjour ou bonsoir,
je suis débutant sur le logiciel Tinkercad et j'aimerai savoir quelles sont les problèmes dans ce code et avoir votre avis dessus le but du bouton est de faire passer le feu 2 (celui a gauche en orange puis rouge) tout en respectant le séquencement des feux. Merci d'avoir pris le temps ! :slight_smile:

const int led_rouge_feux_1 = 4;
const int led_jaune_feux_1 = 3;
const int led_verte_feux_1 = 2;
const int led_rouge_feux_2 = 7;
const int led_jaune_feux_2 = 6;
const int led_verte_feux_2 = 5;
const int led_verte_pieton = A0;
const int led_rouge_pieton = A2;
int pinBouton;


 



void setup()
{
  Serial.begin(9600);
  pinBouton = A4;
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(7, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(led_verte_pieton, OUTPUT);
  pinMode(pinBouton, INPUT);
  pinMode(led_rouge_pieton, OUTPUT);
  pinMode(5,  OUTPUT);
  
  
  
  
 }
  
void loop()
{
  boolean etatBouton= digitalRead(pinBouton);
    
  if (etatBouton == HIGH)
  {
    Serial.println ("J'appuie sur le bouton");
    
    digitalWrite(led_rouge_feux_1, HIGH);
    digitalWrite(led_jaune_feux_1, LOW);
    digitalWrite(led_verte_feux_1, LOW);
    digitalWrite(led_rouge_feux_2, LOW);
    digitalWrite(led_jaune_feux_2, HIGH);
    digitalWrite(led_verte_feux_2, LOW);
    digitalWrite(led_verte_pieton, LOW);
    digitalWrite(led_rouge_pieton, HIGH);
    delay(1000);
    
   
    digitalWrite(led_rouge_feux_1, LOW);
    digitalWrite(led_jaune_feux_1, LOW);
    digitalWrite(led_verte_feux_1, HIGH);
    digitalWrite(led_rouge_feux_2, HIGH);
    digitalWrite(led_jaune_feux_2, LOW);
    digitalWrite(led_verte_feux_2, LOW);
    digitalWrite(led_verte_pieton, HIGH);
    digitalWrite(led_rouge_pieton, LOW);
    delay(1000);
    
    digitalWrite(led_rouge_feux_1, HIGH);
    digitalWrite(led_jaune_feux_1, LOW);
    digitalWrite(led_verte_feux_1, LOW);
    digitalWrite(led_rouge_feux_2, LOW);
    digitalWrite(led_jaune_feux_2, LOW);
    digitalWrite(led_verte_feux_2, HIGH);
    digitalWrite(led_verte_pieton, LOW);
    digitalWrite(led_rouge_pieton, HIGH);
    delay(1000);
    
    
  }
  


    
    else 
    {
      Serial.println ("Je n'appuie pas sur le bouton");
      digitalWrite(led_verte_pieton, HIGH);
    
     digitalWrite(led_rouge_feux_1, HIGH);
    digitalWrite(led_jaune_feux_1, LOW);
    digitalWrite(led_verte_feux_1, LOW);
    digitalWrite(led_rouge_feux_2, HIGH);
    digitalWrite(led_jaune_feux_2, LOW);
    digitalWrite(led_verte_feux_2, LOW);
    digitalWrite(led_verte_pieton, HIGH);
    digitalWrite(led_rouge_pieton, LOW);
    delay(2000);

   
  digitalWrite(led_rouge_feux_1, LOW);
    digitalWrite(led_jaune_feux_1, LOW);
    digitalWrite(led_verte_feux_1, HIGH);
    digitalWrite(led_rouge_feux_2, HIGH);
    digitalWrite(led_jaune_feux_2, LOW);
    digitalWrite(led_verte_feux_2, LOW);
    digitalWrite(led_verte_pieton, HIGH);
    digitalWrite(led_rouge_pieton, LOW);
    delay(3000);
  
   digitalWrite(led_rouge_feux_1,LOW);
    digitalWrite(led_jaune_feux_1, HIGH);
    digitalWrite(led_verte_feux_1, LOW);
    digitalWrite(led_rouge_feux_2, HIGH);
    digitalWrite(led_jaune_feux_2, LOW);
    digitalWrite(led_verte_feux_2, LOW);
    digitalWrite(led_verte_pieton, HIGH);
    digitalWrite(led_rouge_pieton, LOW);
    delay(3000);
  
   digitalWrite(led_rouge_feux_1, HIGH);
    digitalWrite(led_jaune_feux_1, LOW);
    digitalWrite(led_verte_feux_1, LOW);
    digitalWrite(led_rouge_feux_2, HIGH);
    digitalWrite(led_jaune_feux_2, LOW);
    digitalWrite(led_verte_feux_2, LOW);
    digitalWrite(led_verte_pieton, HIGH);
    digitalWrite(led_rouge_pieton, LOW);
  delay(2000);
  
   digitalWrite(led_rouge_feux_1, HIGH);
    digitalWrite(led_jaune_feux_1, LOW);
    digitalWrite(led_verte_feux_1, LOW);
    digitalWrite(led_rouge_feux_2, LOW);
    digitalWrite(led_jaune_feux_2, LOW);
    digitalWrite(led_verte_feux_2, HIGH);
    digitalWrite(led_verte_pieton, LOW);
    digitalWrite(led_rouge_pieton, HIGH);
    delay(3000);
  
    digitalWrite(led_rouge_feux_1, HIGH);
    digitalWrite(led_jaune_feux_1, LOW);
    digitalWrite(led_verte_feux_1, LOW);
    digitalWrite(led_rouge_feux_2, LOW);
    digitalWrite(led_jaune_feux_2, HIGH);
    digitalWrite(led_verte_feux_2, LOW);
    digitalWrite(led_verte_pieton, LOW);
    digitalWrite(led_rouge_pieton, HIGH);
    delay(3000);
      
    digitalWrite(led_rouge_feux_1, HIGH);
    digitalWrite(led_jaune_feux_1, LOW);
    digitalWrite(led_verte_feux_1, LOW);
    digitalWrite(led_rouge_feux_2, LOW);
    digitalWrite(led_jaune_feux_2, HIGH);
    digitalWrite(led_verte_feux_2, LOW);
    digitalWrite(led_verte_pieton, LOW);
    digitalWrite(led_rouge_pieton, HIGH);
    delay(3000);
    
      
      
     
  }
}
    
}

pourquoi vous faites ça ?

const int led_rouge_feux_2 = 7;
...
pinMode(7, OUTPUT);
...
pinMode(led_rouge_feux_2, OUTPUT);

comment est câblé le bouton ? comment gérez vous les rebonds ?

quel est exactement le cahier des charges ? ici une fois le bouton appuyé tout se déroule sans que vous ne puissiez rien y faire...

J-M-L:
pourquoi vous faites ça ?

const int led_rouge_feux_2 = 7;

...
pinMode(7, OUTPUT);
...
pinMode(led_rouge_feux_2, OUTPUT);




comment est câblé le bouton ? comment gérez vous les rebonds ?

quel est exactement le cahier des charges ? ici une fois le bouton appuyé tout se déroule sans que vous ne puissiez rien y faire...

En effet c'était une erreur de copier coller, ce sont des feux de carrefour, le bouton poussoir permet de faire passer le feu au orange puis au rouge permettant au piéton de traverser normalement cela à été modifié

Votre image

C’est typiquement une définition de programme qui se prête bien à la programmation par machine à états (cf mon tuto éventuellement)

J-M-L:
Votre image

C’est typiquement une définition de programme qui se prête bien à la programmation par machine à états (cf mon tuto éventuellement)

Bonjour j'utilise uniquement le simulateur "Tinkercad" il me semble que nous pouvons pas intégrer de bibliothèques qui n'est pas directement proposées par ce logiciel. Merci de votre réponse !

l'approche par machine à état c'est une façon de coder des "automates", donc il n'y a pas besoin de bibliothèque, juste vous et votre code qui formalisez un peu la chose :slight_smile:

Mon tuto montre un exemple (j'ai utilisé une bibliothèque pour les boutons mais vous pouvez aussi le coder vous même)

J-M-L:
l'approche par machine à état c'est une façon de coder des "automates", donc il n'y a pas besoin de bibliothèque, juste vous et votre code qui formalisez un peu la chose :slight_smile:

Mon tuto montre un exemple (j'ai utilisé une bibliothèque pour les boutons mais vous pouvez aussi le coder vous même)

Du coup, ce que j'ai fait plus haut n'est pas bon ? Je n'ai pas bien codé le bouton ainsi que la condition "if et "else" ? Je suis un peu perdu.

c ' est pas que ca n ' est pas bon , c ' est que c ' est lourd a gerer , ca risque de finir avec un truc comme ca :

if ( le feu machin ) {
	if (labelValue >= RELAY_START_PIN && labelValue < RELAY_NUMBER_V + RELAY_START_PIN ) {
		
		if (lesVolets[num_V].position_V == ARRET_INTER) {
			if ( feu_vert1 && feuorange==false) {
				// etc ...
			}
		}
		else if (lesVolets[num_V].position_V == EN_DESCENTE) {
		
		}
		else if (lesVolets[num_V].position_V == EN_MONTEE) {
		
		}
		else if (lesVolets[num_V].position_V == EN_BAS) {
		
		}
		else if (lesVolets[num_V].position_V == EN_MONTEE) {
		
		}
	}
}

a se cogner la tete contre les murs ! :grin:

Mis à part le fait que vous mettez un entier dans un booléen que vous comparez ensuite à HIGH et que vous déclarez des N° de pins que vous utilisez à moitié, votre code fait "un truc" ==> pour le moment votre loop() ressemble à cela

void loop()
{
  if (digitalRead(pinBouton) == HIGH) {
    Serial.println ("J'appuie sur le bouton");
    ... ; delay(1000);
    ... ; delay(1000);
    ... ; delay(1000);
  } else {
    Serial.println ("Je n'appuie pas sur le bouton");
    ... ; delay(2000);
    ... ; delay(3000);
    ... ; delay(3000);
    ... ; delay(2000);
    ... ; delay(3000);
    ... ; delay(3000);
    ... ; delay(3000);
  }
}

donc si à la lecture le bouton est HIGH vous partez et êtes coincé dans une animation qui dure 3 secondes, s'il est LOW vous êtes coincé dans une animation qui dure 19 secondes.

Pendant l'animation le bouton ne fait rien du tout puisqu'il n'est pas lu.

Si c'est ce que vous voulez que ça fasse alors ça le fait. Si vous voulez que ça fasse autre chose il faut coder différemment...