Estación meteorológica con MicroPython y visualización web
En este post aprenderás a construir una estación meteorológica con micropython y podrás visualizar los datos medidos por los sensores mediante un navegador web, además se mostrará la fecha y hora en la que se obtuvieron dichos datos.
El componente principal de este proyecto es la Placa ESP32, con el firmware de micropython previamente instalado, para la obtención de las variables de temperatura y humedad se emplea un sensor DHT22, cabe recalcar que se le puede agregar otros sensores de acuerdo a las necesidades que se requieran.
En el firmware de micropython para la placa ESP32 encontramos el módulo DHT preinstalado, es por ello que se puede emplear el sensor directamente sin recurrir al uso de un módulo externo.
Materiales
- 1x Placa Esp32 con micropython.
- 1x Sensor DHT22
- 1x Diodo emisor de luz.
- 1x Resistor de 330 Ohm.
- 1x Resistor de 10k Ohm.
- 2x Protoboard.
- Cables de conexión.
Circuito
Los componentes se deben conectar de la siguiente manera:
- El Pin Vcc (+) del DHT22 va conectado a un extremo del resistor de 10kOhm y al Pin V5 de la placa ESP32.
- El Pin OUT (S) del DHT22 va conectado al otro extremo del resistor de 10kOhm y al Pin G14 de la placa ESP32.
- El Pin GND (-) del DHT22 va conectado al Pin GND de la placa ESP32.
- El ánodo del Led (Pin Largo) va conectado a un extremo del resistor de 330 Ohm, el otro extremo del resistor va conectado al Pin G0 de la placa ESP32.
- El cátodo del Led (Pin Corto) va conectado al Pin GND de la Placa ESP32.
Sketch en MicroPython
Versión 1 (Free)
Esta versión no incluye todas las funcionalidades.
''' * Control of Temperature and Humidity through a Web server using Ajax * * Name = Web Server - DHT22 * Version = 1.0.0 FREE * Update Date = 26/12/2023 * Author = Jhonatan Lamiña * e-mail = [email protected] * Web = www.jhonatanlamina.com * * -------------------------------------------------------------------------------------- * Important: * In WiFi Connection: * Replace the SSID and KEY data with those of your Wi-Fi network. * -------------------------------------------------------------------------------------- * * Copyright (c) Jhonatan Lamiña - All rights reserved ''' from machine import Pin, reset import dht import network import socket import time #Indicator Output indicator = Pin(0, Pin.OUT) #DHT22 Sensor Pin sensor = dht.DHT22(Pin(14)) #Disable debug output import esp esp.osdebug(None) #It reclaims the memory occupied by objects that are not necessary for the program import gc gc.collect() #WiFi Connection #Replace the SSID and KEY data with those of your Wi-Fi network ssid = 'SSID' key = 'KEY' wlan = network.WLAN(network.STA_IF) if not wlan.isconnected(): wlan.active(True) wlan.connect(ssid, key) print('Connecting to: %s' % ssid) timeout = time.ticks_ms() while not wlan.isconnected(): indicator.on() time.sleep(0.15) indicator.off() time.sleep(0.15) if (time.ticks_diff (time.ticks_ms(), timeout) > 15000): break if wlan.isconnected(): indicator.on() print('Successful connection to: %s' % ssid) print('IP: %s\nSUBNET: %s\n' % wlan.ifconfig()[0:2]) else: indicator.off() wlan.active(False) print('Failed to connect to: %s' % ssid) else: indicator.on() print('Connected\nIP: %s\nSUBNET: %s\n' % wlan.ifconfig()[0:2]) #Web Page def web_page(): html = """ <!DOCTYPE html> <html> <head> <title>MicroPython Weather Station</title> <script> var ajaxRequest = new XMLHttpRequest(); function ajaxLoad(ajaxURL){ ajaxRequest.open('GET',ajaxURL,true); ajaxRequest.onreadystatechange = function(){ if(ajaxRequest.readyState == 4 && ajaxRequest.status == 200){ console.log("data: " + ajaxRequest.responseText); var data = ajaxRequest.responseText.split("|"); document.getElementById('t').innerHTML = data[0]; document.getElementById('h').innerHTML = data[1]; } } ajaxRequest.send(); } function updateDATA(){ ajaxLoad('/?getdata'); } setInterval(updateDATA, 10000); </script> </head> <body> <div class='nav'> <h1>MicroPython Weather Station</h1> <h2>For more information visit <a href="http://jhonatanlamina.local" target="_blank" title="Go to www.jhonatanlamina.com">www.jhonatanlamina.com</a></h2> </div> <div> <div> <h1>Temperature:</h1><br /> <h2><span id='t'>--.-</span> °C</h2> <br /> <h1>Humidity:</h1><br /> <h2><span id='h'>--.-</span> %</p> </div> </div> </body> </html> """ return html #Socket Configuration try: tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) tcp_socket.bind(('', 80)) tcp_socket.listen(2) time.sleep(1) print('Successful socket configuration\n') except OSError as e: print('Failed to socket configuration. Rebooting...') time.sleep(3) reset() indicator.off() print('Ready...!\n********************************\n') while True: try: if gc.mem_free() < 102000: gc.collect() conn, addr = tcp_socket.accept() print('ip: %s' % str(addr[0])) request = conn.recv(1024) request = str(request) if request.find('/?getdata') == 6: indicator.on() try: sensor.measure() t = sensor.temperature() h = sensor.humidity() t1 = "{:.2f}".format(t) h1 = "{:.2f}".format(h) response = t1+"|"+h1 except OSError as e: print('Failed to sensor') response = "--.--|--.--" print('data: '+response+'\n') indicator.off() else: response = web_page() conn.send('HTTP/1.1 200 OK\n') conn.send('Content-Type: text/html\n') conn.send('Connection: close\n\n') conn.sendall(response) conn.close() except OSError as e: conn.close() time.sleep(0.1)
Versión 2 (Full)
✅ Para poder obtener el Sketch Versión Full en Micropython da clic en Comprar Ahora, se te redirigirá a la Tienda. ⭐ Lo recaudado es empleado en el desarrollo de nuevos tutoriales y proyectos. Gracias por todo tu apoyo y colaboración.
¿Cómo funciona el Sketch?
Antes de ejecutar el sketch debes reemplazar los datos de la conexión Wi-Fi, para que la Placa ESP32 pueda conectarse a la Red WiFi de tu router inalámbrico.
El Sketch funciona de la siguiente manera:
- Al energizar la placa, ésta intenta conectarse a la Red WiFi configurada, al momento de que se establezca la conexión en la consola se visualizará los datos de conexión, donde debe copiar en el portapapeles la dirección IP, la cual varía dependiendo de la configuración de su router.
- Además se visualizara la configuración del socket y la configuración del protocolo de Internet para sincronizar el reloj.
- En este apartado, si existe un problema de conexión o falla de configuración, el dispositivo se reiniciará automáticamente al cabo de 3 segundos.
- En la figura que está a continuación puedes observar los datos que se muestran cuando existe una conexión y configuración correcta:
- La dirección IP que copió anteriormente debe escribirla o pegarla en un navegador web, e ingresar a la misma.
- Una vez realizado lo anterior se visualizará la página web.
- La placa ESP32 obtendrá datos de los sensores y del reloj cada 10 segundos. Para modificar el intervalo de obtención de datos, lo puede realizar en la línea 105 del sketch. Modificando el valor de 10000 por otro (en milisegundos).
setInterval(updateDATA, 10000);
- Los datos del tiempo (fecha y hora) están configurados para que se sincronicen con el tiempo de Ecuador, dependiendo del lugar donde residas puedes modificar la zona horaria GMT en la variable hour que se encuentra en la línea 216 del sketch.
Ejemplo: Zona horaria GMT corregida para Ecuador: GMT-5 = hour-5.
RTC().init((year, month, day, weekday, hour-5, minute, second, milisecond))
- Los datos obtenidos son visualizados en la consola y en la página web como se muestra a continuación:
- Para la demostración, mire el siguiente video: