Menu
CoddyTech

Contare le pressioni con un interrupt

Fa parte della sezione Temporizzazione senza delay del percorso Arduino di Coddy. Lezione 15 di 18.

Come hai visto nella sezione Input, i pulsanti rimbalzano: per circa un millisecondo i contatti si toccano, si separano e si toccano di nuovo, sia alla pressione che al rilascio. Un interrupt rileva ogni contatto, quindi una ISR FALLING che aggiunge 1 conta un clic diverse volte.

Una ISR non può eliminare il rimbalzo con delay(): delay() ha bisogno dell'interrupt interno dell'orologio, e gli interrupt sono sospesi mentre è in esecuzione una ISR. Usa invece l'orologio. Ricorda quando è avvenuta l'ultima pressione conteggiata e ignora qualsiasi fronte discendente che si verifichi troppo presto dopo di essa:

unsigned long lastPress = 0;

void onPress() {
  unsigned long now = millis();
  if (now - lastPress >= 200) {
    presses = presses + 1;
    lastPress = now;
  }
}

Leggere millis() in una ISR va bene: restituisce l'ora in cui è iniziata la ISR. Scegli una finestra più lunga di un clic, in modo che i rimbalzi del rilascio ricadano al suo interno, e più breve dell'intervallo tra due clic rapidi. 200 ms funzionano per le persone.

challenge icon

Sfida

Medio

Questo contatore conta ogni clic diverse volte. Aggiungi un debounce al suo interno onPress():

  • aggiungi una variabile unsigned long lastPress
  • conta una discesa solo se sono trascorsi almeno 200 ms da lastPress, quindi memorizza il tempo in lastPress

Premi Esegui, fai clic sul pulsante alcune volte e osserva il conteggio, poi Verifica.

Provalo tu

const int buttonPin = 2;

volatile int presses = 0;
int shown = 0;

void onPress() {
  // ogni fronte di discesa del pin viene contato, anche i rimbalzi: elimina qui i rimbalzi
  presses = presses + 1;
}

void setup() {
  pinMode(buttonPin, INPUT_PULLUP);
  Serial.begin(9600);
  attachInterrupt(digitalPinToInterrupt(buttonPin), onPress, FALLING);
}

void loop() {
  // stampa il conteggio ogni volta che cambia
  if (presses != shown) {
    shown = presses;
    Serial.println(shown);
  }
}
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Temporizzazione senza delay

Esercitati da solo: Playground Arduino