Problème pour sortir de mon code

J-M-L:
quelques commentaires en plus de ceux ci dessus (dont vous avez à moitié tenu compte :frowning: )

Vous exagérez, je n'ai raté qu'une seule consigne sur TOUS le code :smiley:

J-M-L:
respectez les types
boolean Etat_pin_DETECTION = digitalRead(pin_DETECTION);
est mieux écrit en
boolean Etat_pin_DETECTION = (digitalRead(pin_DETECTION) == HIGH);

Les autres c'est du plus que je vais appliquer sauf :

J-M-L:
si vous voulez gagner de la place mémoire au lieu des
Serial.println("Paramétrage Usine :");
faites plutôt
Serial.println(F("Paramétrage Usine :"));
ça va mettre la chaîne de caractère en mémoire programme et donc libérer de l'espace en SRAM (attention les accents dans les chaînes ne sont pas toujours bien représentés dans le moniteur Série)

Car je vais devoir supprimer les commentaire dans le Moniteur série car pas compatible avec Domoticz

Pour

J-M-L:
// /!\ATTENTION/!\ la LED RGB doit être branchée sur les sorties analogiques
const byte pin_LED_ROUGE = 9;
const byte pin_LED_VERTE = 10;
const byte pin_LED_BLEU = 11;

je suppose que vous voulez parler de pins PWM...

C'est les pins avec ~ c'est un code que j'ai récupéré sur le net.

Me reste plus qu'à corriger le reste de mon code

Pour

J-M-L:
ces 2 conditions paraissent louches... elles ne diffère que par le > et >=...(idem pour temps2)

Code: [Select]

if (Etat_Intrusion == true && (temps1 - Temps_Dernier_Badge > delay_badge))
...
//délais tempo dépassé
else if (Etat_Intrusion == true && (temps1 - Temps_Dernier_Badge >= delay_badge))

Je ne comprends pas non plus mais sans ça mon code ne fonctionne pas correctement...

Topher02:
Vous exagérez, je n'ai raté qu'une seule consigne sur TOUS le code :smiley:

oui j'avoue :slight_smile:

Topher02:
Je ne comprends pas non plus mais sans ça mon code ne fonctionne pas correctement...

le premier devrait être un <. je suppose que vous ne voyez pas défiler

    // Delais pour faire le code
    Temps_Dernier_Badge = temps1;
    Serial.print("Vous avez ");
    Serial.print(delay_badge / 1000);
    Serial.println(" secondes pour badger ou faire votre code...");

ce qui est une bonne chose car il ne faut pas faire Temps_Dernier_Badge = temps1;

Je vais essayer votre proposition mais à priori cela fonctionne tel quel

Topher02:
Je vais essayer votre proposition mais à priori cela fonctionne tel quel

Ce qu’il faut faire c’est comparer si millis() - le moment du déclenchement de l’alarme est inférieur au délai autorisé pour passer le badge, dans ce cas l’alarme ne sonne pas encore et vous testez si le badge est présenté —> Donc au moment de la détection de l’intrusion vous devez mémoriser la valeur de millis() et vous ne devez pas modifier ce top départ

Une fois ce délai dépassé (donc dans le else) vous passez en mode alarme déclenchée - vous pouvez continuer bien sûr à tester si le badge est présenté pour arréter l’alamrme

Aujourd’hui vous rentrez dans le second if (à cause du = de <=) sans doute avant le premier car votre boucle tourne sans doute suffisamment rapidement pour arriver pile sur la bonne ms (et que vous avez de la chance que cette ms ne soit pas sautée)

Là encore ma recommendation serait de faire une machine à état « propre » - Avec un seul indicateur qui dit dans quel état vous êtes et pas une combinaison de booléens qui s’enchainent Et qui sont tous toujours éxécutés dans la loop.

J-M-L:
Ce qu’il faut faire c’est comparer si millis() - le moment du déclenchement de l’alarme est inférieur au délai autorisé pour passer le badge, dans ce cas l’alarme ne sonne pas encore et vous testez si le badge est présenté —> Donc au moment de la détection de l’intrusion vous devez mémoriser la valeur de millis() et vous ne devez pas modifier ce top départ

Une fois ce délai dépassé (donc dans le else) vous passez en mode alarme déclenchée - vous pouvez continuer bien sûr à tester si le badge est présenté pour arréter l’alamrme

Aujourd’hui vous rentrez dans le second if (à cause du = de <=) sans doute avant le premier car votre boucle tourne sans doute suffisamment rapidement pour arriver pile sur la bonne ms (et que vous avez de la chance que cette ms ne soit pas sautée)

Là encore ma recommendation serait de faire une machine à état « propre » - Avec un seul indicateur qui dit dans quel état vous êtes et pas une combinaison de booléens qui s’enchainent Et qui sont tous toujours éxécutés dans la loop.

Je pense que vous avez raison car parfois j'ai des ratés.
J'ai commencer à modifier mon code et le transformer en enum et avec des switch mais ça ne marche pas du tous... Grosse galère :confused:

Dessinez un diagramme des états (comme dans mon tuto) et postez le

J-M-L:
Dessinez un diagramme des états (comme dans mon tuto) et postez le

Ok, je vais me mettre dessus, par contre il faudra (encore) m'aider car niveau code je n'y arrive pas.

Oui bien sûr

Mais c’est pas sorcier.

État initial (au boot) = alarme éteinte (état=PAUSE)

état=PAUSE
1 seul événement:

  • Bouton armement alarme ON

Passe en état alarme tempo activée (état=ATTENTE)

état=ATTENTE
2 Évènements:

  • timeout
  • bouton armement alarme OFF

état=SURVEILLANCE
2 Évènements:

  • intrusion
  • bouton badge = alarme OFF

Si intrusion allumer la led, message alarme, commencer le bip et état = INTRUSION
Si badge présenté retour en état=PAUSE

État INTRUSION:

3 èvenements:

  • badge présenté
  • timeout clignotement LED
  • timeout délai autorisé de présentation badge

Si badge présenté on éteint tout et retourne à l’état PAUSE
Si timeout clignotement, on change la LED d’état et reset le compteur attente clignotement
Si timeout délai autorisé déclenchement de l’alarme (noter l’heure) d’un sms, etc état=ALERTE

État ALERTE

3 èvenements:

  • badge présenté
  • timeout clignotement LED
  • timeout sirene (la loi impose une durée Max de sonnerie)

Si badge présenté on éteint tout et retourne à l’état PAUSE
Si timeout clignotement, on change la LED d’état et reset le compteur attente clignotement
Si timeout sirene on éteint la sirène, on ferme les portes à clés automatiquement pour emprisonner le voleur, on ouvre la cage du tigre de compagnie, on fait clignoter toutes les lampes de la maison, on allume la radio et la TV, on simule la sonnerie du téléphone et d’un répondeur auquel la police parle en disant que le GIGN arrive, on déclenche des aboiements de chiens féroces, :slight_smile: et état = VOL_EN_COURS

état VOL_EN_COURS
Si badge présenté on éteint tout et retourne à l’état PAUSE
(Ou ce que vous voulez pour en sortir et attention au tigre en liberté en rentrant chez vous :slight_smile: )

Bref voilà une idée de scénario de votre machine

J-M-L:
Si badge présenté on éteint tout et retourne à l’état PAUSE
Si timeout clignotement, on change la LED d’état et reset le compteur attente clignotement
Si timeout sirene on éteint la sirène, on ferme les portes à clés automatiquement pour emprisonner le voleur, on ouvre la cage du tigre de compagnie, on fait clignoter toutes les lampes de la maison, on allume la radio et la TV, on simule la sonnerie du téléphone et d’un répondeur auquel la police parle en disant que le GIGN arrive, on déclenche des aboiements de chiens féroces, :slight_smile: et état = VOL_EN_COURS

état VOL_EN_COURS
Si badge présenté on éteint tout et retourne à l’état PAUSE
(Ou ce que vous voulez pour en sortir et attention au tigre en liberté en rentrant chez vous :slight_smile: )

Bref voilà une idée de scénario de votre machine

J'ai fais mon analyse fonctionnelle mais je préfère la votre :smiley: sauf que j'ai bien plus qu'un tigre à la maison (je ne compte que les chats, ma femme c'est plutôt un dragon mais si il y a l'alarme, le voleur a de la chance, ma femme n'est pas là... mais je m'égare).

Je vais mettre mon n'analyse plus simpliste mais mon problème est plus de savoir quel code utiliser.
[url=http://

J'aurais la (mauvaise) tendance à utiliser des if de partout alors que SWITCH doit être beaucoup plus clair à utiliser.

Le problème c'est que j'ai essayer de faire un code avec SWITCH et un Etat_Systeme ETEINT et ACTIF, en partant avec un seul capteur (lecteur de badge) et sa ne marche pas...

ça ne ressemble pas aux petits dessins des états de mon tuto :slight_smile:
votre truc à l'air séquentiel, mais tempo non bloquante ça ne veut rien dire...

je m'attendais plus à un truc du genre ça

tenez j'ai codé un truc un peu à l'arrache - ça donnerait un truc du genre ça (non testé)

j'utilise des boutons momentanés pour simuler les différents évènements

  • activation ou désactivation de l'alarme
  • présentation du badge
  • simulation d'une intrusion

(en PJ car trop gros pour tenir ici)

GestionAlarme.ino (10 KB)

J-M-L:
tenez j'ai codé un truc un peu à l'arrache - ça donnerait un truc du genre ça (non testé)

j'utilise des boutons momentanés pour simuler les différents évènements

  • activation ou désactivation de l'alarme
  • présentation du badge
  • simulation d'une intrusion

(en PJ car trop gros pour tenir ici)

Tous d'abord, merci beaucoup, je vais regarder ça dans la semaine car je ne suis pas là ce week-end.

Je vais le mettre à ma sauce et je vous ferais mon retour positif ou négatif.

Bon Week-End