Requisitos

  • Tener una Raspberry Pi Pico W y cable microusb

  • Tener instalada la librería picozero.py en tu Rp Pico W

  • Tener acceso a una red Wi-Fi y contar con el nombre y contraseña de la red

  • Que la computadora esté conectada a la misma red a la que vayas a conectar la Rp Pico W

Pasos

  1. Crea un archivo llamado web_server.py

  2. Copia y pega el código que se encuentra abajo, y cambia la parte que dice NOMBRE-DE-TU-RED y TU-CONTRASEÑA por el nombre de tu red y tu contraseña

  3. Corre el código en tu raspberry pi pico w

  4. En la terminal, te aparecerá "Connected on [nombre de tu ip]", copia el nombre de la ip, pégala en google chrome (ahí funciona mejor), y dale enter.

  5. Ya que estés en la página web, podrás ver la temperatura de la raspberry y con los botones prender y apagar el led interno de tu raspberry.

Código explicado

————————————————————————————————————————————————————————————————————————————--

PARTE 1 - INICIALIZACIÓN

  • En la primera parte del código, se importan librerías, se inicializan los componentes (objetos) y se crean las funciones.

  • Esta parte del código se ejecuta una sola vez.

————————————————————————————————————————————————————————————————————————————--

En la siguiente sección se importan las librerías para poder conectarse a internet.

import network
import socket
from time import sleep
from picozero import pico_temp_sensor, pico_led
import machine

A continuación se inicializan las variables para poder conectarse a la red. Hay que poner el nombre de la red de tu casa y tu contraseña.

ssid = 'NOMBRE-DE-TU-RED'
password = 'TU-CONTRASEÑA'

En esta última sección, se crean cuatro funciones:

1 - connect( ) ---> intenta conectarse a la red, lo seguirá intentando mientras la condición del ciclo while se cumpla, y cuando se logre conectar creará una dirección ip a la cual nos podremos conectar para entrar a la página web.

def connect():
    #Connect to WLAN
    wlan = network.WLAN(network.STA_IF)
    wlan.active(True)
    wlan.connect(ssid, password)
    while wlan.isconnected() == False:
        print('Waiting for connection...')
        sleep(1)
    ip = wlan.ifconfig()[0]
    print(f'Connected on {ip}')
    return ip

2 - open_socket(ip) ---> ya que se creó la dirección ip, y se guardó en la variable ip, ya podemos usarla para crear un socket y que haya conexión de la raspberry a la página.

def open_socket(ip):
    # Open a socket
    address = (ip, 80)
    connection = socket.socket()
    connection.bind(address)
    connection.listen(1)
    return connection

3 - web_page(temparature, state) ---> crea un código html para la página web con los botones y texto que queremos poner en la página, y te regresa este código en formato de texto en una variable llamada html.

def webpage(temperature, state):
    #Template HTML
    html = f"""
            <!DOCTYPE html>
            <html>
            <form action="./lighton">
            <input type="submit" value="Light on" />
            </form>
            <form action="./lightoff">
            <input type="submit" value="Light off" />
            </form>
            <p>LED is {state}</p>
            <p>Temperature is {temperature}</p>
            </body>
            </html>
            """
    return str(html)

4 - serve(connection) ---> aquí ocurre toda la magia, pues toma la información de la página web (botones, por ejemplo) y se programa la condición que al presionarlos ejecute una acción (prender y apagar el led), además de desplegar información relevante (en este caso, la temperatura, obteniéndola directamente de la raspberry pi pico mediante la librería picozero).

def serve(connection):
    #Start a web server
    state = 'OFF'
    pico_led.off()
    temperature = 0
    while True:
       client = connection.accept()[0]
       request = client.recv(1024)
       request = str(request)
       try:
           request = request.split()[1]
       except IndexError:
           pass
       if request == '/lighton?':
           pico_led.on()
           state = 'ON'
       elif request =='/lightoff?':
           pico_led.off()
           state = 'OFF'
       temperature = pico_temp_sensor.temp
       html = webpage(temperature, state)
       client.send(html)
       client.close()

————————————————————————————————————————————————————————————————————————————--

PARTE 2 - CICLO INFINITO

  • En esta segunda parte se ejecutan las funciones o aquellas acciones que queramos realizar de manera infinita, normalmente se usa alguno de estos ciclos:

while True:
   # aquí va tu código
try:
   # aquí va tu código
except:
   # aquí va lo que pasa si ocurre una excepción
  • Esta parte del código se ejecuta infinitas veces.

————————————————————————————————————————————————————————————————————————————--

El try es como un while, con la diferencia de que funciona como un interruptor, al momento de presionar alguna tecla (KeyboardInterrupt) es cuando se resetea la raspberry con la función machine.reset()

Si te das cuenta, sigue el orden de las funciones que creamos...

connect( ) ---> open_socket(ip) ---> serve(connection)

¡Ojo! La función serve(connection) ya está usando la función web_page(temparature, state), por eso no aparece en el código, porque ya está dentro de esta función.

try:
    ip = connect()
    connection = open_socket(ip)
    serve(connection)
except KeyboardInterrupt:
    machine.reset()