////////////////////////////////////////// // Les macros et variables globales // ////////////////////////////////////////// #define pinLEDR 5 #define pinLEDV 6 #define pinBP 7 #define WAIT 1 #define START 2 #define STOP 3 int state; // L'ETAT de l'automate int old_state_BP; // Mémorisation de l'état du Bouton Poussoir (BP) long unsigned int t0; // instant appui BP void setup() { // Configutaion des E/S: pinMode(pinBP, INPUT); pinMode(pinLEDR, OUTPUT); pinMode(pinLEDV, OUTPUT); // au démarrage, mettre l'automate dans l'état WAIT state = WAIT; digitalWrite(pinLEDR, LOW); digitalWrite(pinLEDV, HIGH); // initialidsation variables: old_state_BP = LOW; } void loop() { // 1 - lecture des périphériques d'entrée qui peuvent créer // les événements de l'automate.... // (exploitation du diagramme des états) int current_state_BP = digitalRead(pinBP); // 2 - Traitement des événements provoquant une transition d'état : // (-> exploitation du Tableau des transitions d'état) if (old_state_BP == LOW && current_state_BP == HIGH) // Front montant { t0 = millis(); } else if (old_state_BP == HIGH && current_state_BP == LOW) // Front descendant :BPA { long unsigned int t1 = millis(); if (t1 - t0 < 3000) { // Événement BPA détecté: if (state == WAIT) { state = START; } else if (state == START) { state = STOP; digitalWrite(pinLEDR, HIGH); digitalWrite(pinLEDV, LOW); } else if (state == STOP) { state = START; digitalWrite(pinLEDR, LOW); } } } else if (old_state_BP == HIGH && current_state_BP == HIGH) // Appui maintenu : AL { long unsigned int t1 = millis(); if (t1 - t0 >= 3000) { // événement AL (Appui Long) if (state == STOP) { state = WAIT; digitalWrite(pinLEDR, LOW); digitalWrite(pinLEDV, HIGH); } else if (state == START) { state = WAIT; digitalWrite(pinLEDV, HIGH); } } } // // 3 - Traitement des états // if (state == WAIT) { ; // RAF } else if (state == START) { // faire clignoter la LEDV int current_state_LEDV = digitalRead(pinLEDV); // récupèrer l'état courant de la LEDV digitalWrite(pinLEDV, 1 - current_state_LEDV); // lui donner l'état contraire } else if (state == STOP) { ; // RAF } // // autre staff à faire dans la boucle... // old_state_BP = current_state_BP; delay(100); }