Compter les appuis avec une interruption
Fait partie de la section Gestion du temps sans delay du Journey Arduino de Coddy. Leçon 15 sur 18.
Comme tu l’as vu dans la section Entrées, les boutons rebondissent : pendant environ une milliseconde, les contacts se touchent, se séparent puis se touchent à nouveau, à l’appui comme au relâchement. Une interruption détecte chaque contact ; une ISR FALLING qui ajoute 1 compte donc un clic plusieurs fois.
Une ISR ne peut pas éliminer les rebonds avec delay() : delay() a besoin de sa propre interruption d’horloge, et les interruptions sont suspendues pendant l’exécution d’une ISR. Utilise plutôt l’horloge. Retiens quand a eu lieu le dernier appui comptabilisé et ignore toute transition descendante qui survient trop tôt après celui-ci :
unsigned long lastPress = 0;
void onPress() {
unsigned long now = millis();
if (now - lastPress >= 200) {
presses = presses + 1;
lastPress = now;
}
}Lire millis() dans une ISR ne pose pas de problème : cette fonction donne l’heure à laquelle l’ISR a démarré. Choisis une fenêtre plus longue qu’un clic, pour que les rebonds au relâchement se produisent pendant celle-ci, et plus courte que l’intervalle entre deux clics rapides. 200 ms convient aux personnes.
Défi
MoyenCe compteur compte chaque clic plusieurs fois. Ajoute un anti-rebond dans onPress() :
- ajoute une variable
unsigned long lastPress - ne compte une transition descendante que si au moins 200 ms se sont écoulées depuis
lastPress, puis enregistre l’heure danslastPress
Appuie sur Run, clique quelques fois sur le bouton et observe le compteur, puis appuie sur Check.
Essayez vous-même
const int buttonPin = 2;
volatile int presses = 0;
int shown = 0;
void onPress() {
// chaque front descendant de la broche est compté, y compris les rebonds : éliminez les rebonds ici
presses = presses + 1;
}
void setup() {
pinMode(buttonPin, INPUT_PULLUP);
Serial.begin(9600);
attachInterrupt(digitalPinToInterrupt(buttonPin), onPress, FALLING);
}
void loop() {
// affichez le nombre de pressions chaque fois qu’il change
if (presses != shown) {
shown = presses;
Serial.println(shown);
}
}
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Gestion du temps sans delay
3Interruptions
Un appui que la boucle ne détecte pasDESCENDANT, MONTANT et CHANGEMENTPartager avec volatileCompter les appuis avec une interruptionEntraînez-vous par vous-même : Playground Arduino