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.
Sfida
MedioQuesto 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 inlastPress
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);
}
}
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