La Raspberry Pi Pico W es muy dormilona

He comenzado un proyecto que utiliza un micro que lee la temperatura con el DS18B20 y envía los resultados a una página web que tiene un script en PHP para almacenar esa temperatura en una base de datos MySQL. Para ello utilicé las instrucciones que pude leer en este artículo. La diferencia es que en el artículo utilizan C para el asunto y yo utilizo Python.

La idea es leer la temperatura, enviar los resultados a la web y esperar un minuto para repetir el proceso. Una de las opciones es utilizar un bucle infinito. Algo así como:

conectar_wifi()

while True:
    leer_temperatura()
    enviar_datos()
    sleep(60)

Sin embargo es poco efectivo porque el tiempo que está esperando el micro sigue consumiendo energía para nada. La solución es poner a dormir el micro y que se despierte cada minuto para hacer lo que tenga que hacer.

Micropython tiene dos bonitas funciones que permiten hacer esto, ambas en el módulo machine. Estas son lightsleep y deepsleep. La versión «ligera» tiene la RAM completa y retención de estado. Al despertar, la ejecución se reanuda desde el punto donde se solicitó la suspensión, con todos los subsistemas operativos.

En sueño profundo (deepsleep) no conserve la memoria RAM ni ningún otro estado del sistema (por ejemplo, periféricos o interfaces de red). Al despertar, la ejecución se reanuda desde el script principal, similar a un reset completo o de encendido.

Es claro entonces, que gasta menos energía en sueño profundo ya que se apagan casi todos los sistemas. El script quedaría así, sin bucle porque cada vez que se despierta se comienza a ejecutar todo el código, sería, por así decirlo, un bucle infinito de reinicios:

inicializar()
conectar_wifi()
leer_temperatura()
enviar_datos()
machine.deepsleep(60000) # Tiempo en milisegundos

Estuve probando con el micro ESP32 y funcionó el tema sin problemas. Pasaba el minuto, se reiniciaba el micro y hacía lo que tenía que hacer hasta volver a dormir.

El problema surgió cuando quise hacer lo mismo con la Raspberry Pi Pico W que debería funcionar con el mismo código Python. Tuve que suprimir una lecturas/escrituras a la flash porque sí lo hacía el ESP32, pero no la Rasp y lo cambié por leer/escribir un fichero que es realmente lo mismo. Quitando eso, lo otro debería funcionar… Pero no funciona porque ¡no se despierta nunca! No sale de ese sueño profundo y no sé el motivo. He probado con el último firmware MicroPython, el del 5 de septiembre y sigue pasando, así que no sé cuando lo arreglarán.

En el momento de dar a la tecla Enter después de la sentencia machine.deepsleep(60000)

Y un poco rato después se observa que el micro sigue dormido, no «devuelve» el prompt. Así que es un mal asunto utilizar la Raspberry Pi W para un proyecto que requiera poca energía ya que al no poder pasar a un estado de sueño profundo, el micro sigue consumiendo como un campeón.

Deja una respuesta

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