Etabli
← Retour aux leçons
Leçon · FND-02 · Premier programme embarqué · 3/4

Approfondir : se libérer de delay()

4 étapes·20 min·0/4 fait·quiz à réussir
voix

Ton blink clignote fièrement — alors ajoute-lui un , pour voir. Surprise : la carte l'ignore une seconde sur deux. Le coupable est ton vieil ami (), qui endort tout le processeur à chaque attente. Cette leçon t'apprend le geste qui sépare le bricoleur du roboticien : jeter delay(), lire l'horloge, et garder une boucle toujours éveillée.

📖 Comprendre

1. delay() : une sieste, pas une pause

Pendant (1000), le processeur ne fait pas « autre chose en attendant » : il compte les millisecondes, et c'est tout. Aucune n'est lue, aucune décision n'est prise. Un appuyé PUIS relâché pendant l'attente n'est jamais vu — pour le , l'appui n'a littéralement pas existé. Un peut crier, personne n'écoute : le cerveau dort debout.

Fais le compte sur ton blink : deux attentes de 500 ms par tour, et quelques de travail utile. La boucle passe plus de 99,9 % de son temps endormie ! Or un robot doit percevoir-décider-agir des dizaines de fois par seconde. Le blink à () marche, mais il a hypothéqué l'avenir : chaque delay() est un morceau de surdité incrusté dans la boucle.

delay(500)0 ms…il compte, il ne fait RIEN d'autrependant delay : le monde continue, le processeur non

2. L'horloge qui ne dort jamais

Depuis la mise sous , la carte tient un compteur qui grandit d'une unité chaque milliseconde — son horloge de bord. () le lit et te le rend, instantanément : lire l'heure n'arrête pas le temps, et n'arrête pas non plus ton . Là où () immobilise tout pour laisser passer la durée, millis() donne l'heure et rend la main aussitôt.

L'idée de la libération tient en une phrase : au lieu d'ARRÊTER le pendant 500 ms, on laisse la boucle tourner à pleine vitesse et on pose, à chaque passage, une simple question : « est-ce l'heure ? ». L'attente cesse d'être un sommeil ; elle devient une comparaison — quasi gratuite — glissée parmi les autres occupations de la boucle.

3. Le patron : mémoriser le dernier instant

Le patron s'écrit en pseudo-code, sans rien de plus : « garde en l'instant du dernier basculement ; à chaque tour de (), si l'instant présent moins le dernier basculement dépasse 500 millisecondes, alors inverse la et note l'instant présent comme nouveau dernier basculement ». Trois lignes, une soustraction, une comparaison — et plus une seule seconde de sommeil.

Vu de l'extérieur, RIEN ne change : la bat toujours sa demi-seconde, créneau identique à l'. Mais à l'intérieur, tout a changé : entre deux basculements, la boucle tourne des dizaines de milliers de fois, et chaque tour peut aussi lire le , interroger un , ajuster un . « Est-ce l'heure ? » à chaque passage : c'est le motif de tout robot réactif.

4. Plusieurs rythmes, une seule boucle

Pour deux à des rythmes différents, il suffit de dédoubler le patron : chaque tâche possède SA du dernier instant et SA période — 500 ms pour l'une, 300 ms pour l'autre. Chaque tour de boucle pose deux questions indépendantes, et chacune bascule à son heure sans gêner l'autre. Avec (), le même exercice tourne au casse-tête : les attentes de l'une volent le temps de l'autre.

Et le devient enfin fiable : lu à CHAQUE tour, des milliers de fois par seconde, il ne peut plus passer inaperçu — l'appui le plus bref est vu dans la milliseconde. Compare aux 500 ms de surdité de la version () : c'est le jour et la nuit. Une boucle rapide qui interroge tout son petit monde à chaque passage : tu tiens là l'architecture de tous tes futurs robots.

🧮 Exemple guidé : la boucle libérée, chronomètre en main

Blink de 500 ms version horloge, plus la lecture du bouton, dans la même loop(). Un tour de boucle prend environ 1 ms. Déroule les instants 0 à 500 et montre pourquoi l'appui survenu à l'instant 247 est vu — alors que la version delay() l'aurait manqué.

  1. 1.Instant 0 : dernier basculement mémorisé = 0. Chaque tour demande : présent moins dernier basculement dépasse 500 ? À l'instant 1, écart 1 : non. La boucle repart aussitôt — un tour dure environ 1 ms.
  2. 2.Instants 2, 3, 4… 499 : cinq cents tours, cinq cents « non » — et à CHAQUE tour, le bouton est lu au passage. La surveillance ne coûte rien.
  3. 3.Instant 247 : le doigt appuie. Le tour en cours lit le bouton dans la milliseconde : l'appui est traité immédiatement, sans attendre la fin du clignotement.
  4. 4.Instant 500 : écart 500 — la question répond enfin « oui ». La LED s'inverse, le dernier basculement devient 500, et la course repart vers l'instant 1 000.
  5. 5.La version delay() en face : endormie de l'instant 0 à l'instant 500, elle n'aurait regardé le bouton qu'au réveil — 253 ms après l'appui, et seulement si le doigt était resté.

À l'œil, les deux versions clignotent pareil. Au chronomètre, l'une répond au bouton en 1 ms, l'autre en 253 ms — quand elle répond. La boucle libérée fait les deux choses à la fois : c'est elle que tes robots embarqueront.

🛠 Pratiquer sur l'établi

  1. 01Constater : pendant (1000), le est sourd

    Commence par constater le mal : ajoute un à ton blink à (1000) et essaie d'allumer la deuxième à l'appui. Appuie brièvement pendant l'attente… rien. La scène te montre pourquoi : la boucle est figée, sourde, pendant toute la sieste. Ce constat vaut mille explications — delay() coûte cher.

    sur l'établi
    delay(500)0 ms…il compte, il ne fait RIEN d'autrependant delay : le monde continue, le processeur non

    📖 Termes de cette étape

Objectifs

  • +Voir pourquoi () bloque tout
  • +Cadencer avec ()
  • +Mener deux tâches de
🧪 S'entraîner dans le bac à sable

Quiz de validation

À réussir pour valider la leçon

Réponds de mémoire, sans remonter la page : c'est l'effort de rappel qui grave le cours. Les trois bonnes réponses valident la leçon.

1. Pendant delay(1000), que fait le processeur ?

2. Quel est le cœur du patron de l'horloge ?

3. Deux LED à 300 ms et 500 ms sans delay() : que faut-il ?

🧠 Ce qu'il faut retenir

  • 1.() endort tout le : et boutons deviennent sourds.
  • 2.() donne l'heure sans arrêter le temps : on compare, on agit, on continue.
  • 3.« Est-ce l'heure ? » à chaque tour de boucle : le motif de tout robot réactif.