Uso de Interrupciones Externas en ESP32

¿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)

cpp
// 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

cpp
// 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)

cpp
// 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:

  1. Variables volátiles: Usar volatile para variables compartidas entre ISR y loop

  2. Minimizar código en ISR: Las ISR deben ser rápidas y simples

  3. Debounce: Implementar antirebote para pulsadores

  4. Pines disponibles: No todos los pines GPIO soportan interrupciones

Ejemplo con antirebote:

cpp
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.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *