Arduino Nano ESP32 - Bouton - Anti-rebond

Lorsqu'un bouton est pressé/relâché ou qu'un interrupteur bascule entre ON et OFF, son état passe de LOW à HIGH (ou de HIGH à LOW) une seule fois. Est-ce correct ?

Non, ce n'est pas le cas. Cela est dû au monde physique. Lorsque vous appuyez une seule fois sur un bouton, l'état du bouton bascule rapidement plusieurs fois entre BAS et HAUT plutôt qu'une seule fois. Il s'agit d'une caractéristique mécanique et physique. Ce phénomène est connu sous le nom de rebond. Le phénomène de rebond fait que le MCU (par exemple, ESP32) lit plusieurs appuis sur un bouton en réponse à une seule pression réelle. Cela entraîne un dysfonctionnement. Le processus pour éliminer ce phénomène est appelé anti-rebond. Ce tutoriel montre comment le faire.

Phénomène de bavardage de l'Arduino Nano ESP32

Ce tutoriel fournit :

Préparation du matériel

1×Arduino Nano ESP32
1×USB Cable Type-C
1×Push Button
1×(Optional) Panel-mount Push Button
1×Breadboard
1×Jumper Wires
1×(Optional) DC Power Jack
1×(Recommended) Screw Terminal Adapter for Arduino Nano

Or you can buy the following sensor kits:

1×DIYables Sensor Kit (30 sensors/displays)
1×DIYables Sensor Kit (18 sensors/displays)
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.

À propos du bouton

Nous disposons de tutoriels spécifiques sur les boutons. Le tutoriel contient des informations détaillées et des instructions étape par étape sur le brochage du matériel, le principe de fonctionnement, la connexion des câbles à l'ESP32, le code Arduino Nano ESP32... Pour en savoir plus, consultez les liens suivants :

Diagramme de câblage

Schéma de câblage du bouton Arduino Nano ESP32

This image is created using Fritzing. Click to enlarge image

Pour clarifier, exécutons le code Arduino Nano ESP32 SANS et AVEC anti-rebond, et comparons leurs résultats.

Bouton de lecture sans anti-rebond

Étapes rapides

Pour commencer avec l'Arduino Nano ESP32, suivez ces étapes :

  • Si vous êtes nouveau avec l'Arduino Nano ESP32, consultez le tutoriel sur comment configurer l'environnement pour l'Arduino Nano ESP32 dans l'Arduino IDE.
  • Câblez les composants selon le schéma fourni.
  • Connectez la carte Arduino Nano ESP32 à votre ordinateur à l'aide d'un câble USB.
  • Lancez l'Arduino IDE sur votre ordinateur.
  • Sélectionnez la carte Arduino Nano ESP32) et son port COM correspondant.
  • Copiez le code ci-dessous et collez-le dans l'Arduino IDE.
/* * Ce code Arduino Nano ESP32 a été développé par newbiely.fr * Ce code Arduino Nano ESP32 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/arduino-nano-esp32/arduino-nano-esp32-button-debounce */ #define BUTTON_PIN D2 // Arduino Nano ESP32 pin D2 pin connected to button int prev_state = LOW; // The previous state from the input pin int button_state; // The current reading from the input pin void setup() { // Initialize the Serial to communicate with the Serial Monitor. Serial.begin(9600); // initialize the button pin as an pull-up input (HIGH when the switch is open and LOW when the switch is closed) pinMode(BUTTON_PIN, INPUT_PULLUP); } void loop() { // read the state of the switch/button: button_state = digitalRead(BUTTON_PIN); if (prev_state == HIGH && button_state == LOW) Serial.println("The button is pressed"); else if (prev_state == LOW && button_state == HIGH) Serial.println("The button is released"); // save the the last state prev_state = button_state; }
  • Compiler et téléverser le code sur la carte Arduino Nano ESP32 en cliquant sur le bouton Upload dans l'IDE Arduino.
Téléversement de code Arduino IDE
  • Ouvrez le moniteur série sur Arduino IDE.
Comment ouvrir le moniteur série sur Arduino IDE
  • Appuyez une seule fois sur le bouton mais maintenez-le plusieurs secondes, puis relâchez-le.
  • Consultez le résultat sur le moniteur série. Cela ressemble à ce qui suit :
COM6
Send
The button is pressed The button is pressed The button is pressed The button is released The button is released
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

⇒ Comme vous pouvez le voir, vous avez effectué une seule pression et relâchement, mais l'Arduino Nano ESP32 a détecté plusieurs pressions et relâchements.

※ NOTE THAT:

Le phénomène de bavardage ne se produit pas tout le temps. S'il ne se produit pas, veuillez essayer le test ci-dessus plusieurs fois.

Bouton de lecture avec anti-rebond

Étapes rapides

/* * Ce code Arduino Nano ESP32 a été développé par newbiely.fr * Ce code Arduino Nano ESP32 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/arduino-nano-esp32/arduino-nano-esp32-button-debounce */ #define BUTTON_PIN D2 // Arduino Nano ESP32 pin D2 pin connected to button #define DEBOUNCE_TIME 50 // The debounce time in millisecond, increase this time if it still chatters int prev_state_steady = LOW; // The previous steady state from the input pin int prev_state_flick = LOW; // The previous flickerable state from the input pin int button_state; // The current reading from the input pin unsigned long last_debounce_time = 0; // The last time the output pin was toggled void setup() { // Initialize the Serial to communicate with the Serial Monitor. Serial.begin(9600); // initialize the button pin as an pull-up input (HIGH when the switch is open and LOW when the switch is closed) pinMode(BUTTON_PIN, INPUT_PULLUP); } void loop() { // read the state of the switch/button: button_state = digitalRead(BUTTON_PIN); // check to see if you just pressed the button // (i.e. the input went from LOW to HIGH), and you've waited long enough // since the last press to ignore any noise: // If the switch/button changed, due to noise or pressing: if (button_state != prev_state_flick) { // reset the debouncing timer last_debounce_time = millis(); // save the the last flickerable state prev_state_flick = button_state; } if ((millis() - last_debounce_time) > DEBOUNCE_TIME) { // whatever the reading is at, it's been there for longer than the debounce // delay, so take it as the actual current state: // if the button state has changed: if(prev_state_steady == HIGH && button_state == LOW) Serial.println("The button is pressed"); else if(prev_state_steady == LOW && button_state == HIGH) Serial.println("The button is released"); // save the the last steady state prev_state_steady = button_state; } }
  • Compiler et télécharger le code sur la carte Arduino Nano ESP32 en cliquant sur le bouton Upload dans l'IDE Arduino
  • Ouvrir le moniteur série dans l'IDE Arduino
  • Continuez à appuyer sur le bouton plusieurs secondes puis relâchez-le.
  • Consultez le résultat sur le moniteur série. Cela ressemble à ce qui suit :
COM6
Send
The button is pressed The button is released
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

Comme vous pouvez le voir, vous avez effectué une pression et un relâchement, et l'Arduino Nano ESP32 a détecté une pression et un relâchement. Le rebond est éliminé.

Nous l'avons simplifié - Code de rebond de bouton Arduino Nano ESP32 avec bibliothèque

Pour faciliter la tâche aux débutants, notamment lors du débogage pour plusieurs boutons, nous avons créé une bibliothèque de boutons, appelée ezButton. Vous pouvez en savoir plus sur la bibliothèque ezButton ici.

Code de Debounce de Bouton pour Arduino Nano ESP32 pour un Bouton Unique

/* * Ce code Arduino Nano ESP32 a été développé par newbiely.fr * Ce code Arduino Nano ESP32 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/arduino-nano-esp32/arduino-nano-esp32-button-debounce */ #include <ezButton.h> #define DEBOUNCE_TIME 50 // le temps de rebond en millisecondes, augmentez ce temps si cela interfère toujours ezButton button(D2); // crée un objet ezButton pour la broche D2 void setup() { Serial.begin(9600); button.setDebounceTime(DEBOUNCE_TIME); // définit le temps de rebond à 50 millisecondes } void loop() { button.loop(); // IL FAUT appeler en premier la fonction loop() if (button.isPressed()) Serial.println("The button is pressed"); if (button.isReleased()) Serial.println("The button is released"); }

Code de Debounce de Bouton pour Arduino Nano ESP32 pour Plusieurs Boutons

Écrivons du code de temporisation pour trois boutons.

Le schéma de câblage

Schéma de câblage de la bibliothèque de boutons Arduino Nano ESP32

This image is created using Fritzing. Click to enlarge image

/* * Ce code Arduino Nano ESP32 a été développé par newbiely.fr * Ce code Arduino Nano ESP32 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/arduino-nano-esp32/arduino-nano-esp32-button-debounce */ #include <ezButton.h> #define DEBOUNCE_TIME 50 // le temps de debounce en millisecondes, augmenter ce temps s'il y a encore des rebonds ezButton button1(D6); // créer un objet ezButton pour la broche D6 ezButton button2(D7); // créer un objet ezButton pour la broche D7 ezButton button3(D8); // créer un objet ezButton pour la broche D8 void setup() { Serial.begin(9600); button1.setDebounceTime(DEBOUNCE_TIME); // définir le temps de debounce à 50 millisecondes button2.setDebounceTime(DEBOUNCE_TIME); // définir le temps de debounce à 50 millisecondes button3.setDebounceTime(DEBOUNCE_TIME); // définir le temps de debounce à 50 millisecondes } void loop() { button1.loop(); // il FAUT appeler la fonction loop() en premier button2.loop(); // il FAUT appeler la fonction loop() en premier button3.loop(); // il FAUT appeler la fonction loop() en premier if (button1.isPressed()) Serial.println("The button 1 is pressed"); if (button1.isReleased()) Serial.println("The button 1 is released"); if (button2.isPressed()) Serial.println("The button 2 is pressed"); if (button2.isReleased()) Serial.println("The button 2 is released"); if (button3.isPressed()) Serial.println("The button 3 is pressed"); if (button3.isReleased()) Serial.println("The button 3 is released"); }

Vidéo

Connaissances supplémentaires

  • La valeur de DEBOUNCE_TIME dépend du matériel. Différents matériels peuvent nécessiter différentes valeurs.
  • Le debounce doit également s'appliquer aux interrupteurs marche/arrêt, interrupteurs de limite, interrupteurs à lames, capteurs tactiles...

※ OUR MESSAGES

  • Please feel free to share the link of this tutorial. However, Please do not use our content on any other websites. We invested a lot of effort and time to create the content, please respect our work!