Contar pulsaciones mediante interrupciones
Parte de la sección Temporización sin delay del Journey de Arduino de Coddy. Lección 15 de 18.
Como viste en la sección de entradas, los botones rebotan: durante aproximadamente un milisegundo, los contactos se tocan, se separan y vuelven a tocarse, al presionar y al soltar. Una interrupción detecta cada contacto, así que una ISR FALLING que suma 1 cuenta un clic varias veces.
Una ISR no puede eliminar el rebote con delay(): delay() necesita la propia interrupción del reloj, y las interrupciones se pausan mientras se ejecuta una ISR. Usa el reloj en su lugar. Recuerda cuándo ocurrió la última pulsación contada e ignora cualquier flanco que ocurra demasiado pronto después:
unsigned long lastPress = 0;
void onPress() {
unsigned long now = millis();
if (now - lastPress >= 200) {
presses = presses + 1;
lastPress = now;
}
}Leer millis() en una ISR está bien: devuelve la hora en que se inició la ISR. Elige una ventana más larga que un clic, para que los rebotes al soltar queden dentro de ella, y más corta que el intervalo entre dos clics rápidos. 200 ms funciona para las personas.
Desafío
IntermedioEste contador cuenta cada clic varias veces. Añade un antirrebote dentro de onPress():
- añade una variable
unsigned long lastPress - cuenta una bajada solo si han pasado al menos 200 ms desde
lastPress, y después guarda la hora enlastPress
Pulsa Run, haz clic en el botón unas cuantas veces y observa el contador; después, pulsa Check.
Pruébalo tú mismo
const int buttonPin = 2;
volatile int presses = 0;
int shown = 0;
void onPress() {
// cada flanco de bajada del pin cuenta, incluidos los rebotes: elimínalos aquí
presses = presses + 1;
}
void setup() {
pinMode(buttonPin, INPUT_PULLUP);
Serial.begin(9600);
attachInterrupt(digitalPinToInterrupt(buttonPin), onPress, FALLING);
}
void loop() {
// imprime el contador cada vez que cambie
if (presses != shown) {
shown = presses;
Serial.println(shown);
}
}
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Temporización sin delay
3Interrupciones
Una pulsación que el bucle pasa por altoFALLING, RISING y CHANGECompartir con volatileContar pulsaciones mediante interrupcionesPractica por tu cuenta: Playground de Arduino