Arduino > Élimination du rebondissement (Debounce/Debouncing/Bounce2)

1.  Démonstration du problème

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 :

1.1  Éliminer le rebondissement avec un métronome

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;
        }



}

1.2  Éliminer le rebondissement avec Bounce2

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() ) {

        }

}