Arduino > Élimination du rebondissement (Debounce/Debouncing/Bounce2)
Contents (hide)
Nous voulons compter le nombre de fois que l'utilisateur appuie sur un bouton branché à l'entrée #7 (avec INPUT_PULLUP).
int BUTTON_PIN = 6; int previousButtonState; int count =0; void setup() { Serial.begin(57600); pinMode( BUTTON_PIN , INPUT_PULLUP ); previousButtonState = digitalRead( BUTTON_PIN ); } void loop() { int currentButtonState = digitalRead( BUTTON_PIN ); if ( currentButtonState != previousButtonState ) { previousButtonState = currentButtonState; if ( currentButtonState == LOW ) { count = count + 1; Serial.println(count); } } }
Le moniteur série devrait afficher le nombre de fois que le bouton est appuyé. Par contre, vous remarquerez que la valeur semble augmenter plusieurs fois de temps à autre ou s'incrémenter quand on relâche le bouton.
La raison : l'Arduino va tellement vite qu'il détecte des micro-rebondissements entre les contacts du bouton tel qu’illustré par l'image suivante :
La solution suivante élimine le rebondissement en s'assurant de ne pas faire plus d'une lecture à chaque 5 ms. Dès que le bouton change d'état, le code ne fait pas d'autre lecture du bouton pendant 5 ms pour ne pas détecter les micro-rebondissements.
int BUTTON_PIN = 6; int previousButtonState; int count =0; unsigned long debounceTimeStamp; void setup() { Serial.begin(57600); pinMode( BUTTON_PIN , INPUT_PULLUP ); previousButtonState = digitalRead( BUTTON_PIN ); } void loop() { if ( millis() - debounceTimeStamp >= 5 ) { int currentButtonState = digitalRead( BUTTON_PIN ); if ( currentButtonState != previousButtonState ) { debounceTimeStamp = millis(); if ( currentButtonState == LOW ) { count = count + 1; Serial.println(count); } } previousButtonState = currentButtonState; } }
Bounce2 est une logithèque conçue pour éliminer les rebondissements et pour faciliter l'utilisation des boutons.
Installer Bounce2 à l'aide du gestionnaire des logithèques :
#include <Bounce2.h> int BUTTON_PIN = 6; int count=0; // Instantiate a Bounce object Bounce button = Bounce(); void setup() { Serial.begin(57600); // After setting up the button, setup the Bounce instance : button.attach(BUTTON_PIN,INPUT_PULLUP); button.interval(5); // debounce interval in ms } void loop() { // METTRE A JOUR LES VALEURS DU BOUTON button.update(); // LORSE QUE LE BOUTON EST APPUYE (fell = PASSER DE HIGH A LOW) if ( button.fell() ) { count = count + 1; Serial.println(count); } else if ( button.rose() ) { } }