Bonjour, j'ai créé deux feux rouges avec deux feux de passage pieton. L'ensemble fonctionne plutôt bien, mais j'aimerai que lorsque je clique sur le bouton à n'importe quel moment de la boucle, les deux feux passent rouge et pieton passe vert.
Je vous laisse lire mon code que j'ai détaillé, là où je bloque c'est de verifier en continu l'etat du bouton.
/* DECLARATION DES PINS FEUX ROUGE */
const int feuRougeDroite = 13;
const int feuRougeGauche = 12;
const int feuOrangeDroite = 11;
const int feuOrangeGauche = 10;
const int feuVertDroite = 9;
const int feuVertGauche = 8;
/* DECLARATION DES PINS FEUX PIETONS */
const int pietonRougeDroite = 7;
const int pietonRougeGauche = 6;
const int pietonVertDroite = 5;
const int pietonVertGauche = 4;
/* DECLARATION PIN BOUTON PIETON + ETAT */
const int boutonPieton = 3;
int etatBoutonPieton = 0;
/* VERIFICATION DE L'ETAT DES FEUX */
int etatFeuDroite = 0; // 0 vert | 1 rouge
int etatFeuGauche = 0;
/* TABLE DES PINS DES FEUX */
const byte led[] = {4, 5, 6, 7, 8, 9, 10, 11, 12, 13};
void setup() {
Serial.begin(9600);
Serial.print("[LOG] Initialisation des feux.");
Serial.print('\n');
/* DECLARATION DES LEDS EN OUTPUT + ANIMATION */
for (int i = 0; i < 10; i++) {
pinMode(led[i], OUTPUT);
digitalWrite(led[i], HIGH);
delay(100);
}
delay(1000);
/* EXCTINCTION DE TOUS LES FEUX POUR ANIMATION */
for (int i = 0; i < 10; i++) {
digitalWrite(led[i], LOW);
}
Serial.print("[LOG] Initialisation des feux terminee.");
Serial.print('\n');
}
void loop() {
etatBoutonPieton = digitalRead(boutonPieton);
if(etatBoutonPieton == HIGH) { // Si appui bouton PIETON
Serial.print("[LOG] [PIETON] Action bouton prise en compte.");
Serial.print('\n');
delay(2000);
if(etatFeuDroite == 0) { // Si le feu de DROITE est VERT, passage au ROUGE
Serial.print("[LOG] [PIETON] Feu de droite au vert, passage au rouge.");
Serial.print('\n');
digitalWrite(feuVertDroite, LOW);
digitalWrite(feuOrangeDroite, HIGH);
delay(3000);
digitalWrite(feuOrangeDroite, LOW);
digitalWrite(feuRougeDroite, HIGH);
Serial.print("[LOG] [PIETON] Tous les feux au rouge.");
Serial.print('\n');
delay(10000);
digitalWrite(feuRougeDroite, LOW);
Serial.print("[LOG] [PIETON] Fin pieton, passage au mode normal.");
Serial.print('\n');
} else if(etatFeuGauche == 0) { // Sinon si le feu de GAUCHE est VERT, passage au ROUGE
Serial.print("[LOG] [PIETON] Feu de gauche au vert, passage au rouge.");
Serial.print('\n');
digitalWrite(feuVertGauche, LOW);
digitalWrite(feuOrangeGauche, HIGH);
delay(3000);
digitalWrite(feuOrangeGauche, LOW);
digitalWrite(feuRougeGauche, HIGH);
Serial.print("[LOG] [PIETON] Tous les feux au rouge.");
Serial.print('\n');
delay(10000);
digitalWrite(feuRougeGauche, LOW);
Serial.print("[LOG] [PIETON] Fin pieton, passage au mode normal.");
Serial.print('\n');
} else { // Sinon impossible de connaitre l'etat des feux, alors erreur
Serial.print("[LOG] [PIETON] [ERREUR] Passage au clignotant.");
Serial.print('\n');
for(int i = 0; i < 10; i++) { // Extinction des tous les feux
digitalWrite(led[i], LOW);
}
for(int i = 0; i < 5; i++) { // Clignotement des feux oranges 5 fois
digitalWrite(feuOrangeDroite, HIGH);
digitalWrite(feuOrangeGauche, HIGH);
delay(1000);
digitalWrite(feuOrangeDroite, LOW);
digitalWrite(feuOrangeGauche, LOW);
delay(1000);
}
Serial.print("[LOG] [PIETON] Fin pieton, passage au mode normal.");
Serial.print('\n');
}
} else {
/* GAUCHE ROUGE - DROIT VERT */
etatFeuGauche = 1; // Gauche rouge
etatFeuGauche = 0; // Droit vert
Serial.print("[LOG] [NORMAL] Feu de gauche ROUGE - Feu de droite VERT.");
Serial.print('\n');
digitalWrite(feuRougeGauche, HIGH);
digitalWrite(feuOrangeGauche, LOW);
digitalWrite(feuVertGauche, LOW);
digitalWrite(pietonVertGauche, HIGH);
digitalWrite(pietonRougeGauche, LOW);
digitalWrite(feuRougeDroite, LOW);
digitalWrite(feuOrangeDroite, LOW);
digitalWrite(feuVertDroite, HIGH);
digitalWrite(pietonVertDroite, LOW);
digitalWrite(pietonRougeDroite, HIGH);
delay(10000);
/* GAUCHE ROUGE - DROIT ORANGE - TRANSITION */
etatFeuGauche = 1; // Gauche rouge
etatFeuGauche = 0; // Droit orange
Serial.print("[LOG] [NORMAL] Feu de gauche ROUGE - Feu de droite ORANGE.");
Serial.print('\n');
digitalWrite(feuRougeGauche, HIGH);
digitalWrite(feuOrangeGauche, LOW);
digitalWrite(feuVertGauche, LOW);
digitalWrite(pietonVertGauche, LOW);
digitalWrite(pietonRougeGauche, HIGH);
digitalWrite(feuRougeDroite, LOW);
digitalWrite(feuOrangeDroite, HIGH);
digitalWrite(feuVertDroite, LOW);
digitalWrite(pietonVertDroite, LOW);
digitalWrite(pietonRougeDroite, HIGH);
delay(3000);
/* GAUCHE VERT - DROIT ROUGE */
etatFeuGauche = 0; // Gauche vert
etatFeuGauche = 1; // Droit rouge
Serial.print("[LOG] [NORMAL] Feu de gauche VERT - Feu de droite ROUGE.");
Serial.print('\n');
digitalWrite(feuRougeGauche, LOW);
digitalWrite(feuOrangeGauche, LOW);
digitalWrite(feuVertGauche, HIGH);
digitalWrite(pietonVertGauche, LOW);
digitalWrite(pietonRougeGauche, HIGH);
digitalWrite(feuRougeDroite, HIGH);
digitalWrite(feuOrangeDroite, LOW);
digitalWrite(feuVertDroite, LOW);
digitalWrite(pietonVertDroite, HIGH);
digitalWrite(pietonRougeDroite, LOW);
delay(10000);
/* GAUCHE ORANGE - DROIT ROUGE - TRANSITION*/
etatFeuGauche = 0; // Gauche orange
etatFeuGauche = 1; // Droit rouge
Serial.print("[LOG] [NORMAL] Feu de gauche ORANGE - Feu de droite ROUGE.");
Serial.print('\n');
digitalWrite(feuRougeGauche, LOW);
digitalWrite(feuOrangeGauche, HIGH);
digitalWrite(feuVertGauche, LOW);
digitalWrite(pietonVertGauche, LOW);
digitalWrite(pietonRougeGauche, HIGH);
digitalWrite(feuRougeDroite, HIGH);
digitalWrite(feuOrangeDroite, LOW);
digitalWrite(feuVertDroite, LOW);
digitalWrite(pietonVertDroite, LOW);
digitalWrite(pietonRougeDroite, HIGH);
delay(3000);
}
}