Una pulsación que el bucle pasa por alto
Parte de la sección Temporización sin delay del Journey de Arduino de Coddy. Lección 12 de 18.
Un sketch a veces está ocupado con una tarea lenta o un delay() largo. Un bucle que lee el botón solo entre tareas no detecta una pulsación que empieza y termina dentro de una de ellas.
Una interrupción lo soluciona: cuando cambia un pin, la placa detiene lo que está haciendo, ejecuta una función que eliges y después continúa. El chip vigila el pin por sí mismo, incluso durante delay().
void onPress() {
digitalWrite(ledPin, HIGH);
}
void setup() {
pinMode(buttonPin, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(buttonPin), onPress, FALLING);
}attachInterrupt() recibe tres cosas: la interrupción del pin (digitalPinToInterrupt(buttonPin) la encuentra), la función que se ejecutará y cuándo. FALLING es el momento en que el pin pasa de HIGH a LOW: con una resistencia pull-up, el momento en que se pulsa el botón.
La función se llama rutina de servicio de interrupción, o ISR. Procura que sea breve: nada de delay() ni de Serial.
Desafío
FácilEsta alarma comprueba el botón solo una vez cada 2 segundos, por lo que no detecta una pulsación rápida. Haz que una pulsación encienda el LED de inmediato:
- escribe una ISR,
onPress(), que encienda el LED - en
setup(), vincúlala al pin del botón conFALLING
Mantén la tarea lenta en loop(). El LED permanece encendido después de una pulsación, como una alarma. Pulsa Run, toca el botón y después pulsa Check.
Pruébalo tú mismo
const int ledPin = 13;
const int buttonPin = 2;
void setup() {
pinMode(ledPin, OUTPUT);
pinMode(buttonPin, INPUT_PULLUP);
Serial.begin(9600);
// configura la interrupción aquí
}
void loop() {
// la tarea lenta: déjala tal como está
Serial.println("working");
delay(2000);
// esto solo comprueba el botón una vez cada 2 segundos,
// por lo que no detecta una pulsación breve
if (digitalRead(buttonPin) == LOW) {
digitalWrite(ledPin, HIGH);
}
}
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