Menu
CoddyTech

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.

challenge icon

Défi

Moyen

Ce 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 dans lastPress

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);
  }
}
quiz iconTestez-vous

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

Entraînez-vous par vous-même : Playground Arduino