Menu
CoddyTech

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.

challenge icon

Desafío

Fácil

Esta 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 con FALLING

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);
  }
}
quiz iconPonte a prueba

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

Practica por tu cuenta: Playground de Arduino