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 74 75 76 77 78 79 80 81 82 83 84 85 86 87
| // on définit les états possibles
enum : byte {ARRET, ATTENTE_OFF, MARCHE, ATTENTE_ON} etat = ARRET;
const byte pinBoutonAppuiLong = 8;
const byte pinAlimentation = 10;
const byte pinCoupeCircuit[] = {13, 12, 11};
unsigned long t0; // pour mesurer le temps écoulé
// ----------- fonctions utilitaires -----------
void activationCoupeCircuit()
{
Serial.println("activation coupe circuit");
for (byte i = 0; i < 3; i++) {
digitalWrite(pinCoupeCircuit[i], LOW);
delay(1000);
}
}
void desactivationCoupeCircuit()
{
Serial.println("désactivation coupe circuit");
for (byte i = 0; i < 3; i++) {
digitalWrite(pinCoupeCircuit[i], HIGH);
delay(1000);
}
}
// ----------- gestion des états-----------
void supervision()
{
switch (etat) {
case ARRET: // on est à l'arrêt, on attend l'appui du bouton
if (digitalRead(pinBoutonAppuiLong) == HIGH) { // HIGH => bouton appuyé (pull-down associé au bouton)
t0 = millis();
etat = ATTENTE_ON;
}
break;
case ATTENTE_ON: // on attend le relâchement du bouton et on vérifie la durée d'appui pour désactiver le coupe circuit
if (digitalRead(pinBoutonAppuiLong) == LOW) { // LOW => bouton relâché (pull-down associé au bouton)
unsigned long deltaT = millis() - t0;
if ((deltaT >= 3000) && (deltaT <= 5000)) {
desactivationCoupeCircuit();
etat = MARCHE;
} else {
etat = ARRET;
}
}
break;
case MARCHE: // on est en marche, on attend l'arrêt de l'alimentation
if (digitalRead(pinAlimentation) == LOW) {
t0 = millis();
etat = ATTENTE_OFF;
}
break;
case ATTENTE_OFF: // l'alimentation est coupée, on attend 10 seconde pour être sûr avant d'activer le coupe circuit
if (digitalRead(pinAlimentation) == HIGH) {
etat = MARCHE;
} else {
unsigned long deltaT = millis() - t0;
if (deltaT > 10000) {
activationCoupeCircuit();
etat = ARRET;
}
}
break;
} // fin switch etat
}
// ----------- le programme -----------
void setup()
{
pinMode(pinBoutonAppuiLong, INPUT); // sera HIGH quand appuyé
pinMode(pinAlimentation, INPUT); // sera LOW quand alimentation coupée, HIGH sinon
for (byte i = 0; i < 3; i++) pinMode(pinCoupeCircuit[i], OUTPUT); // LOW par défaut
Serial.begin(115200); // console série à 115200 bauds
}
void loop()
{
supervision();
// ici on peut faire autre chose de non bloquant si on veut
// ....
} |
Partager