Categorías
Microcontroladores Micropython

Escenarios de uso de `async` en MicroPython

Resumen de [[https://github.com/peterhinch/micropython-async/blob/master/v3/docs/TUTORIAL.md]]

1. Gestión de múltiples tareas de E/S

  • Escenario: Leer datos de un sensor mientras se actualiza una pantalla LED o se responde a pulsaciones de botones.
  • ¿Por qué async?: Los microcontroladores suelen necesitar ejecutar tareas como esperar datos de sensores, escribir en pantallas o gestionar interacciones. async permite que estas tareas se ejecuten de forma cooperativa (cediendo el control cuando están inactivas) en lugar de bloquearse entre sí.
  • Ejemplo:

    async def leer_sensor():
        while True:
            datos = sensor.read()
            # ... procesar datos ...
            await asyncio.sleep(0.1)  # Ceder control a otras tareas
    
    async def actualizar_pantalla():
        while True:
            pantalla.mostrar(estado)
            await asyncio.sleep(1)

2. Retrasos no bloqueantes

  • Escenario: Realizar acciones con intervalos distintos (ej.: parpadear un LED cada 500 ms mientras se registran datos cada 2 segundos).
  • ¿Por qué async?: time.sleep() bloquea todo el programa. async lo reemplaza con await asyncio.sleep(), liberando el microcontrolador para otras tareas durante las esperas.

3. Gestión de protocolos de comunicación

  • Escenario: Comunicación por UART, I2C o Wi-Fi mientras se ejecuta otro código.
  • ¿Por qué async?: Las comunicaciones suelen requerir que se espere por las respuestas. async permite iniciar una solicitud, luego cambiar a otras tareas y finalmente reanudar la tarea previa al recibir datos.
  • Ejemplo:
    async def obtener_clima():
        while True:
            respuesta = await wifi.get('http://api.weather.com')
            # ... procesar respuesta ...

4. Tareas en segundo plano con recursos compartidos

  • Escenario: Registrar datos en una tarjeta SD mientras se controla un motor.
  • ¿Por qué async?: Usar “primitivas de sincronización”, por ejemplo Lock (de micropython-async) para compartir recursos de forma segura entre tareas.
  • Ejemplo:

    lock = asyncio.Lock()
    
    async def registrar_datos():
        async with lock:
            with open('log.txt', 'a') as f:
                f.write(datos)
    
    async def controlar_motor():
        async with lock:
            motor.ejecutar(velocidad)

Notas clave para async en MicroPython

  • Multitarea cooperativa: Las tareas deben usar await explícitamente para ceder el control (no hay multitarea preemptiva, es decir, no hay control central de tareas).
  • Ligero: Usa mucha menos memoria que los hilos, lo cual es crítico para microcontroladores.
  • Bucle de eventos: La librería asyncio gestiona la planificación de tareas (similar al bucle de eventos de JavaScript).

Para más detalles, consulta el tutorial de micropython-async.

Categorías
Tutoriales

Crear un servidor web en Python para la carpeta actual del explorador de archivos

Instrucciones para compartir una carpeta mediante un servidor web Python.

Esto me lo pidió un compañero. Voy a obviar el hecho de que he tardado más en decirle al ChatGPT que me lo escriba como yo quiero, que en haberlo escrito yo mismo desde el principio. Pero estos son los tiempos que nos ha tocado vivir.

1. Guardar el fichero .bat

  1. Abre Vscode o cualquier editor de texto.

  2. Copia y pega el siguiente contenido en el editor:

    @echo off
    REM Obtiene la dirección IP local del equipo
    for /f "tokens=2 delims=: " %%a in ('ipconfig ^| findstr "IPv4"') do set ip=%%a
    set ip=%ip: =%
    
    REM Muestra las instrucciones al usuario
    echo =========================================
    echo El servidor web está arrancando...
    echo Escribe en el navegador la siguiente URL:
    echo http://%ip%:8000
    echo =========================================
    
    REM Arranca el servidor web de Python
    python -m http.server 8000
  3. Guarda el fichero con el nombre start_server.bat.

  4. Coloca el fichero en el directorio C:\Windows.


2. Abrir el terminal en la carpeta a compartir

  1. Abre el Explorador de Archivos y navega a la carpeta que deseas compartir.
  2. Haz clic en el menú Archivo (esquina superior izquierda).
  3. Selecciona Abrir Windows PowerShell o Abrir Símbolo del sistema (según la versión de Windows).
  4. Asegúrate de que se abra en el directorio actual donde está la carpeta.

3. Ejecutar el fichero .bat

  1. En la terminal, escribe:
    start_server
  2. El terminal mostrará las instrucciones, por ejemplo:
    =========================================
    El servidor web está arrancando...
    Escribe en el navegador la siguiente URL:
    http://192.168.1.156:8000
    =========================================

4. Acceder al servidor web

  1. Abre un navegador en cualquier dispositivo conectado a la misma red local.
  2. Escribe la URL que aparece en el terminal, por ejemplo:
    http://192.168.1.156:8000
  3. Esto abrirá una página con el contenido de la carpeta compartida.
  4. Dado que tu router suele asignar siempre las mismas direcciones, de forma más o menos provisional puedes añadir un marcador a esta página que se te abra.

5. Detener el servidor web

  • Para detener el servidor web, vuelve a la terminal y presiona las teclas:
    Ctrl + C