serveur-web-led.py
La placa se conecta al Wi-Fi y se convierte en un servidor web mínimo: una página servida en HTTP crudo muestra el estado del LED y dos enlaces para controlarlo desde cualquier aparato de la red local.
Hardware
Una Raspberry Pi Pico W (RP2040 + chip radio Wi-Fi de 2,4 GHz) con MicroPython instalado, alimentada por USB. Una red Wi-Fi de 2,4 GHz; LED externo + resistencia de 330 Ω.
Cableado
LED a GP15 mediante 330 Ω a GND. El LED de usuario está en el chip de radio: usa un LED externo.
Funcionamiento
network.WLAN(sta) asocia la placa al punto de acceso; socket bind/listen/accept espera las peticiones HTTP. La URL pedida (/on, /off) controla el pin y la respuesta HTML se devuelve al instante.
Ejecución
Instala la versión MicroPython « Pico W » (BOOTSEL + .uf2) y copia el script vía Thonny. Como el LED de usuario lo gestiona el chip de radio, los ejemplos de salida usan un LED externo.
Variantes
Añade una lectura de sensor a la página (temperatura interna), o sirve varios pines como /pin/estado.
serveur-web-led.py
# Mini serveur web MicroPython : la page affiche l'etat de la LED
# et propose des liens /on et /off. Aucune bibliotheque externe.
import network
import socket
import time
from machine import Pin
WIFI_SSID = "votre-ssid"
WIFI_PASS = "votre-cle"
led = Pin(15, Pin.OUT) # LED externe sur GP15
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect(WIFI_SSID, WIFI_PASS)
for _ in range(40):
if wlan.isconnected():
break
time.sleep_ms(500)
print("Adresse IP :", wlan.ifconfig()[0])
serveur = socket.socket()
serveur.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
serveur.bind(("0.0.0.0", 80))
serveur.listen(2)
print("Serveur pret sur le port 80")
while True:
client, adresse = serveur.accept()
requete = client.recv(200).decode("utf-8", "ignore")
if "GET /on" in requete:
led.value(1)
elif "GET /off" in requete:
led.value(0)
etat = "ALLUMEE" if led.value() else "ETEINTE"
page = ("<h1>LED " + etat + "</h1>"
"<a href='/on'>Allumer</a> | <a href='/off'>Eteindre</a>")
reponse = ("HTTP/1.0 200 OK
Content-Type: text/html
" + page)
client.send(reponse.encode())
client.close()