Arduino - Bouton - Anti-rebond

Lorsqu'un bouton est pressé/relâché ou qu'un interrupteur est basculé, les débutants pensent généralement que son état change simplement de LOW à HIGH ou de HIGH à LOW. En pratique, ce n'est pas exactement le cas. En raison des caractéristiques mécaniques et physiques, l'état du bouton (ou de l'interrupteur) peut osciller plusieurs fois entre LOW et HIGH. Ce phénomène est appelé rebond. Le phénomène de rebond fait qu'une simple pression peut être lue comme des pressions multiples, entraînant un dysfonctionnement dans certains types d'applications. Ce tutoriel montre comment éliminer ce phénomène (appelé anti-rebond sur l'entrée).

Phénomène de chatter d'Arduino

Préparation du matériel

1×Arduino Uno
1×USB 2.0 cable type A/B
1×Push Button
1×(Optional) Panel-mount Push Button
1×Breadboard
1×Jumper Wires
1×(Optional) 9V Power Adapter for Arduino
1×(Recommended) Screw Terminal Block Shield for Arduino Uno
1×(Optional) Transparent Acrylic Enclosure For Arduino Uno

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 ne connaissez pas les boutons (brochage, fonctionnement, programmation...), apprenez à les utiliser dans les tutoriels suivants :

Diagramme de câblage

Schéma de câblage du bouton Arduino

This image is created using Fritzing. Click to enlarge image

Voyons et comparons le code Arduino sans et avec anti-rebond ainsi que leurs comportements.

Bouton de lecture sans anti-rebond

Avant d'apprendre le debounce, observez simplement le code sans debounce et son comportement.

Étapes rapides

  • Connectez l'Arduino au PC via le câble USB
  • Ouvrez l'IDE Arduino, sélectionnez la bonne carte et le bon port
  • Copiez le code ci-dessous et ouvrez-le avec l'IDE Arduino
/* * Ce code Arduino a été développé par newbiely.fr * Ce code Arduino 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/arduino-button-debounce */ // constants won't change. They're used here to set pin numbers: const int BUTTON_PIN = 7; // the number of the pushbutton pin // Variables will change: int lastState = LOW; // the previous state from the input pin int currentState; // the current reading from the input pin void setup() { // initialize serial communication at 9600 bits per second: Serial.begin(9600); // initialize the pushbutton pin as an pull-up input // the pull-up input pin will be 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: currentState = digitalRead(BUTTON_PIN); if(lastState == HIGH && currentState == LOW) Serial.println("The button is pressed"); else if(lastState == LOW && currentState == HIGH) Serial.println("The button is released"); // save the the last state lastState = currentState; }
  • Cliquez sur le bouton Upload de l'IDE Arduino pour téléverser le code vers Arduino.
Téléverser le code avec l'IDE Arduino
  • Ouvrez le moniteur série
  • Continuez à appuyer sur le bouton plusieurs secondes puis relâchez-le.
  • Voir le résultat sur 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  

⇒ Comme vous pouvez le voir, vous avez appuyé et relâché le bouton une seule fois. Cependant, Arduino le reconnaît comme plusieurs pressions et relâchements.

Lire un Bouton avec Anti-rebond

Étapes rapides

  • Copiez le code ci-dessous et ouvrez-le avec l'IDE Arduino.
/* * Ce code Arduino a été développé par newbiely.fr * Ce code Arduino 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/arduino-button-debounce */ // constants won't change. They're used here to set pin numbers: const int BUTTON_PIN = 7; // the number of the pushbutton pin const int DEBOUNCE_DELAY = 50; // the debounce time; increase if the output flickers // Variables will change: int lastSteadyState = LOW; // the previous steady state from the input pin int lastFlickerableState = LOW; // the previous flickerable state from the input pin int currentState; // 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 serial communication at 9600 bits per second: Serial.begin(9600); // initialize the pushbutton pin as an pull-up input // the pull-up input pin will be 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: currentState = 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 (currentState != lastFlickerableState) { // reset the debouncing timer lastDebounceTime = millis(); // save the the last flickerable state lastFlickerableState = currentState; } if ((millis() - lastDebounceTime) > DEBOUNCE_DELAY) { // 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 && currentState == LOW) Serial.println("The button is pressed"); else if (lastSteadyState == LOW && currentState == HIGH) Serial.println("The button is released"); // save the the last steady state lastSteadyState = currentState; } }
  • Cliquez sur le bouton Upload dans l’IDE Arduino pour charger le code sur l’Arduino
  • Ouvrez le moniteur série
  • Continuez à appuyer sur le bouton plusieurs secondes puis relâchez-le.
  • Consultez le résultat sur le moniteur série
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 appuyé et relâché le bouton une seule fois. Arduino le reconnaît comme une pression et relâchement unique. Les parasites sont éliminés.

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

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

Code Arduino de Debounce pour un seul bouton

/* * Created by ArduinoGetStarted.com * * This example code is in the public domain * * Tutorial page: https://arduinogetstarted.com/tutorials/arduino-button-library * * This example reads the state of a button with debounce and print it to Serial Monitor. */ #include <ezButton.h> ezButton button(7); // create ezButton object that attach to pin 7; 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 Arduino pour Plusieurs Boutons

/* * Ce code Arduino a été développé par newbiely.fr * Ce code Arduino 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/arduino-button-debounce */ #include <ezButton.h> ezButton button1(6); // créez l'objet ezButton attaché à la broche 6 ezButton button2(7); // créez l'objet ezButton attaché à la broche 7 ezButton button3(8); // créez l'objet ezButton attaché à la broche 8 void setup() { Serial.begin(9600); button1.setDebounceTime(50); // définir le temps de debounce à 50 millisecondes button2.setDebounceTime(50); // définir le temps de debounce à 50 millisecondes button3.setDebounceTime(50); // 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"); }

Le schéma de câblage pour le code ci-dessus :

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

This image is created using Fritzing. Click to enlarge image

Vidéo

Connaissances supplémentaires

  • La valeur DEBOUNCE_DELAY dépend des applications. Différentes applications peuvent utiliser différentes valeurs.

Extensibilité

La méthode de debounce peut être appliquée pour des interrupteurs, des 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!