ESP32 S3 - LED - Clignotement sans délai

La façon la plus simple de faire clignoter une LED est d'utiliser la fonction delay(), mais cela empêche l'ESP32 S3 de faire quoi que ce soit d'autre pendant l'attente. Ce tutoriel vous enseigne une meilleure approche utilisant la fonction millis(), qui permet à l'ESP32 S3 de faire clignoter une LED tout en restant libre de gérer d'autres tâches simultanément.

Ce que vous allez construire :

  1. Un circuit ESP32 S3 avec une LED et un bouton câblés à la carte
  2. Un clignotement de LED non bloquant utilisant millis() au lieu de delay()
  3. Un moniteur d'état de bouton qui fonctionne correctement même pendant que la LED clignote
  4. Un exemple multitâche faisant clignoter deux LED à des intervalles différents tout en détectant un bouton
ESP32 S3 - LED - Clignotement sans délai

Nous allons parcourir trois exemples et comparer les différences entre eux.

Cette méthode peut être appliquée pour permettre à l'ESP32 S3 d'effectuer plusieurs tâches en même temps. Le clignotement de LED n'est qu'un exemple.

Matériel requis

1×ESP32 S3 WROOM N16R8
1×Alternativement: ESP32 S3 SuperMini Dev Module
1×Alternativement: ESP32 S3 Uno-form Board
1×Alternativement: ESP32 S3 Camera Board
1×Câble USB Type-A vers Type-C (pour PC USB-A)
1×Câble USB Type-C vers Type-C (pour PC USB-C)
1×LED Kit
1×LED (red)
1×LED Module
1×Alternativement: Button and LED Kit
1×220Ω Resistor
1×Bouton avec capuchon pour plaque d'essai
1×Kit bouton pour plaque d'essai
1×Bouton poussoir pour montage sur panneau
1×Module bouton poussoir
1×Plaque d'essai
1×Fils de connexion
1×Optionnel: Connecteur d'alimentation DC
1×Recommandé: Screw Terminal Expansion Board for ESP32 S3
1×Recommandé: Breakout Expansion Board for ESP32 S3
1×Recommandé: Power Splitter for ESP32 S3

Ou vous pouvez acheter les kits suivants:

1×Kit de Démarrage DIYables ESP32 S3 (ESP32 S3 inclus)
1×Kit de Capteurs DIYables (18 capteurs/écrans)
Divulgation : Certains des liens fournis dans cette section sont des liens affiliés Amazon. Nous pouvons recevoir une commission pour tout achat effectué via ces liens, sans coût supplémentaire pour vous. Nous vous remercions de votre soutien.

Note d'achat: Pour simplifier le processus de câblage, nous recommandons d'utiliser le LED Module, qui est livré avec une résistance intégrée.

À propos de la LED et du bouton

Les LED et les boutons sont les deux composants les plus fondamentaux pour construire des projets ESP32 S3 interactifs. La LED fournit un retour visuel instantané de votre programme, tandis que le bouton fournit une entrée numérique que l'ESP32 S3 lit en temps réel. Les combiner dans un programme non bloquant vous permet d'observer comment le timing basé sur millis() garde l'ESP32 S3 réactif aux entrées même pendant qu'il gère une sortie temporisée.

Spécifications clés

Nous avons des tutoriels dédiés pour chaque composant avec des brochages détaillés, des instructions de câblage et des exemples de code :

Schéma de câblage

Connectez la LED et le bouton à votre ESP32 S3 en suivant le schéma de câblage ci-dessous. Assurez-vous que la LED est câblée via une résistance de 220 ohms et que la polarité est correcte avant de mettre la carte sous tension.

Schéma de câblage LED bouton ESP32 S3

Cette image a été créée avec Fritzing. Cliquez pour agrandir l'image.

Notes de sécurité

Placez toujours la résistance de 220 ohms en série avec la LED pour limiter le courant et protéger à la fois la LED et la broche GPIO de l'ESP32 S3 contre les dommages. Le bouton connecte une borne à GND et l'autre à une broche GPIO ; le programme active la résistance de tirage (pull-up) interne, donc aucune résistance externe n'est nécessaire pour le bouton.

Composant Broche Broche ESP32 S3
LED Anode (patte longue) D7
LED Cathode (patte courte) Résistance 220Ω vers GND
Bouton Une borne D5
Bouton Autre borne GND

Comparons le code ESP32 S3 qui fait clignoter une LED avec et sans utiliser la fonction delay()

Code ESP32 S3 - Avec délai

Le code suivant fait clignoter une LED en utilisant la fonction bloquante delay() et lit également l'état d'un bouton à chaque itération de la boucle. Bien que simple à écrire, cette approche a une limitation importante : l'ESP32 S3 ne peut pas traiter les pressions de bouton ni aucune autre entrée pendant la période de délai, ce qui entraîne des événements manqués.

/* * Ce code ESP32 S3 a été développé par newbiely.fr * Ce code ESP32 S3 est mis à disposition du public sans aucune restriction. * Pour des instructions complètes et des schémas de câblage, veuillez visiter: * https://newbiely.fr/tutorials/esp32-s3/esp32-s3-led-blink-without-delay */ #define LED_PIN 7 // The ESP32 S3 pin GPIO7 connected to LED #define BUTTON_PIN 5 // The ESP32 S3 pin GPIO5 connected to button #define BLINK_INTERVAL 1000 // interval at which to blink LED (milliseconds) // Variables will change: int ledState = LOW; // ledState used to set the LED int previousButtonState = LOW; // will store last time button was updated void setup() { Serial.begin(9600); // set the digital pin as output: pinMode(LED_PIN, OUTPUT); // set the digital pin as an input: pinMode(BUTTON_PIN, INPUT_PULLUP); } void loop() { // if the LED is off turn it on and vice-versa: ledState = (ledState == LOW) ? HIGH : LOW; // set the LED with the ledState of the variable: digitalWrite(LED_PIN, ledState); delay(BLINK_INTERVAL); // If button is pressed during this time, Arduino CANNOT detect int currentButtonState = digitalRead(BUTTON_PIN); if (currentButtonState != previousButtonState) { // print out the state of the button: Serial.println(currentButtonState); // save the last state of button previousButtonState = currentButtonState; } // DO OTHER WORKS HERE }

Étapes rapides

  1. Nouveau sur ESP32 S3 ? Suivez d'abord notre guide ESP32 S3 - Premiers pas.
  2. Câblez le circuit : Connectez les composants selon le schéma de câblage ci-dessus.
  3. Connectez la carte : Branchez l'ESP32 S3 à votre ordinateur à l'aide d'un câble USB Type-C.
  4. Ouvrez l'Arduino IDE : Lancez l'Arduino IDE sur votre ordinateur.
  5. Sélectionnez la carte : Choisissez ESP32 S3 et son port COM correspondant.
  6. Copiez le code : Copiez le code ci-dessus et collez-le dans l'Arduino IDE.
  7. Téléversez le code : Cliquez sur le bouton Upload dans l'Arduino IDE pour compiler et téléverser.
Comment téléverser le code ESP32 S3 avec Arduino IDE
  1. Ouvrez le moniteur série : Ouvrez le moniteur série depuis le menu Tools dans l'Arduino IDE.
Comment ouvrir le moniteur série sur Arduino IDE
  1. Appuyez sur le bouton 4 fois pendant que la LED clignote.
  2. Observez la LED : La LED bascule entre ON et OFF toutes les secondes.
  3. Vérifiez la sortie du moniteur série :
∞
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
ESP32S3 Dev Module
Newbiely.ino
···
8 Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'ESP32S3 Dev Module' on 'COM15')
New Line
9600 baud
[2026-06-16 10:00:01] Button state: 1 [2026-06-16 10:00:02] Button state: 0 [2026-06-16 10:00:05] Button state: 1 [2026-06-16 10:00:06] Button state: 0
Ln 11, Col 1
ESP32S3 Dev Module on COM15
2
  1. Astuce pro : Remarquez que vous ne verrez PAS les quatre pressions de bouton dans le moniteur série. Cela est dû au fait que l'ESP32 S3 ne peut pas détecter d'entrée pendant la période de blocage de delay() — certaines pressions sont simplement manquées.

Code ESP32 S3 - Sans délai

Le code suivant remplace delay() par millis() pour suivre le temps écoulé sans bloquer le processeur. Comme la boucle s'exécute en continu, l'ESP32 S3 peut vérifier l'état du bouton à chaque itération tout en gérant indépendamment le timing du clignotement de la LED.

/* * Ce code ESP32 S3 a été développé par newbiely.fr * Ce code ESP32 S3 est mis à disposition du public sans aucune restriction. * Pour des instructions complètes et des schémas de câblage, veuillez visiter: * https://newbiely.fr/tutorials/esp32-s3/esp32-s3-led-blink-without-delay */ #define LED_PIN 7 // The ESP32 S3 pin GPIO7 connected to LED #define BUTTON_PIN 5 // The ESP32 S3 pin GPIO5 connected to button #define BLINK_INTERVAL 1000 // interval at which to blink LED (milliseconds) // Variables will change: int ledState = LOW; // ledState used to set the LED int previousButtonState = LOW; // will store last time button was updated unsigned long previousMillis = 0; // will store last time LED was updated void setup() { Serial.begin(9600); // set the digital pin as output: pinMode(LED_PIN, OUTPUT); // set the digital pin as an input: pinMode(BUTTON_PIN, INPUT_PULLUP); } void loop() { // check to see if it's time to blink the LED; that is, if the difference // between the current time and last time you blinked the LED is bigger than // the interval at which you want to blink the LED. unsigned long currentMillis = millis(); if (currentMillis - previousMillis >= BLINK_INTERVAL) { // if the LED is off turn it on and vice-versa: ledState = (ledState == LOW) ? HIGH : LOW; // set the LED with the ledState of the variable: digitalWrite(LED_PIN, ledState); // save the last time you blinked the LED previousMillis = currentMillis; } // check button state's change int currentButtonState = digitalRead(BUTTON_PIN); if (currentButtonState != previousButtonState) { // print out the state of the button: Serial.println(currentButtonState); // save the last state of button previousButtonState = currentButtonState; } // DO OTHER WORKS HERE }

Étapes rapides

  1. Nouveau sur ESP32 S3 ? Suivez d'abord notre guide ESP32 S3 - Premiers pas.
  2. Téléversez le code : Copiez le code ci-dessus et téléversez-le vers votre ESP32 S3.
  3. Appuyez sur le bouton 4 fois pendant que la LED clignote.
  4. Observez la LED : La LED bascule toujours entre ON et OFF toutes les secondes.
  5. Vérifiez la sortie du moniteur série :
∞
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
ESP32S3 Dev Module
Newbiely.ino
···
8 Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'ESP32S3 Dev Module' on 'COM15')
New Line
9600 baud
[2026-06-16 10:00:01] Button state: 1 [2026-06-16 10:00:02] Button state: 0 [2026-06-16 10:00:03] Button state: 1 [2026-06-16 10:00:04] Button state: 0 [2026-06-16 10:00:05] Button state: 1 [2026-06-16 10:00:06] Button state: 0 [2026-06-16 10:00:07] Button state: 1 [2026-06-16 10:00:08] Button state: 0
Ln 11, Col 1
ESP32S3 Dev Module on COM15
2
  1. Comparez avec la version delay : Les quatre événements de pression de bouton sont maintenant détectés et enregistrés correctement.
  2. Astuce pro : Le modèle millis() est la base du multitâche sur l'ESP32 S3 — maîtrisez-le une fois et appliquez-le à toute opération temporisée dans vos projets.

Explication du code ligne par ligne

Le code ESP32 S3 ci-dessus contient une explication ligne par ligne. Veuillez lire les commentaires dans le code !

Ajouter plus de tâches

Le code suivant démontre toute la puissance de la programmation non bloquante sur l'ESP32 S3 en faisant clignoter deux LED à des intervalles différents tout en surveillant simultanément un bouton — tout cela sans un seul appel à delay(). Chaque tâche conserve sa propre variable d'horodatage, et la boucle principale parcourt toutes ces tâches à chaque itération afin qu'aucune tâche n'attende jamais une autre.

Schéma de câblage LED deux boutons ESP32 S3

Cette image a été créée avec Fritzing. Cliquez pour agrandir l'image.

/* * Ce code ESP32 S3 a été développé par newbiely.fr * Ce code ESP32 S3 est mis à disposition du public sans aucune restriction. * Pour des instructions complètes et des schémas de câblage, veuillez visiter: * https://newbiely.fr/tutorials/esp32-s3/esp32-s3-led-blink-without-delay */ #define LED_PIN_1 7 // The ESP32 S3 pin GPIO7 connected to LED 1 #define LED_PIN_2 6 // The ESP32 S3 pin GPIO6 connected to LED 2 #define BUTTON_PIN 5 // The ESP32 S3 pin GPIO5 connected to button #define BLINK_INTERVAL_1 1000 // interval at which to blink LED 1 (milliseconds) #define BLINK_INTERVAL_2 500 // interval at which to blink LED 2 (milliseconds) // Variables will change: int ledState_1 = LOW; // ledState used to set the LED 1 int ledState_2 = LOW; // ledState used to set the LED 2 int previousButtonState = LOW; // will store last time button was updated unsigned long previousMillis_1 = 0; // will store last time LED 1 was updated unsigned long previousMillis_2 = 0; // will store last time LED 2 was updated void setup() { Serial.begin(9600); // set the digital pin as output: pinMode(LED_PIN_1, OUTPUT); pinMode(LED_PIN_2, OUTPUT); // set the digital pin as an input: pinMode(BUTTON_PIN, INPUT_PULLUP); } void loop() { unsigned long currentMillis = millis(); // check to see if it's time to blink the LED 1 if (currentMillis - previousMillis_1 >= BLINK_INTERVAL_1) { // if the LED is off turn it on and vice-versa: ledState_1 = (ledState_1 == LOW) ? HIGH : LOW; // set the LED with the ledState of the variable: digitalWrite(LED_PIN_1, ledState_1); // save the last time you blinked the LED previousMillis_1 = currentMillis; } // check to see if it's time to blink the LED 2 if (currentMillis - previousMillis_2 >= BLINK_INTERVAL_2) { // if the LED is off turn it on and vice-versa: ledState_2 = (ledState_2 == LOW) ? HIGH : LOW; // set the LED with the ledState of the variable: digitalWrite(LED_PIN_2, ledState_2); // save the last time you blinked the LED previousMillis_2 = currentMillis; } // check button state's change int currentButtonState = digitalRead(BUTTON_PIN); if (currentButtonState != previousButtonState) { // print out the state of the button: Serial.println(currentButtonState); // save the last state of button previousButtonState = currentButtonState; } // DO OTHER WORKS HERE }

Idées d'applications

Le timing non bloquant avec millis() est l'un des modèles les plus polyvalents en programmation ESP32 S3, applicable bien au-delà du simple clignotement de LED.

  1. Interrogation multi-capteurs : Lisez des capteurs de température, d'humidité et de mouvement à des intervalles différents sans aucun blocage entre les lectures.
  2. Indicateur de battement de cœur : Faites clignoter une LED d'état à un rythme fixe pendant que l'ESP32 S3 gère simultanément des connexions WiFi ou une messagerie MQTT.
  3. Entrée de bouton anti-rebond : Combinez le timing millis() avec l'anti-rebond de bouton pour détecter de manière fiable les pressions sans interrompre d'autres tâches.
  4. Contrôle de relais temporisé : Activez et désactivez des relais à des intervalles précis pour des systèmes d'irrigation, des programmations d'éclairage, ou de l'automatisation industrielle.
  5. Contrôle de vitesse de moteur : Gérez le timing PWM pour des moteurs ou des servos tout en surveillant simultanément des capteurs de sécurité sur l'ESP32 S3.
  6. Planificateur de journalisation de données : Échantillonnez les données de capteur à intervalles réguliers et mettez-les en tampon pour un téléversement périodique via WiFi sans bloquer la boucle de capteur.

Tutoriel vidéo

Regardez le tutoriel vidéo étape par étape pour ce projet ESP32 S3 ci-dessous.

Défiez-vous

Une fois que le clignotement non bloquant fonctionne sur votre ESP32 S3, approfondissez votre compréhension avec ces exercices progressivement plus difficiles.

  1. Débutant : Changez l'intervalle de clignotement de 1000 ms à 250 ms et observez comment la LED clignote plus vite sans affecter la détection du bouton.
  2. Débutant : Ajoutez une deuxième LED et faites-la clignoter à deux fois la vitesse de la première LED en utilisant des minuteries millis() séparées.
  3. Intermédiaire : Utilisez le bouton pour activer et désactiver le clignotement de la LED, afin qu'une pression démarre le clignotement et la suivante l'arrête.
  4. Intermédiaire : Implémentez trois tâches millis() indépendantes : faites clignoter la LED1 à 500 ms, la LED2 à 300 ms, et lisez l'état d'un bouton à des intervalles de 50 ms.
  5. Avancé : Remplacez la logique de timing millis() par la bibliothèque ezLED et comparez la complexité du code et le comportement sur l'ESP32 S3.

Références du langage

Commentaires

※ NOS MESSAGES

  • N'hésitez pas à partager le lien de ce tutoriel. Cependant, veuillez ne pas utiliser notre contenu sur d'autres sites web. Nous avons investi beaucoup d'efforts et de temps pour créer ce contenu, veuillez respecter notre travail !