capteur_web.py
MicroPython en ESP8266 significa Wi-Fi en lenguaje de script: este registrador DHT cabe en 40 líneas sin una compilación. El módulo socket sirve HTML crudo, suficiente para un cuadro de mando casero.
Hardware necesario
Un módulo ESP-12E (ESP8266EX, Wi-Fi 2,4 GHz) montado en una placa NodeMCU / Wemos D1 mini, alimentada por micro-USB. 1 DHT11 en GPIO4 (DATA + pull-up de 10 kΩ, VDD 3,3 V, GND).
Cableado
Mismo cableado que el sketch DHT: DATA en el pin 4 (D2). Alimentar por USB; el Wi-Fi se lleva las puntas de corriente.
Funcionamiento
network.WLAN se une al AP, socket bind/listen/accept monta un servidor HTTP mínimo: cada petición dispara una medida y devuelve una página. El try/except encaja las conexiones cortadas. En el Arduino IDE, instale el paquete « esp8266 », elija « NodeMCU 1.0 (ESP-12E Module) » y suba (mantenga GPIO0 a LOW si falla). El ADC A0 lee 0-1 V (divisor NodeMCU: 0-3,3 V).
Para ir más lejos
Añada una ruta /api en JSON para un cuadro de mando real, o active WebREPL para depurar por Wi-Fi.
capteur_web.py
# MicroPython ESP8266 : DHT sur GPIO4 + mini serveur HTTP + WebREPL.
# Copier en main.py. WebREPL : https://werelup.pythonanywhere.com (optionnel).
import network, dht, machine, socket, time
sta = network.WLAN(network.STA_IF)
sta.active(True)
sta.connect("votre-wifi", "votre-cle")
for _ in range(40):
if sta.isconnected():
break
time.sleep_ms(250)
print("IP:", sta.ifconfig()[0])
dht11 = dht.DHT11(machine.Pin(4))
led = machine.Pin(2, machine.Pin.OUT)
addr = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
addr.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
addr.bind(("", 80))
addr.listen(2)
print("Serveur HTTP sur le port 80")
while True:
client, _ = addr.accept()
try:
client.recv(200) # on lit la requete, on l'oublie
dht11.measure()
html = ("<h1>T=%.0f C HR=%.0f %%</h1>" %
(dht11.temperature(), dht11.humidity()))
reponse = ("HTTP/1.0 200 OK\r\nContent-Type: text/html\r\n"
"Content-Length: %d\r\n\r\n%s" % (len(html), html))
client.send(reponse)
led.value(not led.value())
except OSError:
pass
finally:
client.close()