1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
| const byte pinBouton = 2;
const byte pinRelais = 13;
const unsigned long delaiBouton = 4600; // attente de 4.6s pour déclencher la TRM
unsigned long dernierAppuiBouton;
unsigned long derniereBasculeRelais;
unsigned long deltaT; // intervalle de temps aléatoire pour la TRM
enum {REPOS, ATTENTE, ACTIF, PASSIF} etat = REPOS; // nos 4 états
void setup() {
pinMode(pinBouton, INPUT_PULLUP);
pinMode(pinRelais, OUTPUT);
}
void loop() {
switch (etat) { // dans quel état est o
case REPOS: // on est dans l'état REPOS, on doit tester T1
if (digitalRead(pinBouton) == LOW) { // T1
// si la condition de la transition T1 est validée, alors on fait l'action A1
dernierAppuiBouton = millis(); // A1: on mémorise le moment de l'appui
etat = ATTENTE; // et on définit le nouvel état
}
break; // chaque case doit se terminer par break
case ATTENTE: // on est dans l'état ATTENTE, on doit tester T2 ou T3
if (digitalRead(pinBouton) == HIGH) { // T2
// si la condition de la transition T2 est validée, alors on fait l'action A2
// ici A2 n'a pas d'action particulière
etat = REPOS; // et on définit le nouvel état
}
else if (millis() - dernierAppuiBouton >= delaiBouton) { // T3
// si la condition de la transition T3 est validée, alors on fait l'action A3
derniereBasculeRelais = millis(); // A3, mémoriser le moment de bascule
digitalWrite(pinRelais, HIGH); // A3, Activer le relais
deltaT = random(2000, 5001); // A3, générer un intervalle ∆t aléatoire (ici entre 2 et 5s)
etat = ACTIF; // et on définit le nouvel état
}
break; // chaque case doit se terminer par break
case ACTIF: // on est dans l'état ACTIF, on doit tester T2 ou T4
if (digitalRead(pinBouton) == HIGH) { // T2
// si la condition de la transition T2 est validée, alors on fait l'action A4
digitalWrite(pinRelais, LOW); // A4, désactiver le relais
etat = REPOS; // et on définit le nouvel état
} else if (millis() - derniereBasculeRelais >= deltaT) { // T4
// si la condition de la transition T4 est validée, alors on fait l'action A5
derniereBasculeRelais = millis(); // A5, mémoriser le moment de bascule
digitalWrite(pinRelais, LOW); // A5, désactiver le relais
deltaT = random(2000, 5001); // A5, générer un intervalle ∆t aléatoire (ici entre 2 et 5s)
etat = ACTIF; // et on définit le nouvel état
}
break; // chaque case doit se terminer par break
case PASSIF: // on est dans l'état PASSIF, on doit tester T2 ou T4
if (digitalRead(pinBouton) == HIGH) { // T2
// si la condition de la transition T2 est validée, alors on fait l'action A2
// ici A2 n'a pas d'action particulière
etat = REPOS; // et on définit le nouvel état
} else if (millis() - derniereBasculeRelais >= deltaT) { // T4
// si la condition de la transition T4 est validée, alors on fait l'action A3
derniereBasculeRelais = millis(); // A3, mémoriser le moment de bascule
digitalWrite(pinRelais, LOW); // A3, désactiver le relais
deltaT = random(2000, 5001); // A3, générer un intervalle ∆t aléatoire (ici entre 2 et 5s)
etat = ACTIF; // et on définit le nouvel état
}
break; // chaque case doit se terminer par break
}
// ici votre code peut continuer et faire autre chose, la machine n'est pas bloquante
} |
Partager