Menu
CoddyTech

Feu de circulation avec millis()

Fait partie de la section Projets du Journey Arduino de Coddy. Leçon 2 sur 24.

Pendant chaque delay(3000), la carte ne fait rien d’autre ; elle ne pourrait donc pas détecter le bouton de passage pour piétons que l’étape suivante ajoute. La temporisation passe à millis().

Le feu est une machine à états : il est toujours dans un état (vert, jaune ou rouge) et passe au suivant lorsque cet état a duré suffisamment longtemps. Un enum nomme les états, une variable contient l’état actuel et une autre indique quand il a commencé :

enum Light { GREEN, YELLOW, RED };
Light light = GREEN;
unsigned long lightStart = 0;

Le premier état est vert : allume donc le feu vert dans setup(). À chaque passage dans loop(), un switch vérifie si l’état actuel a duré suffisamment longtemps ; ce n’est qu’alors qu’il passe à l’état suivant et change les feux :

case GREEN:
  if (millis() - lightStart >= 3000) {
    light = YELLOW;
    lightStart = millis();
    showLight(yellowPin);
  }
  break;

Rien n’attend : loop() peut donc s’occuper d’autres tâches. Vérifie-le avec un voyant d’état : fais clignoter la LED intégrée de la carte, sur la broche 13, toutes les 500 ms.

challenge icon

Défi

Moyen

Réécris la temporisation sans delay() :

  • garde le vert 3000 ms, le jaune 1000 ms, le rouge 3000 ms
  • utilise un enum pour les trois états, un switch et millis()
  • allume le feu vert dans setup() et appelle showLight() uniquement lorsque l’état change
  • fais clignoter la broche 13 toutes les 500 ms (500 ms allumée, 500 ms éteinte), en permanence

Appuie sur Run, puis sur Check.

Essayez vous-même

// Les feux de voiture
const int redPin = 12;
const int yellowPin = 11;
const int greenPin = 10;

// Allumez un feu et éteignez les deux autres.
void showLight(int pin) {
  digitalWrite(redPin, LOW);
  digitalWrite(yellowPin, LOW);
  digitalWrite(greenPin, LOW);
  digitalWrite(pin, HIGH);
}

void setup() {
  pinMode(redPin, OUTPUT);
  pinMode(yellowPin, OUTPUT);
  pinMode(greenPin, OUTPUT);
}

void loop() {
  showLight(greenPin);
  delay(3000);
  showLight(yellowPin);
  delay(1000);
  showLight(redPin);
  delay(3000);
}
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 Projets

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