MicroPython - Interrupciones Con ESP32 y ESP8266 - Tutoriales Aleatorios de Nerds
MicroPython - Interrupciones Con ESP32 y ESP8266 - Tutoriales Aleatorios de Nerds
https://randomnerdtutorials.com/micropython-interrupts-esp32-esp8266/ 1/23
28/2/2021 MicroPython: interrupciones con ESP32 y ESP8266 | Tutoriales aleatorios de nerds
Prerrequisitos
EBooks gratuitos Sobre Contacto Cursos Iniciar sesión Obtener cursos
Para seguir este tutorial, necesita el rmware MicroPython en su ESP32 o ESP8266. También necesita un IDE para
escribir y cargar el código en su tablero. Sugerimos usar Thonny IDE o uPyCraft IDE:
Thonny IDE:
Instalación y primeros pasos con Thonny IDE
Actualización del rmware de MicroPython con esptool.py
IDE de uPyCraft:
Instale uPyCraft IDE ( Windows , Mac OS X , Linux )
Flash / Cargar rmware MicroPython a ESP32 y ESP8266
Introduciendo interrupciones
Las interrupciones son útiles para hacer que las cosas sucedan automáticamente en programas de microcontroladores y
pueden ayudar a resolver problemas de sincronización. Con las interrupciones, no es necesario veri car constantemente
el valor actual del pin. Cuando se detecta un cambio, se activa un evento (se llama a una función).
Cuando ocurre una interrupción, el procesador detiene la ejecución del programa principal para ejecutar una tarea y
luego regresa al programa principal como se muestra en la siguiente gura.
https://randomnerdtutorials.com/micropython-interrupts-esp32-esp8266/ 2/23
28/2/2021 MicroPython: interrupciones con ESP32 y ESP8266 | Tutoriales aleatorios de nerds
Esto es especialmente útil para disparar una acción cuando se detecta movimiento o cuando se presiona un botón sin la
necesidad de veri car constantemente su estado.
Pines de interrupción ESP32: puede usar todos los GPIO como interrupciones, excepto GPIO 6 a GPIO 11.
Pines de interrupción ESP8266: puede usar todos los GPIO, excepto GPIO 16.
1. De na una función de manejo de interrupciones . La función de manejo de interrupciones debe ser lo más simple
posible, para que el procesador vuelva rápidamente a la ejecución del programa principal. El mejor enfoque es señalar al
código principal que ha ocurrido la interrupción mediante el uso de una variable global, por ejemplo. La función de
https://randomnerdtutorials.com/micropython-interrupts-esp32-esp8266/ 3/23
28/2/2021 MicroPython: interrupciones con ESP32 y ESP8266 | Tutoriales aleatorios de nerds
manejo de interrupciones debe aceptar un parámetro de tipo Alfiler . Este parámetro se devuelve a la función de
devolución de llamada y seEBooks
re eregratuitos Sobre
al GPIO que causó laContacto Cursos Iniciar sesión
interrupción. Obtener cursos
def handle_interrupt(pin):
2. Con gure el GPIO que actuará como un pin de interrupción como entrada. Por ejemplo:
pir.irq(trigger=Pin.IRQ_RISING, handler=handle_interrupt)
https://randomnerdtutorials.com/micropython-interrupts-esp32-esp8266/ 4/23
28/2/2021 MicroPython: interrupciones con ESP32 y ESP8266 | Tutoriales aleatorios de nerds
Ejemplo de proyecto
EBooks gratuitos con
Sobre sensor
Contacto de Iniciar
Cursos movimiento
sesión PIR
Obtener cursos
Para demostrar cómo manejar las interrupciones, crearemos un proyecto simple con un sensor de movimiento PIR.
Siempre que se detecte movimiento, encenderemos un LED durante 20 segundos.
Piezas necesarias
Aquí hay una lista de las piezas que necesita para construir el circuito:
ESP32 (lea las mejores placas de desarrollo ESP32 ) o ESP8266 (lea las mejores placas de desarrollo ESP8266 )
LED de 5 mm
Resistencia de 330 ohmios
Mini sensor de movimiento PIR (AM312) o sensor de movimiento PIR (HC-SR501)
Tablero de circuitos
Cables de puente
Puede utilizar los enlaces anteriores o ir directamente a MakerAdvisor.com/tools para encontrar todas las piezas para
sus proyectos al mejor precio.
https://randomnerdtutorials.com/micropython-interrupts-esp32-esp8266/ 5/23
28/2/2021 MicroPython: interrupciones con ESP32 y ESP8266 | Tutoriales aleatorios de nerds
Esquema - ESP32
Siga el siguiente diagrama esquemático si está utilizando una placa ESP32:
Esquema: ESP8266
https://randomnerdtutorials.com/micropython-interrupts-esp32-esp8266/ 6/23
28/2/2021 MicroPython: interrupciones con ESP32 y ESP8266 | Tutoriales aleatorios de nerds
Importante: el sensor de movimiento PIR Mini AM312 que estamos usando en este proyecto funciona a 3.3V. Sin
embargo, si está utilizando otro sensor de movimiento PIR como el HC-SR501 , funciona a 5V. Puede modi carlo para
que funcione a 3,3 V o simplemente alimentarlo con el pin Vin.
En la siguiente gura, proporcionamos la distribución de pines para el sensor de movimiento PIR Mini AM312. Si está
utilizando otro sensor de movimiento, veri que su con guración de pines antes de ensamblar el circuito.
https://randomnerdtutorials.com/micropython-interrupts-esp32-esp8266/ 7/23
28/2/2021 MicroPython: interrupciones con ESP32 y ESP8266 | Tutoriales aleatorios de nerds
Código
Aquí está el script que detecta movimiento y enciende un LED cada vez que se detecta movimiento. Este código es
compatible con ESP32 y ESP8266.
motion = False
def handle_interrupt(pin):
global motion
https://randomnerdtutorials.com/micropython-interrupts-esp32-esp8266/ 8/23
28/2/2021 MicroPython: interrupciones con ESP32 y ESP8266 | Tutoriales aleatorios de nerds
motion = True
EBooks gratuitos Sobre Contacto Cursos Iniciar sesión Obtener cursos
global interrupt_pin
interrupt_pin = pin
pir.irq(trigger=Pin.IRQ_RISING, handler=handle_interrupt)
while True:
if motion:
print('Motion detected! Interrupt caused by:', interrupt_pin)
led.value(1)
sleep(20)
led.value(0)
print('Motion stopped!')
motion = False
Para usar interrupciones, importe el Alfiler clase de la máquina módulo. También importamos dormir método del
hora módulo para agregar un retraso en nuestro script.
https://randomnerdtutorials.com/micropython-interrupts-esp32-esp8266/ 9/23
28/2/2021 MicroPython: interrupciones con ESP32 y ESP8266 | Tutoriales aleatorios de nerds
from machine import Pin EBooks gratuitos Sobre Contacto Cursos Iniciar sesión Obtener cursos
from time import sleep
Crea una variable llamada movimiento que puede ser Verdadero o Falso. Esta variable indicará si se detectó movimiento
o no (esta es la variable global que se cambiará en la función de manejo de interrupciones).
motion = False
def handle_interrupt(pin):
global motion
motion = True
global interrupt_pin
interrupt_pin = pin
Esta función se llamará cada vez que se detecte movimiento. los handle_interrupt La función tiene un parámetro de
entrada ( alfiler ) en el que un objeto de clase Alfiler se pasará cuando ocurra la interrupción (indica qué pin causó
la interrupción).
Aquí estamos guardando el pin que causó la interrupción en el interrupt_pin variable. En este caso, no es muy útil
porque solo tenemos un pin de interrupción. Sin embargo, esto puede ser útil si tenemos varias interrupciones que
disparan la misma función de manejo de interrupciones y queremos saber qué GPIO causó la interrupción.
https://randomnerdtutorials.com/micropython-interrupts-esp32-esp8266/ 10/23
28/2/2021 MicroPython: interrupciones con ESP32 y ESP8266 | Tutoriales aleatorios de nerds
En nuestro ejemplo, el handle_interrupt función simplemente cambia el movimiento variable a Cierto y guarda el
pin de interrupción. Debe EBooks gratuitos
mantener Sobre
las funciones Contacto
de interrupción Cursos Iniciar sesión
de Obtener cursos
manejo lo más breves
posible y evitar el uso de
imprimir() función en el interior. Entonces, el código principal debería tener todas las cosas que queremos que
sucedan cuando ocurra la interrupción.
Nota: como quieras movimiento para que sea utilizable tanto dentro de la función como en todo el código, debe
declararse como global. De lo contrario, cuando se detecte movimiento, no pasaría nada, porque movimiento La
variable cambiaría dentro de la función y no en el cuerpo principal del código.
Continuando con el código, necesitamos crear dos objetos Pin. Uno para el LED encendido GPIO 12 , y otro para el
sensor de movimiento PIR en GPIO 14 .
pir.irq(trigger=Pin.IRQ_RISING, handler=handle_interrupt)
En el lazo() , cuando el movimiento variable es Verdadero, encendemos el LED durante 20 segundos e imprimimos un
mensaje que indica que se detectó movimiento y qué pin causó la interrupción.
https://randomnerdtutorials.com/micropython-interrupts-esp32-esp8266/ 11/23
28/2/2021 MicroPython: interrupciones con ESP32 y ESP8266 | Tutoriales aleatorios de nerds
if motion: EBooks gratuitos Sobre Contacto Cursos Iniciar sesión Obtener cursos
print('Motion detected! Interrupt caused by:', interrupt_pin)
led.value(1)
sleep(20)
Después de 20 segundos, apague el LED e imprima un mensaje para indicar que el movimiento se detuvo.
led.value(0)
print('Motion stopped!')
motion = False
los movimiento La variable solo puede volverse Verdadera nuevamente, si se detecta movimiento y el
handle_interrupt se llama a la función.
Por simplicidad, en este ejemplo usamos un retraso para mantener el LED encendido durante 20 segundos. Idealmente,
debería utilizar temporizadores.
Demostración
https://randomnerdtutorials.com/micropython-interrupts-esp32-esp8266/ 12/23
28/2/2021 MicroPython: interrupciones con ESP32 y ESP8266 | Tutoriales aleatorios de nerds
Sube el código a tu placa ESP32 / ESP8266. El LED debe encenderse durante 20 segundos cuando se detecta movimiento
EBooks gratuitos
y debe imprimirse un mensaje en la carcasa. Sobre Contacto Cursos Iniciar sesión Obtener cursos
Nota: el sensor de movimiento AM312 PIR tiene un tiempo de retardo predeterminado de 8 segundos. Esto signi ca
que no se activará antes de que hayan pasado 8 segundos desde el último disparo.
https://randomnerdtutorials.com/micropython-interrupts-esp32-esp8266/ 13/23
28/2/2021 MicroPython: interrupciones con ESP32 y ESP8266 | Tutoriales aleatorios de nerds
Terminando EBooks gratuitos Sobre Contacto Cursos Iniciar sesión Obtener cursos
En nuestro ejemplo, hemos utilizado un sensor de movimiento PIR para activar la interrupción. Pero el ejemplo
presentado también se puede utilizar para detectar la pulsación de un botón, por ejemplo.
Si le gusta programar las placas ESP32 y ESP8266 con MicroPython y desea obtener más información, consulte los
siguientes recursos:
https://randomnerdtutorials.com/micropython-interrupts-esp32-esp8266/ 14/23
28/2/2021 MicroPython: interrupciones con ESP32 y ESP8266 | Tutoriales aleatorios de nerds
[eBook]
EBooks gratuitosBuild Web Servers
Sobre Contacto with
CursosESP32 and ESP8266
Iniciar sesión (2nd
Obtener cursos Edition)
Build Web Server projects with the ESP32 and ESP8266 boards to control outputs and
monitor sensors remotely. Learn HTML, CSS, JavaScript and client-server communication
protocols DOWNLOAD »
Recommended Resources
Build a Home Automation System Home Automation using ESP8266 Arduino Step-by-Step Projects »
from Scratch » With Raspberry Pi, eBook and video course » Build IoT Build 25 Arduino projects with our
ESP8266, Arduino, and Node-RED. and home automation projects. course, even with no prior
experience!
https://randomnerdtutorials.com/micropython-interrupts-esp32-esp8266/ 15/23
28/2/2021 MicroPython: interrupciones con ESP32 y ESP8266 | Tutoriales aleatorios de nerds
ESP32 Web Server with MPU-6050 Accelerometer ESP32 MQTT – Publish and Subscribe with Arduino
and Gyroscope (3D object representation) IDE
https://randomnerdtutorials.com/micropython-interrupts-esp32-esp8266/ 16/23
28/2/2021 MicroPython: interrupciones con ESP32 y ESP8266 | Tutoriales aleatorios de nerds
ESP-NOW with ESP8266: Send Data to Multiple ESP32 Timer Wake Up from Deep Sleep
Boards (one-to-many)
Seth C Stenzel EBooks gratuitos Sobre Contacto Cursos Iniciar sesión Obtener cursos
March 11, 2019 at 7:50 pm
Would it be possible to wake the esp32 from deepsleep with these interrupts?
Reply
Sara Santos
March 12, 2019 at 4:05 pm
Hi Seth.
Yes, I think you can, but I haven’t tried it yet.
It seems that you can pass a wake parameter when de ning the interrupt and it can be:
– machine.IDLE
– machine.SLEEP
– machine.DEEPSLEEP
Regards,
Sara
Reply
https://randomnerdtutorials.com/micropython-interrupts-esp32-esp8266/ 18/23
28/2/2021 MicroPython: interrupciones con ESP32 y ESP8266 | Tutoriales aleatorios de nerds
Mark
December 11, 2019 at 11:55 am
On a somewhat related topic, has anyone (else) had issues with debounce on the ESP32 with reed switches? I’m
using an anemometer with a reed switch to re an interrupt, and for some reason every time I get a falling edge
interrupt (I’ve got the GPIO pin held high), it triggers between 1 and 4 interrupts. I’m using an adafruit HUZZAH32,
and GPIO21.
Reply
Vardhan Batavia
November 26, 2020 at 6:49 am
you can add 200 ms of delay in ISR function before enabling using machine.enable_irq(state)
that will prevent interrupt to occur again and again.
Regards
Vardhan
Reply
https://randomnerdtutorials.com/micropython-interrupts-esp32-esp8266/ 19/23
28/2/2021 MicroPython: interrupciones con ESP32 y ESP8266 | Tutoriales aleatorios de nerds
Brian Hambleton
January 2, 2020 at 4:56 pm
Does Micro-Python support interrupt on ‘both’ rising and falling edge? I am sensing a damper in my HVAC system
to monitor blower on o . Rising edge = timestamp start of blower cycle, falling edge = timestamp end of blower
cycle. Can I do this with one input or do I need to use two inputs one for rising one for falling?
Reply
Sara Santos
January 3, 2020 at 11:47 am
Hola Brian.
Hay 3 condiciones diferentes:
Pin.IRQ_FALLING: para activar la interrupción siempre que el pin pase de HIGH a LOW;
Pin.IRQ_RISING: para activar la interrupción siempre que el pin pase de BAJO a ALTO.
3: activar la interrupción en ambos ancos (es decir, cuando se detecta algún cambio)
https://randomnerdtutorials.com/micropython-interrupts-esp32-esp8266/ 20/23
28/2/2021 MicroPython: interrupciones con ESP32 y ESP8266 | Tutoriales aleatorios de nerds
Respuesta
EBooks gratuitos Sobre Contacto Cursos Iniciar sesión Obtener cursos
Vardhan
26 de noviembre de 2020 a las 6:48 am
puede agregar 200 ms de retraso en la función ISR antes de habilitar el uso de machine.enable_irq (estado)
que evitará que la interrupción ocurra una y otra vez.
Respuesta
Deja un comentario
https://randomnerdtutorials.com/micropython-interrupts-esp32-esp8266/ 21/23
28/2/2021 MicroPython: interrupciones con ESP32 y ESP8266 | Tutoriales aleatorios de nerds
Nombre * EBooks gratuitos Sobre Contacto Cursos Iniciar sesión Obtener cursos
Correo electrónico *
Sitio web
publicar comentario
https://randomnerdtutorials.com/micropython-interrupts-esp32-esp8266/ 22/23
28/2/2021 MicroPython: interrupciones con ESP32 y ESP8266 | Tutoriales aleatorios de nerds
https://randomnerdtutorials.com/micropython-interrupts-esp32-esp8266/ 23/23