É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.
Défi
MoyenUne 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
}
}
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
2Machines à états
Mémoriser le modeChoisir avec switchÉtats nommés avec enumMachine à états de feu de circulationChanger de mode avec un boutonEntraînez-vous par vous-même : Playground Arduino