/*arduino automate
exemple de machine d'états
11/08/2023
lien: https://forum.arduino.cc/index.php?topic=470879.0
https://wokwi.com/projects/372772711304967169
*/
// configuration
const byte CAPTEUR_1 = A4; // déclarations des PINs
const byte CAPTEUR_2 = A5;
const byte PIN_ROUGE = 6;
const byte PIN_JAUNE = 5;
const byte PIN_VERT = 4;
enum {etatVERT, etatROUGE1, etatROUGE2, etatJAUNE} etatCourant; // on précise les différents états possibles
void setup() { // réglage des entrées et des sorties
Serial.begin(9600);
pinMode(PIN_ROUGE, OUTPUT);
pinMode(PIN_JAUNE, OUTPUT);
pinMode(PIN_VERT, OUTPUT);
pinMode(CAPTEUR_1, INPUT_PULLUP);
pinMode(CAPTEUR_2, INPUT_PULLUP);
etatCourant = etatVERT; // on indique l'état initial
} // fin setup
void loop() {
Serial.print("etat = ");
int valA1 = digitalRead(CAPTEUR_1); //lecture des différents capteurs
int valA2 = digitalRead(CAPTEUR_2);
delay(200);
switch (etatCourant) { //switch case qui gère les différents états
case etatVERT:
Serial.println("etatVert");
allumeVERT(valA1, valA2); // envoi vers une fonction spécifique à chaque état
break; // qui ne retourne aucune valeur mais avec prise en compte
// des valeurs des CAPTEUR_s
case etatROUGE1:
Serial.println("etatRouge1");
allumeROUGE1(valA1, valA2);
break;
case etatROUGE2:
Serial.println("etatRouge2");
allumeROUGE2(valA1, valA2);
break;
case etatJAUNE:
Serial.println("etatJaune");
allumeJAUNE(valA1, valA2);
break;
} // fin switch case
} // fin du loop
void allumeVERT(int valA1, int valA2) { // 1er état
digitalWrite(PIN_VERT, LOW); // on liste de tout ce qui doit se faire dans l'état présent
digitalWrite(PIN_ROUGE, HIGH);
digitalWrite(PIN_JAUNE, HIGH);
if (valA1 == LOW && valA2 == HIGH) { //on indique les conditions pour changer d'état
etatCourant = etatROUGE1;
}
else if (valA1 == HIGH && valA2 == LOW) { //conditions pour changer d'état
etatCourant = etatROUGE2;
}
}
void allumeROUGE1(int valA1, int valA2) {
digitalWrite(PIN_VERT, HIGH);
digitalWrite(PIN_ROUGE, LOW);
digitalWrite(PIN_JAUNE, HIGH);
if (valA1 == HIGH && valA2 == LOW) {
etatCourant = etatJAUNE;
}
}
void allumeROUGE2(int valA1, int valA2) {
digitalWrite(PIN_VERT, HIGH);
digitalWrite(PIN_ROUGE, LOW);
digitalWrite(PIN_JAUNE, HIGH);
if (valA1 == LOW && valA2 == HIGH) {
etatCourant = etatJAUNE;
}
}
void allumeJAUNE(int valA1, int valA2) {
digitalWrite(PIN_VERT, HIGH);
digitalWrite(PIN_ROUGE, HIGH);
digitalWrite(PIN_JAUNE, LOW);
Serial.println("Temporisation");
delay(3000);
if (valA1 == HIGH && valA2 == HIGH) { // conditions pour revenir à l'état initial
etatCourant = etatVERT;
}
}