Programmation Automate fini / Machine à état

Merci.
Le nom de ma variable est sous forme d'affirmation (assez parlant) et les valeurs me semble pas devoir évoluer, je resterais donc avec.

Je garde le post sous le coude, sur que ça m'aidera à optimiser certaine chose !

oui un if dans ce cas là semble bien. Optimisez la lisibilité, vous n'êtes sans doute pas à quelques micro-secondes près

A noter une librairie qui pourrait en intéresser certains

Plutôt bien fichu. Le développeur est réactif en cas de problème.
Avec les ESP il y a possibilité de monter un serveur et de visualiser par un graphique dynamique l'état de l'automate dans un navigateur internet (voir dans les exemples)

2 Likes

le joiur où tu ajouteras un 3ème état à ton système, tu seras contant d'avoir choisi l'énum et le switch/case :wink:

1 Like

Merci pour ce tuto,il m'aidera surement dans mon projet!!

1 Like

Merci JML pour ce tuto fort instructif!

Bonjour, je viens de m'intéressé à ton forum, c'est vraiment super génial et ça colle à ce que je voudrais faire, mais question, pour ton time out? ici si on commence à appuyer sur un bouton, la Led 1 s'allume, et qu'on attend par exemple 13 secondes pour rappuyer et allumer la deuxième Led, là le système attendra uniquement 2 secondes avant de s'éteindre, comment réinitialiser ce timer à 15 secondes après?

Crée une variable time exemple: int time;
et écrire: time = millis(); après l'appuis du bouton? je vois pas comment bien le faire

si on met à jour le chrono on repart pour 15 secondes

et dans ce cas faudrait le réarmer à l'appuie du bouton c'est ça? peut on le caler avant la ligne (switch case) de la void() simple clic ou doubleclic? un pe ucomme ça:

void simpleclick(){
  time = millis();
  switch (etatCourant) {
    case REPOS: // on était au repos et on a un appui, on allume la bleu
      digitalWrite(pinLedBleu, HIGH); // LED bleu alimentée
      etatCourant = ETAT_B; // on note le nouvel état de notre système
      break;

    case ETAT_B: // on était led bleu allumée et on a un appui, on allume la verte
      digitalWrite(pinLedVerte, HIGH); // LED verte alimentée
      etatCourant = ETAT_BV;// on note le nouvel état de notre système
      break;

    case ETAT_BV: // vert et verte allumées, on a un appui, on allume la jaunee
      digitalWrite(pinLedJaune, HIGH); // LED jaune alimentée
      etatCourant = ETAT_BVJ;// on note le nouvel état de notre système
      break;

    case ETAT_BVJ:// vert, jaune et jaune allumées, on a un appui, on allume la rouge
      digitalWrite(pinLedRouge, HIGH); // LED rouge alimentée
      etatCourant = ETAT_BVJR;// on note le nouvel état de notre système
      break;

    case ETAT_BVJR: // tout était allumé, on a un appui, on retourne au repos
      mettreAuRepos(); // on retourne à l'état initial
      break;
  }
}

(mes Leds sont différentes ne t'en fais pas)
si on le met ici ça passe?

je ne suis pas sûr de comprendre

le code de mon tuto comprend la ligne

  chrono = millis(); // on vient d'avoir une action donc on ré-arme notre chronomètre

à la fin de la fonction simpleclick() ou doubleclick()

ça veut dire qu'à chaque appui on repart pour TimeOut millisecondes de délai pour que la partie qui est dans la loop() se déclenche

Donc quand vous dites

non, ce n'est pas le cas. Un appui sur le bouton relance le compteur

effectivement c'est due à une erreur de ma part, mais sinon bravo pour ce super tutos

2 posts were split to a new topic: Question application Tuto machine à états de @J-M-L