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.
Défi
MoyenRéécris la temporisation sans delay() :
- garde le vert 3000 ms, le jaune 1000 ms, le rouge 3000 ms
- utilise un
enumpour les trois états, unswitchetmillis() - allume le feu vert dans
setup()et appelleshowLight()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);
}
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
1Feu de circulation
Cycle du feu de circulationFeu de circulation avec millis()Bouton de traverséeSignal piéton et buzzerEntraînez-vous par vous-même : Playground Arduino