Curso C para Arduino

⚡ ¿Qué es una interrupción?

Una interrupción es un mecanismo que interrumpe el flujo normal del programa para ejecutar una función específica en respuesta a un evento externo (por ejemplo, pulsar un botón o recibir una señal de un sensor).

Cuando ocurre el evento, Arduino pausa lo que esté haciendo, ejecuta una función especial llamada ISR (Interrupt Service Routine), y luego retoma el programa donde lo dejó.


🧠 ¿Por qué usar interrupciones?

  • Para responder instantáneamente a eventos críticos.
  • Cuando no puedes depender de digitalRead() en el loop() por retardos (delay, millis, etc.).
  • Para capturar señales rápidas que podrías perder en el flujo normal.

🛠️ Cómo usar interrupciones en Arduino

🔹 1. attachInterrupt()

Asocia un pin a una función (ISR) que se ejecutará cuando se detecte un evento.

1attachInterrupt(digitalPinToInterrupt(PIN), funcionISR, modo);
  • PIN: número de pin físico (ej. 2 o 3 en Arduino UNO).
  • funcionISR: nombre de la función a ejecutar cuando se active.
  • modo: cuándo se activa la interrupción:
    • RISING: flanco de subida (0 → 1)
    • FALLING: flanco de bajada (1 → 0)
    • CHANGE: cualquier cambio
    • LOW: mientras esté en 0 (menos usado)

🔹 2. detachInterrupt()

Desactiva una interrupción:

1detachInterrupt(digitalPinToInterrupt(PIN));

🧪 Ejemplo 1: Contador con botón (interrupción en pin 2)

1volatile int contador = 0;
2
3void setup() {
4  Serial.begin(9600);
5  pinMode(2, INPUT_PULLUP); // botón entre pin 2 y GND
6  attachInterrupt(digitalPinToInterrupt(2), aumentarContador, FALLING);
7}
8
9void loop() {
10  Serial.print("Contador: ");
11  Serial.println(contador);
12  delay(1000);
13}
14
15void aumentarContador() {
16  contador++;
17}

🔁 volatile: se usa para variables compartidas entre loop() e ISR.


🧪 Ejemplo 2: Encender LED al presionar botón (modo RISING)

1const int led = 13;
2volatile bool encendido = false;
3
4void setup() {
5  pinMode(2, INPUT_PULLUP);
6  pinMode(led, OUTPUT);
7  attachInterrupt(digitalPinToInterrupt(2), cambiarEstado, RISING);
8}
9
10void loop() {
11  digitalWrite(led, encendido);
12}
13
14void cambiarEstado() {
15  encendido = !encendido;
16}

⚠️ Reglas importantes de las interrupciones

✅ Dentro de una ISR:

  • Debe ser lo más corta y rápida posible.
  • No usar delay()
  • No usar Serial.print()
  • No usar funciones complejas ni llamadas a otras funciones
  • Solo cambiar valores simples (bool, int, etc.)

📍 Pines con interrupciones en distintas placas

PlacaPines con interrupciones
Arduino UNO2, 3
Mega 25602, 3, 18, 19, 20, 21
Leonardo0, 1, 2, 3, 7
ESP32¡Todos los pines digitales! 🎉

Usa digitalPinToInterrupt(pin) para mayor compatibilidad entre placas.


🧪 Proyecto sugerido: alarma reactiva

  • Al presionar un sensor (magnético o botón), se activa una alarma (LED + buzzer) usando una interrupción.

🎯 ¿Qué más se puede hacer?

  • Medición de pulsos (como RPM o sensores de flujo)
  • Control de encoder rotatorio
  • Despertar de bajo consumo (modo sleep + interrupción)
  • Temporizadores con interrupciones por hardware (más avanzados)