Menu
CoddyTech

États nommés avec enum

Fait partie de la section Gestion du temps sans delay du Journey Arduino de Coddy. Leçon 9 sur 18.

Un mode numéroté 0, 1 et 2 fonctionne, mais if (mode == 2) ne dit pas ce que signifie 2. Un enum donne un nom à chaque nombre :

enum State { READY, RUNNING, DONE };
State state = READY;

La première ligne crée un nouveau type, State, dont les seules valeurs sont READY, RUNNING et DONE. En interne, elles restent 0, 1 et 2, mais les noms indiquent ce que chacune signifie. La deuxième ligne crée une variable de ce type.

Un enum et un switch vont bien ensemble : un case par état.

switch (state) {
  case READY:
    // ce que fait READY et quand il passe à l’étape suivante
    break;
  case RUNNING:
    // ...
    break;
}

Pour passer à un nouvel état, définis state et note quand il a commencé : state = DONE; stateStart = millis();. Chaque état mesure alors sa propre durée avec millis() - stateStart. Cette façon d’écrire un sketch s’appelle une machine à états.

challenge icon

Défi

Moyen

Une machine a trois états. READY est écrit pour toi : la LED verte est allumée, et une pression démarre la machine. Ajoute les deux autres cas :

  • RUNNING : la LED jaune est allumée. Après 2000 ms, éteins-la et passe à DONE.
  • DONE : la LED rouge est allumée. Après 1000 ms, éteins-la et reviens à READY.

Enregistre stateStart à chaque changement. Appuie sur Run, appuie sur le bouton, puis sur Check.

Essayez vous-même

const int buttonPin = 2;
const int greenLed = 10;
const int yellowLed = 11;
const int redLed = 12;

enum State { READY, RUNNING, DONE };
State state = READY;

unsigned long stateStart = 0;   // quand l'état actuel a commencé

void setup() {
  pinMode(buttonPin, INPUT_PULLUP);
  pinMode(greenLed, OUTPUT);
  pinMode(yellowLed, OUTPUT);
  pinMode(redLed, OUTPUT);
}

void loop() {
  unsigned long now = millis();

  switch (state) {
    case READY:
      digitalWrite(greenLed, HIGH);
      if (digitalRead(buttonPin) == LOW) {
        digitalWrite(greenLed, LOW);
        state = RUNNING;
        stateStart = now;
      }
      break;

    // ajouter le cas RUNNING : allumer la LED jaune ; après 2000 ms, l'éteindre et passer à DONE

    // ajouter le cas DONE : allumer la LED rouge ; après 1000 ms, l'éteindre et revenir à READY
  }
}
quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Gestion du temps sans delay

Entraînez-vous par vous-même : Playground Arduino