Las interrupciones son útiles para que los programas de microcontroladores funcionen automáticamente y pueden ayudar a resolver problemas de sincronización.
Con las interrupciones, no es necesario comprobar constantemente el valor actual de un pin. Con las interrupciones, cuando se detecta un cambio, se activa un evento (se llama a una función).
Para configurar una interrupción en el IDE de Arduino, se utiliza la función attachInterrupt(), que acepta como argumentos el pin GPIO, el nombre de la función a ejecutar y el modo.
attachInterrupt(digitalPinToInterrupt(GPIO), funcion, mode);
El primer argumento es un número de GPIO. Normalmente, se debe usar digitalPinToInterrupt(GPIO) para configurar el GPIO como pin de interrupción. Por ejemplo, si desea usar GPIO 27 como interrupción, use:
digitalPinToInterrupt(27)
Con una placa ESP32, todos los pines resaltados, en la siguiente figura, con un rectángulo rojo pueden configurarse como pines de interrupción:

El segundo argumento de la función attachInterrupt() es el nombre de la función que se llamará cada vez que se active la interrupción.
El tercer argumento es el modo. Hay cinco modos diferentes:
• BAJO: para activar la interrupción cuando el pin esté a BAJA;
• ALTO: para activar la interrupción cuando el pin esté a ALTA;
• CAMBIO: para activar la interrupción cuando el pin cambie de valor, por ejemplo, de ALTO a BAJO o de BAJO a ALTO;
• DESCENDENTE: para cuando el pin pasa de ALTO a BAJO.
• ASCENDENTE: para activar cuando el pin pasa de BAJO a ALTO;
Funcionamiento de los temporizadores
En lugar de usar una función delay() que bloquea el código y no te permite hacer nada más durante un número determinado de segundos, usaremos un temporizador.
Cuando se ejecuta la función delay(1000), el programa se detiene en esa línea durante 1 segundo.
delay() es una función de bloqueo. Las funciones de bloqueo impiden que un programa realice ninguna otra acción hasta que se complete la tarea en cuestión. Si se necesita que varias tareas se ejecuten simultáneamente, no se puede usar delay().
La función millis()
Usando una función llamada millis(), se devuelve el número de milisegundos que han transcurrido desde que se inició el programa. ¿Por qué es útil esta función? Porque, con cálculos matemáticos, se puede verificar fácilmente cuánto tiempo ha transcurrido sin bloquear el código.