Menu
CoddyTech

Machine à états de feu de circulation

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

Un feu de circulation est une machine à états : il est toujours dans un état (vert, jaune ou rouge), chaque état dure un temps défini et chaque état sait lequel vient ensuite :

  • GREEN : vert allumé ; après 2 s, passer à YELLOW
  • YELLOW : jaune allumé ; après 1 s, passer à RED
  • RED : rouge allumé ; après 2 s, passer à GREEN

Chaque ligne devient un case :

case GREEN:
  setLights(HIGH, LOW, LOW);
  if (now - lightStart >= 2000) {
    light = YELLOW;
    lightStart = now;
  }
  break;

Avec delay(2000), le feu fonctionnerait aussi, mais rien d’autre ne pourrait s’exécuter. Avec millis(), chaque passage dans loop() prend quelques microsecondes, ce qui laisse du temps à la carte pour d’autres tâches : ici, une LED d’état qui clignote pendant tout ce temps pour montrer que le contrôleur est actif.

challenge icon

Défi

Moyen

La LED d’état sur la broche 13 clignote déjà, et enum et lightStart sont prêts. Écris le feu de circulation avec un switch (light) et un case par feu :

  • vert 2 s, jaune 1 s, rouge 2 s, puis de nouveau vert
  • une LED à la fois, avec setLights()
  • pas de delay(), pour que la LED d’état continue de clignoter

Appuie sur Exécuter, puis sur Vérifier.

Essayez vous-même

const int greenLed = 10;
const int yellowLed = 11;
const int redLed = 12;
const int statusLed = 13;   // la LED intégrée à la carte

enum Light { GREEN, YELLOW, RED };
Light light = GREEN;
unsigned long lightStart = 0;   // quand le feu actuel s'est allumé

unsigned long statusPrevious = 0;
int statusState = LOW;

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

void setLights(int green, int yellow, int red) {
  digitalWrite(greenLed, green);
  digitalWrite(yellowLed, yellow);
  digitalWrite(redLed, red);
}

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

  // la LED d'état change d'état toutes les 250 ms pour montrer que le contrôleur fonctionne
  if (now - statusPrevious >= 250) {
    statusPrevious = now;
    if (statusState == LOW) {
      statusState = HIGH;
    } else {
      statusState = LOW;
    }
    digitalWrite(statusLed, statusState);
  }

  // le feu de circulation : un switch (light) avec un case pour chaque couleur
  // vert 2 s, jaune 1 s, rouge 2 s, puis à nouveau vert
}
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