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 elloop()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 cambioLOW: 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 entreloop()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
| Placa | Pines con interrupciones |
|---|---|
| Arduino UNO | 2, 3 |
| Mega 2560 | 2, 3, 18, 19, 20, 21 |
| Leonardo | 0, 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)