ESP8266 - Bouton - Anti-rebond

Lorsqu'un bouton est pressé ou relâché, ou qu'un interrupteur est basculé, les débutants supposent souvent que son état passe de BAS à HAUT ou de HAUT à BAS. En réalité, ce n'est pas le cas. En raison des caractéristiques mécaniques et physiques, l'état du bouton (ou de l'interrupteur) peut fluctuer plusieurs fois entre BAS et HAUT pour une seule action de l'utilisateur. Cela est connu sous le nom de rebond. Le rebond peut causer qu'une seule pression soit lue comme plusieurs pressions, entraînant des dysfonctionnements dans certaines applications.

phénomène de bavardage

La méthode pour prévenir ce problème est appelée l'anti-rebond ou debounce. Ce tutoriel vous explique comment le faire lorsque vous utilisez le bouton avec l'ESP8266. Nous allons apprendre à travers les étapes suivantes :

Préparation du matériel

1×ESP8266 NodeMCU
1×Micro USB Cable
1×Push Button
1×(Optional) Panel-mount Push Button
1×Breadboard
1×Jumper Wires
1×(Optional) 5V Power Adapter for ESP8266
1×(Optional) ESP8266 Screw Terminal Adapter

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 de Button

Si vous n'êtes pas familier avec les boutons (y compris les brochages, le fonctionnement et la programmation), les tutoriels suivants peuvent vous aider :

Diagramme de câblage

Schéma de câblage du bouton ESP8266 NodeMCU

This image is created using Fritzing. Click to enlarge image

Voir plus dans l'agencement des broches de l'ESP8266 et comment alimenter l'ESP8266 et d'autres composants.

Jetons un coup d'œil au code ESP8266 à la fois AVEC et SANS anti-rebond et comparons leurs comportements respectifs.

Bouton de lecture sans anti-rebond

Avant d'explorer l'anti-rebond, examinez le code sans celui-ci et observez son comportement.

Étapes rapides

Pour commencer avec ESP8266 sur Arduino IDE, suivez ces étapes :

  • Consultez le tutoriel comment configurer l'environnement pour ESP8266 sur Arduino IDE si c'est votre première utilisation de l'ESP8266.
  • Connectez les composants comme indiqué dans le schéma.
  • Connectez la carte ESP8266 à votre ordinateur via un câble USB.
  • Ouvrez Arduino IDE sur votre ordinateur.
  • Choisissez la bonne carte ESP8266, telle que (par exemple, NodeMCU 1.0 (Module ESP-12E)), et son port COM respectif.
  • Connectez votre ESP8266 à votre ordinateur à l'aide d'un câble USB.
  • Lancez Arduino IDE, sélectionnez la carte et le port appropriés.
  • Copiez le code ci-dessous et ouvrez-le dans Arduino IDE.
/* * Ce code ESP8266 NodeMCU a été développé par newbiely.fr * Ce code ESP8266 NodeMCU 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/esp8266/esp8266-button-debounce */ #define BUTTON_PIN D7 // The ESP8266 pin D7 connected to button int prev_button_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); // Configure the ESP8266 pin as a pull-up input: HIGH when the button is open, LOW when pressed. pinMode(BUTTON_PIN, INPUT_PULLUP); } void loop() { // read the state of the switch/button: button_state = digitalRead(BUTTON_PIN); if (prev_button_state == HIGH && button_state == LOW) Serial.println("The button is pressed"); else if (prev_button_state == LOW && button_state == HIGH) Serial.println("The button is released"); // save the the last state prev_button_state = button_state; }
  • Cliquez sur le bouton Upload dans l'IDE Arduino pour compiler et téléverser le code vers l'ESP8266.
Téléverser le code avec l'IDE Arduino
  • Ouvrez le moniteur série.
  • Appuyez et maintenez le bouton pendant quelques secondes, puis relâchez.
  • Vérifiez la sortie dans le moniteur série.
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  

Vous pouvez constater que, parfois, vous n'avez appuyé et relâché le bouton qu'une seule fois. Néanmoins, l'ESP8266 le perçoit comme plusieurs pressions et relâchements. C'est le phénomène de rebond mentionné au début du tutoriel. Voyons comment y remédier dans la partie suivante.

Bouton de lecture avec anti-rebond

Le code ci-dessous applique la méthode appelée "debounce" pour prévenir le phénomène de rebond.

/* * Ce code ESP8266 NodeMCU a été développé par newbiely.fr * Ce code ESP8266 NodeMCU 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/esp8266/esp8266-button-debounce */ #define BUTTON_PIN D7 // The ESP8266 pin D7 connected to button #define DEBOUNCE_TIME 50 // The debounce time in millisecond, increase this time if it still chatters int lastSteadyState = LOW; // The previous steady state from the input pin int lastFlickerableState = LOW; // The previous flickerable state from the input pin int button_state; // The current reading from the input pin // The following variables are unsigned longs because the time, measured in // milliseconds, will quickly become a bigger number than can be stored in an int. unsigned long lastDebounceTime = 0; // The last time the output pin was toggled void setup() { // Initialize the Serial to communicate with the Serial Monitor. Serial.begin(9600); // Configure the ESP8266 pin as a pull-up input: HIGH when the button is open, LOW when pressed. 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 != lastFlickerableState) { // reset the debouncing timer lastDebounceTime = millis(); // save the the last flickerable state lastFlickerableState = button_state; } if ((millis() - lastDebounceTime) > 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(lastSteadyState == HIGH && button_state == LOW) Serial.println("The button is pressed"); else if(lastSteadyState == LOW && button_state == HIGH) Serial.println("The button is released"); // save the the last steady state lastSteadyState = button_state; } }

Étapes rapides

  • Câblez les composants comme indiqué sur le schéma.
  • Connectez la carte ESP8266 à votre ordinateur à l'aide d'un câble USB.
  • Ouvrez l'Arduino IDE sur votre ordinateur.
  • Choisissez la bonne carte ESP8266, telle que (par exemple, NodeMCU 1.0 (Module ESP-12E)), et son port COM respectif.
  • Copiez le code ci-dessus et ouvrez-le avec l'Arduino IDE.
  • Cliquez sur le bouton Upload de l'Arduino IDE pour compiler et téléverser le code sur l'ESP8266.
  • Ouvrez le moniteur série.
  • Maintenez le bouton enfoncé pendant quelques secondes, puis relâchez.
  • Vérifiez le moniteur série pour voir le résultat.
COM6
Send
The button is pressed The button is released
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

Comme vous pouvez le constater, vous avez uniquement appuyé et relâché le bouton une fois. L'ESP8266 est capable de détecter cela comme une seule pression et relâchement, éliminant ainsi tout bruit inutile.

Nous l'avons simplifié - Code de Debounce de bouton ESP8266 avec bibliothèque

Nous avons développé une bibliothèque, ezButton, pour simplifier la tâche des débutants, surtout lorsqu'ils utilisent plusieurs boutons. Vous pouvez en savoir plus sur la bibliothèque ezButton ici.

Code de Debounce ESP8266 pour un seul bouton

/* * Ce code ESP8266 NodeMCU a été développé par newbiely.fr * Ce code ESP8266 NodeMCU 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/esp8266/esp8266-button-debounce */ #include <ezButton.h> ezButton button(D7); // create ezButton object for pin D7 void setup() { Serial.begin(9600); button.setDebounceTime(50); // set debounce time to 50 milliseconds } void loop() { button.loop(); // MUST call the loop() function first if(button.isPressed()) Serial.println("The button is pressed"); if(button.isReleased()) Serial.println("The button is released"); }

Code de Debounce de Bouton ESP8266 pour Plusieurs Boutons

/* * Ce code ESP8266 NodeMCU a été développé par newbiely.fr * Ce code ESP8266 NodeMCU 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/esp8266/esp8266-button-debounce */ #include <ezButton.h> ezButton button1(D5); // create ezButton object for pin D5 ezButton button2(D6); // create ezButton object for pin D6 ezButton button3(D7); // create ezButton object for pin D7 void setup() { Serial.begin(9600); button1.setDebounceTime(50); // set debounce time to 50 milliseconds button2.setDebounceTime(50); // set debounce time to 50 milliseconds button3.setDebounceTime(50); // set debounce time to 50 milliseconds } void loop() { button1.loop(); // MUST call the loop() function first button2.loop(); // MUST call the loop() function first button3.loop(); // MUST call the loop() function first 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"); }

Le schéma du code ci-dessus :. L'illustration du câblage pour le code :. La représentation des connexions pour le code :

Schéma de câblage de la bibliothèque de boutons ESP8266 NodeMCU

This image is created using Fritzing. Click to enlarge image

Vidéo

Connaissances supplémentaires

  • La valeur de DEBOUNCE_DELAY dépend des caractéristiques physiques du bouton. Chaque bouton peut avoir une valeur différente.

Extensibilité

La technique de debounce peut être utilisée pour les interrupteurs, les capteurs tactiles, et plus encore.

※ 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!