¿Qué son las interrupciones externas?
Las interrupciones externas permiten que el ESP32 responda inmediatamente a cambios en los pines GPIO, sin necesidad de monitoreo constante (polling). Son ideales para detectar pulsos de botones, sensores de presencia, encoders, etc.
Conexiones para detección de pulsos
Configuración Pull-Up (Recomendada para pulsadores)
// Conexión física: // Botón/pulsador → Conectar entre GPIO y GND // Resistencia pull-up interna activada const int botonPin = 4; // GPIO4 void setup() { pinMode(botonPin, INPUT_PULLUP); attachInterrupt(digitalPinToInterrupt(botonPin), ISR_boton, FALLING); } void ISR_boton() { // Se ejecuta cuando el botón se presiona (HIGH → LOW) }
Configuración Pull-Down
// Conexión física: // Botón/pulsador → Conectar entre GPIO y 3.3V // Resistencia pull-down interna activada const int botonPin = 4; void setup() { pinMode(botonPin, INPUT_PULLDOWN); attachInterrupt(digitalPinToInterrupt(botonPin), ISR_boton, RISING); } void ISR_boton() { // Se ejecuta cuando el botón se presiona (LOW → HIGH) }
Ejemplo completo para sensor de presencia (PIR)
// Sensor PIR normalmente usa configuración pull-down const int pirPin = 5; // GPIO5 volatile bool movimientoDetectado = false; void setup() { Serial.begin(115200); pinMode(pirPin, INPUT_PULLDOWN); // Pull-down para sensor PIR attachInterrupt(digitalPinToInterrupt(pirPin), ISR_movimiento, RISING); } void loop() { if (movimientoDetectado) { Serial.println("¡Movimiento detectado!"); movimientoDetectado = false; delay(1000); // Evitar múltiples detecciones } } void ISR_movimiento() { movimientoDetectado = true; }
Tipos de disparo (Trigger) disponibles:
-
LOW: Se activa cuando el pin está en LOW
-
HIGH: Se activa cuando el pin está en HIGH
-
FALLING: Se activa en flanco de bajada (HIGH → LOW)
-
RISING: Se activa en flanco de subida (LOW → HIGH)
-
CHANGE: Se activa en cualquier cambio
Buenas prácticas:
-
Variables volátiles: Usar
volatilepara variables compartidas entre ISR y loop -
Minimizar código en ISR: Las ISR deben ser rápidas y simples
-
Debounce: Implementar antirebote para pulsadores
-
Pines disponibles: No todos los pines GPIO soportan interrupciones
Ejemplo con antirebote:
const int botonPin = 4; volatile unsigned long ultimaInterrupcion = 0; const unsigned long debounceDelay = 200; void setup() { pinMode(botonPin, INPUT_PULLUP); attachInterrupt(digitalPinToInterrupt(botonPin), ISR_boton, FALLING); } void ISR_boton() { if ((millis() - ultimaInterrupcion) > debounceDelay) { // Código válido aquí ultimaInterrupcion = millis(); } }
Las interrupciones externas son esenciales para aplicaciones que requieren respuesta inmediata a eventos externos en el ESP32.
