Menu
CoddyTech

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.

challenge icon

Défi

Moyen

La 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);
}
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