Bonjour J-M-L.
Après 4 jours d'absences, me voici de retour.
Un grand merci pour votre code, il m'a permis de comprendre qu'il ne fallait pas essayer de construire la machine à état par entrée mais de façon globale, que les "cases" correspondent à un état du système et non comme je l'avais compris à une état d'une ou plusieurs entrées.
J'ai passé une bonne partie de ma soirée à faire le programme de la machine à état qui correspond à mon système.
Je vous le soumet:
// Alarme cabanon
const byte pincleMA = 2; // entrée clé Marche/Arrêt système sur pin2
const byte pinILS_NO = 3; // entrée ILS contact Normalement ouvert (NO) sur pin3
const byte pinILS_NF = 4; // entrée ILS contact Normalement fermé (NF) sur pin4
const byte pinsirene = 8; // Sortie sirène sur pin8
const byte pingyrophare = 9; // Sortie gyrophare sur pin9
const byte pintemoin = 10; // Sortie témoin état système sur pin10
const unsigned long delaiAlarmeSonore = 10000ul; // Délais pendant lequel l'alarme sonne
// 4 états possibles du système
enum : byte {initial, AlarmeActive, AlarmeSonne, AlarmeSilence} etat;
// -----------------------------------------------------------------------------------------------
// Fonction Sirène
// -----------------------------------------------------------------------------------------------
void sireneON()
{
digitalWrite (pinsirene, HIGH); // sirene OFF
}
void sireneOFF()
{
digitalWrite (pinsirene, LOW); // sirene ON
}
// -----------------------------------------------------------------------------------------------
// Fonction gyrophare
// -----------------------------------------------------------------------------------------------
void gyrophareOFF()
{
digitalWrite (pingyrophare, LOW); // gyrophare OFF
}
void gyrophareON()
{
digitalWrite (pingyrophare, HIGH); // gyrophare ON
}
// -----------------------------------------------------------------------------------------------
// Fonction Témoin état système (Marche ou Arrêt)
// -----------------------------------------------------------------------------------------------
void temoinOFF()
{
digitalWrite (pintemoin, LOW); // témoin alarme déclenchée OFF
}
void temoinON()
{
digitalWrite (pintemoin, HIGH); // témoin alarme déclenchée ON
}
// -----------------------------------------------------------------------------------------------
// Fonction mise en marche système (clé active)
// -----------------------------------------------------------------------------------------------
bool cleON()
{
return (digitalRead(pincleMA) == LOW);
}
// -----------------------------------------------------------------------------------------------
// Fonction arrêt système (clé désactivé)
// -----------------------------------------------------------------------------------------------
bool cleOFF()
{
return (digitalRead(pincleMA) == HIGH);
}
// -----------------------------------------------------------------------------------------------
// Fonction détection choc ILS_NO
// -----------------------------------------------------------------------------------------------
bool ILS_NO_Actif()
{
return (digitalRead(pinILS_NO) == HIGH);
}
// -----------------------------------------------------------------------------------------------
// Fonction détection choc ILS_NF
// -----------------------------------------------------------------------------------------------
bool ILS_NF_Actif()
{
return (digitalRead(pinILS_NF) == LOW);
}
// -----------------------------------------------------------------------------------------------
// Cette fonction installe l'état initial
// -----------------------------------------------------------------------------------------------
void mettreAuRepos()
{
digitalWrite (pinsirene, LOW); // sirene OFF
digitalWrite (pingyrophare, LOW); // gyrophare OFF
digitalWrite (pintemoin, LOW); // témoin alarme déclenchée OFF
etat = initial;
}
// -----------------------------------------------------------------------------------------------
// Cette fonction Alarme déclenchée
// -----------------------------------------------------------------------------------------------
void AlarmeDeclenche()
{
digitalWrite (pinsirene, HIGH); // sirene OFF
digitalWrite (pingyrophare, HIGH); // gyrophare OFF
digitalWrite (pintemoin, HIGH); // témoin alarme déclenchée OFF
}
void setup() {
pinMode(pincleMA,INPUT_PULLUP); // entrée contact NF mise en marche alarme
pinMode(pinILS_NO,INPUT_PULLUP); // entrée contact NO détecteur choc
pinMode(pinILS_NF,INPUT_PULLUP); // entrée contact NF détecteur choc
pinMode(pinsirene,OUTPUT); // sortie relais sirène
pinMode(pingyrophare,OUTPUT); // sortie relais témoin alarme déclenchée
pinMode(pintemoin,OUTPUT); // sortie relais témoin état système
Serial.begin(9600);
//conditions Initiales
mettreAuRepos();
}
void loop() {
static unsigned long chrono = 0; //pour mesurer un timout on déclare une variable chrono
//----------------------------------------------------------------------------------------
// Dans tous les états, si on tourne la clé OFF, on arrêt tout.
if ((etat != initial) && (cleOFF)) { // si on n'est pas à l'état initial ET que la clé est à Off
etat = initial; //on passe à l'état initial
mettreAuRepos(); // on active la fonction mettreAuRepos qui coupe tout
}
//----------------------------------------------------------------------------------------
// on teste les évènements d'un état et si l'évènement se produit on effectue les actions
switch (etat) {
//-------------------------------------
case initial:
if (cleON()) { //si la clé est sur ON
temoinON(); // on lance les focntions
gyrophareOFF();
sireneOFF();
etat = AlarmeActive; // on passe à l'état sur alarmeActive
Serial.println(etat);
}
break;
//-------------------------------------
case AlarmeActive:
if (ILS_NF_Actif() || ILS_NO_Actif()) { // test des ILS NO et NF
temoinON();
gyrophareON();
sireneON();
chrono = millis(); //on mémorise l'heure de début de l'alarme
etat = AlarmeSonne;
Serial.println(etat);
}
break;
//-------------------------------------
case AlarmeSonne:
if (millis() - chrono >= delaiAlarmeSonore) { //si le delais est terminé
sireneOFF();
gyrophareON();
temoinON();
etat = AlarmeSilence;
Serial.println(etat);
}
break;
//-------------------------------------
case AlarmeSilence:
if (cleOFF()) {
mettreAuRepos();
etat = initial;
Serial.println(etat);
}
break;
}
}
J'ai téléversé ce code dans mon arduino, pas d'erreur de compilation mais il reste bloqué à la case initial
J'ai ajouté à chaque étape un retour "Serial.println(etat)" pour voir ou on se situe dans le code (comme expliqué dans votre tuto).
Quand j'active la clé (cleON()) le moniteur affiche 1, quand cleOFF, arrêt du défilement dans le moniteur.
Quand je suis en case initial et que j'active l'un de mes ILS, il ne passe pas en case2 (AlarmeSonne).
J'ai élagué ce code pour le limiter aux 2 états du début (initial et alarmesonne), je n'ai garder que la clé et 1 ILS pour tester... Idem, pas de passage en case2.
Auriez vous une idée?
Voyez-vous une erreur dans mon code?
Avec mes remerciements