🛠 Serveur web de commande d'une LED en MicroPython
Objectifs
Faire tourner un mini serveur HTTP sur l'ESP8266 avec MicroPython, sans aucune bibliothèque externe : on utilise directement le module socket pour accepter les connexions TCP sur le port 80, analyser la ligne de requête et renvoyer une page HTML avec deux liens qui allument et éteignent la LED embarquée GPIO2. Ce tutoriel montre une autre façon de programmer la puce (le port MicroPython esp8266 est très léger), le principe actif-LOW de la LED GPIO2 (valeur 0 = allumée), et la récupération de l'IP via ifconfig. À faire depuis un ordinateur du même réseau que le module.
Matériel
- 1 module ESP8266-ESP-12E (ou NodeMCU) avec MicroPython flashé (port esp8266, binaire « generic-esp8266 »)
- 1 câble micro-USB/USB ou adaptateur série pour le flashage et l'IDE (Thonny recommandé)
- LED embarquée GPIO2 (ou LED externe + résistance 330 Ω)
- Réseau Wi-Fi 2,4 GHz et un navigateur sur le même réseau
Code complet
# main.py MicroPython (port esp8266) - serveur LED sur GPIO2
import network
import socket
led = network and __import__("machine").Pin(2, 1) # GPIO2 en sortie
sta = network.WLAN(network.STA_IF)
sta.active(True)
if not sta.isconnected:
sta.connect("mon-réseau", "mot-de-passe")
import time
for _ in range(40):
if sta.isconnected:
break
time.sleep_ms(250)
print("IP =", sta.ifconfig[0])
html = ("<h1>ESP-12E</h1>"
"<a href='/on'><button>ALLUMER</button></a> "
"<a href='/off'><button>ETEINDRE</button></a>")
def handle(req):
if req.startswith("GET /on"): # LED active-LOW : 0 = allumee
led.value(0)
elif req.startswith("GET /off"):
led.value(1)
return html
s = socket.socket
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind(("0.0.0.0", 80))
s.listen(1)
while True:
cl, _ = s.accept
req = cl.recv(100).decode
cl.send("HTTP/1.0 200 OK\r\nContent-type: text/html\r\n\r\n" + handle(req))
cl.close
Note : la ligne d'initialisation de la broche peut aussi s'écrire proprement import machine; led = machine.Pin(2, machine.Pin.OUT) si tu colles le code dans un vrai fichier main.py.
Vérification attendue
Après démarrage, la console affiche l'IP du module (par exemple 192.168.1.57). Ouvre cette adresse dans un navigateur du même réseau : la page avec deux boutons apparaît. « ALLUMER » éteint la broche GPIO2 (valeur 0) et allume la LED embarquée ; « ETEINDRE » fait l'inverse. Le module doit rester réactif après plusieurs clics.
Erreurs fréquentes
- Confondre la logique : sur la LED embarquée, led.value(0) allume et led.value(1) éteint (active-LOW), le contraire de ce qu'on attend intuitivement.
- Le navigateur affiche « connexion réinitialisée » pour l'icône favicon.ico : c'est normal, la requête /favicon.ico tombe dans le même gestionnaire ; renvoie simplement la page.
- Un seul client à la fois avec listen(1) : si une connexion reste ouverte, le navigateur suivant attend ; garde cl.close systématique.
- Oublier le port 80 libre : certains réseaux d'entreprise bloquent ; teste sur une box domestique.
- Écraser main.py pendant l'exécution : le serveur redémarre, c'est normal en développement, coupe le code avec Ctrl-C dans l'IDE avant de recharger.
Autres tutoriels pour cette carte
Exemples de code pour cette carte
clignotante.inoArduinobouton-led.inoArduinorespiration.inoArduinodht11.inoArduinoluxmetre.inoArduinoserveur-web.inoArduino