Anti-rebond d’un bouton
Fait partie de la section Entrées du Journey Arduino de Coddy. Leçon 6 sur 22.
Le bouton de cette leçon est bien réel, et le projet de départ est votre compteur de la leçon précédente. Lancez-le et appuyez une fois sur le bouton : le compteur augmente de plus d’une unité.
À l’intérieur d’un bouton, deux contacts métalliques se touchent. Lorsqu’ils se rencontrent, ils rebondissent : pendant environ une milliseconde, ils se touchent, s’écartent sous l’effet du ressort et se touchent de nouveau. Le relâchement produit le même effet. loop() lit la broche de nombreuses fois pendant cette milliseconde et compte chaque rebond comme un appui.
La solution s’appelle l’anti-rebond : lorsque la lecture change, agissez une seule fois, puis attendez environ 20 ms que les contacts se stabilisent avant de lire à nouveau. Une personne ne remarque jamais 20 ms.
if (reading != lastReading) {
if (reading == LOW) {
presses++;
Serial.println(presses);
}
delay(20);
}
lastReading = reading;Attendez après chaque changement, et pas seulement après un appui : le relâchement rebondit aussi, et chaque rebond lors du retour à l’état haut ressemble à un nouvel appui.
Défi
MoyenCorrigez le compteur pour que chaque pression soit comptée une seule fois :
- lorsque
readingest différent delastReading, comptez-le s’il s’agit d’une pression (LOW), puis attendez 20 ms - continuez à enregistrer
lastReadingà la fin deloop()
Cliquez sur Run, appuyez plusieurs fois sur le bouton et observez le compteur, puis cliquez sur Check.
Essayez vous-même
const int buttonPin = 2;
int presses = 0;
int lastReading = HIGH;
void setup() {
pinMode(buttonPin, INPUT_PULLUP);
Serial.begin(9600);
}
void loop() {
int reading = digitalRead(buttonPin);
if (reading == LOW && lastReading == HIGH) {
presses++;
Serial.println(presses);
}
lastReading = reading;
}
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Entrées
Entraînez-vous par vous-même : Playground Arduino