Con MicroPython podemos diseñar fácilmente un sistema que verifique las variables atmosféricas y reporte estos datos en un sitio web embebido en el propio sistema electrónico. Se usará para este ejemplo el controlador ESP32 y el sensor BME280 que tiene capacidad para medir la temperatura, presión y humedad ambiente.
Estos datos serán mostrados en un sitio web contenido en la propia memoria FLASH del sistema, para que el sitio web interactúe con el sensor usaremos un código Ajax embebido en el código HTML de la propia página.
El programa crea un socket TCP que “escucha” en el puerto 80 a la espera de que un navegador se conecte. Cuando el navegador conecta con ESP32 el socket se identifica enviando el encabezado de un documento html y seguidamente envía la página web.
Una vez que la página a sido cargada por el navegador el JavaScript Ajax toma el control y comienza a interrogar al sensor BME280 para que reporte los datos. El uso de Ajax evita tener que cargar constantemente toda la página cada vez que hay nuevos datos y solo se actualizan los campos correspondientes a los propios datos.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
# ================================================================# - Descripción : Programa ejemplo con ESP32 + BME280.# - Target : ESP32 (Tensilica Xtensa LX6 Dual Core 240 Mhz)# - ToolChain : Micropython + Thonny IDE# - # - www.firtec.com.ar# =================================================================importmachinefromtimeimportsleepimportsysimportBME280importgcgc.collect()# Limpiar posible basura en memoriasda=machine.Pin(21)# GP_21scl=machine.Pin(22)# GP_22i2c=machine.I2C(0,sda=sda,scl=scl,freq=100000)led=machine.Pin(5,machine.Pin.OUT)led.off()importnetworkimportutimesta=network.WLAN(network.STA_IF)ifnotsta.isconnected():print('Conectando con la red WiFi...')sta.active(True)#--------- Datos de la red WiFi --------sta.connect('Firtec_lab1','aba735')whilenotsta.isconnected():passprint("Ip asignada:",sta.ifconfig()[0])importsocket#------------ Crea un socket TCP (SOCK_STREAM) ---------------s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)s.bind(('',80))# Desde cualquier IP se escucha en el puerto 80s.listen(5)# Reconoce solo 5 socket a la vez# ******************************************************# Esta función es la encargada de crear la página web#*******************************************************defweb_page():html_page="""<!DOCTYPE html> <html> <head> <meta name='viewport' content='width=device-width, initial-scale=1.0'/> <script> var AjaxSolicitud = new XMLHttpRequest(); function CargarAjax(ajaxURL) { AjaxSolicitud.open('GET',ajaxURL,true); AjaxSolicitud.onreadystatechange = function() { if(AjaxSolicitud.readyState == 4 && AjaxSolicitud.status==200) { var AjaxRespuesta = AjaxSolicitud.responseText; var tmpArray = AjaxRespuesta.split("|"); document.getElementById('temp').innerHTML = tmpArray[0]; document.getElementById('hum').innerHTML = tmpArray[1]; document.getElementById('pres').innerHTML = tmpArray[2]; } } AjaxSolicitud.send(); } function leerBME280() { CargarAjax('leer_sensor'); } setInterval(leerBME280, 2000); </script> <title>Micropython & ESP32</title> </head> <body style=background:#F5DEB3> <title>Micropython & ESP32</title> <center> <div id='main'> <h1>MicroPython con ESP32 + Ajax</h1> <h2>Web server con ESP32</h2> <div id='content'> <p>Temperatura: <strong><span id='temp'>--.-</span></strong></p> <p>Humedad: <strong><span id='hum'>--.-</span></strong></p> <p>Presion: <strong><span id='pres'>--.-</span></strong></p> </div> </div> <br> <hr Size=7 noshade/><H4><font color='black'>by. Firtec Argentina </H4> </center> </body> </html>"""returnhtml_pagewhileTrue:ifgc.mem_free()<102000:# Si la memoria es menos de 102000gc.collect()# Limpiar basura bme=BME280.BME280(i2c=i2c)temp=bme.temperaturehum=bme.humiditypres=bme.pressureconexion,addr=s.accept()mensaje=conexion.recv(1024)mensaje=str(mensaje)consulta=mensaje.find('/leer_sensor')ifconsulta==6:temp=bme.temperaturehum=bme.humiditypres=bme.pressurerespuesta=temp+"|"+hum+"|"+presled.value(notled.value())else:respuesta=web_page()conexion.send('HTTP/1.1 200 OK\n')conexion.send('Content-Type: text/html\n')conexion.send('Connection: close\n\n')conexion.sendall(respuesta)conexion.close()
El sitio web es simplemente una cadena de texto con un formato determinado que el propio navegador decodifica para que se vea de la siguiente forma.
También es el navegador el que una vez que la página este cargada ejecuta el código Ajax. Para la programación y también como entorno de trabajo para el ESP32 se ha usado Thonny.
Thonny es de uso libre y con el podemos no solo escribir el programa completo sino también programar ESP32 o Raspberry Pico, ARM Cortex M4 mas una gran variedad de dispositivos compatibles con MicroPython. También podríamos tener un sitio web embebido y controlar el estado de pines del ESP32 o cualquier sistema en línea (luces, motores, portones, etc).
Con MicroPython las posibilidades son casi infinitas para poder diseñar una gran variedad de dispositivos con gran control del hardware pero también separando al programador de las complicaciones electrónicas internas como registros banderas y estados de máquina esto gracias a los módulos y bibliotecas que hereda del propio Python 3.