MicroPython: Interrupciones con ESP32 y ESP8266

En el mundo de la programación de microcontroladores, las interrupciones juegan un papel crucial para gestionar eventos de forma eficiente. En este artículo, exploraremos cómo trabajar con interrupciones en los populares microcontroladores ESP32 y ESP8266 utilizando MicroPython. Descubriremos cómo implementar interrupciones en estos dispositivos para mejorar el manejo de tareas y optimizar el rendimiento de nuestros proyectos. ¡Sigue leyendo para aprender más sobre este fascinante tema!

Aprenda a configurar y manejar interrupciones usando el firmware MicroPython con placas ESP32 y ESP8266. También creará un proyecto de ejemplo utilizando un sensor de movimiento PIR.

MicroPython: Interrupciones con ESP32 y ESP8266

requisitos

Para seguir este tutorial, necesitará el firmware MicroPython actualizado en su ESP32 o ESP8266. También necesitarás un IDE para escribir el código y subirlo a tu placa. Recomendamos utilizar Thonny IDE o uPyCraft IDE:

  • IDE de Thonny:
    • Instalación y primeros pasos con Thonny IDE
    • Actualización del firmware MicroPython con esptool.py
  • IDE de UpyCraft:
    • Instale uPyCraft IDE (Windows, Mac OS X, Linux)
    • Flashear/cargar firmware MicroPython a ESP32 y ESP8266

Introducción a las 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 comprobar constantemente el valor del pin actual. Cuando se detecta un cambio, se activa un evento (se llama a una función).

Cuando ocurre una interrupción, el procesador deja de ejecutar el programa principal para realizar una tarea y luego regresa al programa principal, como se muestra en la siguiente figura.

MicroPython: Interrupciones con ESP32 y ESP8266

Esto es particularmente útil para activar una acción cuando se detecta movimiento o se presiona una tecla, sin tener que verificar constantemente el estado.

Pines de interrupción ESP32: Puede utilizar todos los GPIO como interrupciones excepto GPIO 6 a GPIO 11.

Pines de interrupción ESP8266: Puede utilizar todos los GPIO excepto GPIO 16.

Configurar una interrupción en MicroPython

Para configurar una interrupción en MicroPython, debe seguir estos pasos:

1. Definir 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 pueda volver rápidamente a ejecutar el programa principal. El mejor enfoque es indicar al código principal que se ha producido la interrupción, por ejemplo mediante el uso de una variable global. La función de manejo de interrupciones debe tener un parámetro de tipo Bolígrafo. Este parámetro se devuelve a la función de devolución de llamada y se refiere al GPIO que provocó la interrupción.

def handle_interrupt(pin):

2. Configure el GPIO, que actúa como un pin de interrupción, como entrada. Ejemplo:

pir = Pin(14, Pin.IN)

3. Conecte una interrupción a este pin usando el irq() Método:

pir.irq(trigger=Pin.IRQ_RISING, handler=handle_interrupt)

El irq() El método acepta los siguientes argumentos:

  • desencadenar: Esto define el modo de disparo. Hay 3 condiciones diferentes:
    • Pin.IRQ_FALLING: para activar la interrupción cuando el pin cambia de ALTO a BAJO;
    • Pin.IRQ_RISING: para activar la interrupción cada vez que el pin cambia de BAJO a ALTO.
    • 3: para activar la interrupción en ambos flancos (es decir, cuando se detecta un cambio)
  • Manejadores: Esta es una función que se llama cuando se detecta una interrupción, en este caso el manejar la interrupción() Función.

Ejemplo de proyecto con sensor de movimiento PIR

Para demostrar cómo manejar las interrupciones, creemos un proyecto simple usando un sensor de movimiento PIR. Cada vez que detectamos movimiento, encendemos un LED durante 20 segundos.

MicroPython: Interrupciones con ESP32 y ESP8266

Piezas requeridas

Aquí hay una lista de las piezas que necesitará para construir el circuito:

Puedes utilizar los enlaces anteriores o ir directamente MakerAdvisor.com/tools ¡Para encontrar todas las piezas para tus proyectos al mejor precio!

MicroPython: Interrupciones con ESP32 y ESP8266

Diagrama de cableado – ESP32

Siga el siguiente diagrama esquemático si está utilizando una placa ESP32:

MicroPython: Interrupciones con ESP32 y ESP8266

Diagrama de circuito – ESP8266

Siga el siguiente esquema si está utilizando una placa ESP8266:

MicroPython: Interrupciones con ESP32 y ESP8266

Importante: El Minisensor de movimiento PIR AM312 Estamos usando en este proyecto funciona con 3.3V Sin embargo, si está usando otro sensor de movimiento PIR como el. HC-SR501Funciona a 5 V. Puedes modificarlo para que funcione a 3,3 V o simplemente alimentarlo desde el pin Vin.

En la siguiente imagen puede ver el pinout del sensor de movimiento PIR Mini AM312. Si utiliza otro sensor de movimiento, verifique su distribución de pines antes de ensamblar el circuito.

MicroPython: Interrupciones con ESP32 y ESP8266

código

Aquí está el script que detecta movimiento y enciende un LED cuando se detecta movimiento. Este código es compatible tanto con ESP32 como con ESP8266.

# Complete project details at https://RandomNerdTutorials.com

from machine import Pin
from time import sleep

motion = False

def handle_interrupt(pin):
  global motion
  motion = True
  global interrupt_pin
  interrupt_pin = pin 

led = Pin(12, Pin.OUT)
pir = Pin(14, Pin.IN)

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

Ver código sin formato

Así es como funciona el código

Para utilizar interrupciones, importe el Bolígrafo clase de la máquina Módulo. También los importamos dormir método de la Tiempo Módulo para agregar un retraso a nuestro script.

from machine import Pin
from time import sleep

Crea una variable llamada Movimiento esto puede ser Verdadero o Falso. Esta variable indica si se detectó movimiento o no (esta es la variable global que se cambia en la función de manejo de interrupciones).

motion = False

Luego crea una función llamada Manejar la interrupción.

def handle_interrupt(pin):
  global motion
  motion = True
  global interrupt_pin
  interrupt_pin = pin 

Esta función se llama cada vez que se detecta movimiento. Manejar la interrupción La función tiene un parámetro de entrada (Bolígrafo), en el que un objeto de la clase Bolígrafo se pasa cuando ocurre la interrupción (indica qué pin causó la interrupción).

Aquí guardamos el pin que provocó la interrupción en el pin de interrupción Variable. En este caso no es muy útil ya que sólo tenemos un pin de interrupción. Sin embargo, esto puede ser útil cuando tenemos múltiples interrupciones que activan la misma función de manejo de interrupciones y queremos saber qué GPIO causó la interrupción.

En nuestro ejemplo esto es Manejar la interrupción La función simplemente cambia el Movimiento variable VERDADERO y guarda el pin de interrupción. Debe mantener sus funciones de interrupción lo más breves posible y limitar el uso de la prensa() funcionar en él. Entonces el código principal debería contener todas las cosas que deberían suceder cuando se produce la interrupción.

Nota: Como desées Movimiento Para usarse tanto dentro de la función como en todo el código, debe declararse global. De lo contrario no sucedería nada con la detección de movimiento porque el Movimiento La variable cambiaría dentro de la función y no en el cuerpo del código.

Para continuar con el código, necesitamos crear dos objetos Pin. Uno para el LED encendido GPIO 12y otro para el sensor de movimiento PIR GPIO 14.

led = Pin(12, Pin.OUT)
pir = Pin(14, Pin.IN)

Luego establece una interrupción en eso pir llamando irq() Método.

pir.irq(trigger=Pin.IRQ_RISING, handler=handle_interrupt)

En el Cinta()si eso MovimientoSi la variable es True, encendemos el LED durante 20 segundos e imprimimos un mensaje indicando que se detectó movimiento y qué pin causó la interrupción.

if motion:
  print('Motion detected! Interrupt caused by:', interrupt_pin)
  led.value(1)
  sleep(20)

Después de 20 segundos, apaga el LED e imprime un mensaje para indicar que el movimiento se ha detenido.

led.value(0)
print('Motion stopped!')

Finalmente, establezca el Movimiento Variable establecida en Falso:

motion = False

El Movimiento La variable sólo puede volver a ser Verdadera cuando se detecta movimiento y el Manejar la interrupción se llama la función.

Para simplificar, en este ejemplo usaremos un retraso para mantener el LED encendido durante 20 segundos. Lo ideal sería utilizar temporizadores.

demostración

Sube el código a tu placa ESP32/ESP8266. El LED debe iluminarse durante 20 segundos cuando se detecta movimiento y se debe imprimir un mensaje en la carcasa.

MicroPython: Interrupciones con ESP32 y ESP8266

Después de 20 segundos el LED se apaga.

Nota: El sensor de movimiento PIR AM312 tiene un tiempo de retardo estándar de 8 segundos. Esto significa que no disparará hasta que hayan pasado 8 segundos desde el último disparo.

Envolver

Esperamos que este artículo te haya resultado interesante. Aprendimos a:

  • Configurar un pin como interrupción
  • Maneja esta interrupción en tu código
  • Determinar qué pin GPIO causó la interrupción

En nuestro ejemplo, utilizamos un sensor de movimiento PIR para activar la interrupción. El ejemplo presentado también se puede utilizar para reconocer, por ejemplo, una pulsación de tecla.

Si disfruta programando las placas ESP32 y ESP8266 con MicroPython y desea obtener más información, consulte los siguientes recursos:

  • [eBook] Programación MicroPython con ESP32 y ESP8266
  • MicroPython: LED RGB direccionables WS2812B con ESP32 y ESP8266
  • Registrador de datos de estación meteorológica de bajo consumo que utiliza ESP8266 y BME280 con MicroPython
  • MicroPython: introducción a MQTT en ESP32/ESP8266
Error 403 The request cannot be completed because you have exceeded your quota. : quotaExceeded

MicroPython: Interrupciones con ESP32 y ESP8266

Introducción

Aprende cómo configurar y manejar interrupciones utilizando el firmware MicroPython con placas ESP32 y ESP8266. También construirás un ejemplo de proyecto con un Sensor de Movimiento PIR.

Requisitos

Para seguir este tutorial necesitas tener el firmware MicroPython instalado en tu ESP32 o ESP8266. También necesitas un IDE para escribir y subir el código a tu placa. Te sugerimos usar el IDE Thonny o uPyCraft:

  1. IDE Thonny: Instalación y primeros pasos con Thonny
  2. IDE uPyCraft: Instalar uPyCraft IDE

¿Qué son las Interrupciones?

Las interrupciones son útiles para que sucedan cosas automáticamente en los programas de microcontroladores y pueden ayudar a resolver problemas de temporización. Con las interrupciones, no necesitas comprobar constantemente el valor actual de un pin. Cuando se detecta un cambio, se activa un evento (se llama a una función).

Configuración de una Interrupción en MicroPython

Para configurar una interrupción en MicroPython, debes seguir los siguientes pasos:

  1. Define una función de manejo de interrupciones.
  2. Configura el GPIO que actuará como pin de interrupción como entrada.
  3. Adjunta una interrupción a ese pin llamando al método irq().

Ejemplo de Proyecto con Sensor de Movimiento PIR

Para demostrar cómo manejar interrupciones, construiremos un proyecto simple con un sensor de movimiento PIR. Cada vez que se detecte movimiento, encenderemos un LED por 20 segundos.

Código

Aquí tienes el script que detecta el movimiento y enciende un LED siempre que se detecta movimiento. Este código es compatible tanto con el ESP32 como con el ESP8266.

Código completo del proyecto aquí

Conclusión

Esperamos que hayas encontrado este artículo interesante. Hemos aprendido cómo configurar un pin como interrupción, manejar esa interrupción en tu código y detectar qué pin GPIO causó la interrupción.

En nuestro ejemplo, hemos utilizado un Sensor de Movimiento PIR para activar la interrupción. Pero el ejemplo presentado también se puede usar para detectar la presión de un botón, por ejemplo.

Si te gusta programar las placas ESP32 y ESP8266 con MicroPython y quieres aprender más, te recomendamos consultar los recursos mencionados al final del artículo.

3 comentarios en «MicroPython: Interrupciones con ESP32 y ESP8266»

  1. ¡Este artículo me parece súper útil! Me encanta cómo el autor explica de forma clara y sencilla cómo trabajar con interrupciones en MicroPython en ESP32 y ESP8266. ¡Definitivamente lo pondré en práctica! ¡Gracias por compartir este conocimiento tan valioso!

Deja un comentario