Faire clignoter sans délai
Fait partie de la section Gestion du temps sans delay du Journey Arduino de Coddy. Leçon 3 sur 18.
delay() arrête tout le sketch. Pendant qu’un clignotement attend ses 500 ms, rien d’autre dans loop() ne s’exécute : un bouton pressé pendant ce temps n’est pas détecté avant la fin de l’attente.
La solution consiste à ne jamais attendre. Laisse loop() s’exécuter encore et encore, très rapidement, et compare chaque fois l’horloge au moment où la LED a changé pour la dernière fois. Tant que 500 ms ne se sont pas écoulées, ne fais rien. Puis change la LED et mémorise le nouveau moment :
const unsigned long interval = 500;
unsigned long previousMillis = 0; // quand la LED a changé d'état pour la dernière fois
void loop() {
unsigned long now = millis();
if (now - previousMillis >= interval) {
previousMillis = now; // mémoriser cet instant
// changer l'état de la LED ici
}
// tout autre code placé ici s'exécute des milliers de fois par seconde
}now - previousMillis correspond au temps écoulé depuis le dernier changement. Pour changer la LED, conserve son état dans une variable, int redState = LOW;, inverse-le avec if/else et écris sa valeur avec digitalWrite(redLed, redState);.
Si tu oublies de mettre à jour previousMillis, la condition reste vraie après les premières 500 ms : la LED change donc à chaque boucle et semble à moitié allumée.
Défi
MoyenLa LED jaune doit suivre le bouton, mais elle réagit tardivement, car les appels à delay() de la LED rouge bloquent la boucle. Réécris le clignotement de la LED rouge avec millis() :
- garde la partie concernant le bouton telle quelle
- toutes les 500 ms, allume ou éteins la LED rouge sur la broche 13
- aucun
delay(), nulle part
Appuie sur Run, maintiens le bouton enfoncé et observe les deux LED, puis clique sur Check.
Essayez vous-même
const int redLed = 13;
const int yellowLed = 12;
const int buttonPin = 2;
void setup() {
pinMode(redLed, OUTPUT);
pinMode(yellowLed, OUTPUT);
pinMode(buttonPin, INPUT_PULLUP);
}
void loop() {
// La LED jaune suit l’état du bouton. Conservez cette partie.
if (digitalRead(buttonPin) == LOW) {
digitalWrite(yellowLed, HIGH);
} else {
digitalWrite(yellowLed, LOW);
}
// La LED rouge clignote, mais chaque delay() interrompt l’exécution des lignes ci-dessus
// pendant une demi-seconde. Réécrivez cette partie avec millis().
digitalWrite(redLed, HIGH);
delay(500);
digitalWrite(redLed, LOW);
delay(500);
}
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
1millis()
L’horloge millis()Les temps en unsigned longFaire clignoter sans délaiDeux LED, deux vitessesFaire clignoter avec un boutonUne lumière avec minuterieEntraînez-vous par vous-même : Playground Arduino