Transmite datos de sensores a través de WiFi con tu Raspberry Pi Pico W

Tutorial de la Raspberry Pi Pico W para la transmisión de datos de los sensores

¿Alguna vez has querido transmitir datos de sensores con tu Raspberry Pi Pico W?

Uno de los mejores usos de la Raspberry Pi Pico W es su capacidad para servir una página web. Esto significa que puedes usarlo para monitorizar los datos de los sensores de tu teléfono siempre que estés en el rango WiFi. Este proyecto proporcionará una base sencilla sobre cómo puedes monitorizar los datos de aceleración y también crear un dado digital, que se activa cuando tocas el sensor ADXL343.

Raspberry Pi Pico W conectada a un ADXL343

Vídeo

Piezas necesarias

¿Qué es el ADXL343?

El ADXL343 de Analog Devices es la continuación de su predecesor, el ADXL345.

El sensor puede medir tres ejes de medición y tiene cuatro ajustes de sensibilidad,+-2g, +-4g, +-8g o +-16g. El rango más bajo proporciona más resolución para los movimientos lentos, el rango más alto es bueno para el seguimiento de alta velocidad.

El ADXL343 también tiene una librería CircuitPython que podemos utilizar en MicroPython, lo que hace mucho más fácil empezar.

Usted tendrá que tener los cabezales soldados en el ADXL343, así como el Pico W con el fin de hacer el flujo de datos del sensor con su Pico W.

Conexión del ADXL343 al Pico W

Hay cuatro pines que necesitas conectar a la Raspberry Pi.

Conecte el VIN a un Salida de 3,3 V en su Raspberry Pi Pico W;

Conecte el GND a una clavija de tierra en su Pico W;

Conecte el SDA pin a GPIO0;

Conecte el SCL pin a GPIO1.

Flashear el firmware de MicroPython para la Raspberry Pi Pico W

En primer lugar, tendrá que flashear el firmware de MicroPython en el Pico W, si aún no lo ha hecho.

Puede descargarlo aquí.

A continuación, mantenga pulsado el botón BOOTSEL y conecte su Pico al ordenador. Debería ver una nueva unidad de disco. Copie el archivo .UF2 que descargó en esa unidad.

Configurar Thonny para la Raspberry Pi Pico W

Abre Thonny. Si no lo has descargado, consígalo aquí.

Poner el intérprete en MicroPython (Raspberry Pi Pico) en la parte inferior izquierda de la ventana de Thonny IDE.

Copiar bibliotecas en el Pico W

Descargue las bibliotecas y los archivos aquí desde nuestro repositorio de Github.

Puede descargar un archivo ZIP accediendo a ese enlace y haciendo clic en el botón verde "Código" y haciendo clic en Descargar ZIP.

Una vez descargado, descomprímelo en algún lugar que recuerdes.

Luego, en su IDE de Thonny, haga clic en Ver > Archivos para ver su sistema de archivos y el del Pico W.

Navega hasta los archivos descomprimidos y entra en la carpeta MicroPython > II Pico W Sensor Server. Copie todo en su Pico W haciendo clic con el botón derecho en cada elemento y haciendo clic en "Cargar en /"

Modificación del código

Para que la Raspberry Pi Pico se conecte a tu red WiFi, tendrás que abrir secretos.py y modificar el ssid y pw...el valor de la red. Introduce el SSID (nombre) de tu red en el primero y la contraseña en el segundo. Guarde el archivo.

El index.html es la página web que se servirá. La línea "<p>X AccX | Y AccY | Z AccZ</p>" y <p>Resultado DiceVal</p> será sustituido por los datos de los sensores cuando se ejecute el proyecto.

Conecta tu Raspberry Pi Pico al WiFi

El main.py es donde ocurre la acción.

Estas líneas lo conectan a tu WiFi. No olvides cambiar la cadena en rp2.country si su país no es Alemania (DE).


# Set country to avoid possible errors
rp2.country('DE')

wlan = network.WLAN(network.STA_IF)
wlan.active(True)
# If you need to disable powersaving mode
# wlan.config(pm = 0xa11140)

# See the MAC address in the wireless chip OTP
mac = ubinascii.hexlify(network.WLAN().config('mac'),':').decode()
print('mac = ' + mac)

# Other things to query
# print(wlan.config('channel'))
# print(wlan.config('essid'))
# print(wlan.config('txpower'))

# Load login data from different file for safety reasons
ssid = secrets['ssid']
pw = secrets['pw']

wlan.connect(ssid, pw)

El LED de la placa parpadeará tres veces si la conexión WiFi fue exitosa, gracias a estas líneas de código. También imprimirá un mensaje y su dirección IP que se puede ver en Thonny. Esta dirección IP es útil para acceder al servidor más tarde.

   led = machine.Pin('LED', machine.Pin.OUT)
    for i in range(wlan.status()):
        led.on()
        time.sleep(0.2)
        led.off()
        time.sleep(0.2)
    print('Connected')
    status = wlan.ifconfig()
    print('ip = ' + status[0])

Si hay un error, el LED parpadeará en función del valor del código de error.

Significado de los errores

  • 0 = Enlace caído
  • 1 = Enlace de unión
  • 2 = Enlace NoIp
  • 3 = Enlazar
  • -1 = Fallo de enlace
  • -2 = Enlace NoNet
  • -3 = Enlace BadAuth

Conectar Pico W a ADXL343

Esta línea inicializa un objeto I2C:

# Initialize I2C
# busio.I2C(SCL, SDA)
i2c = busio.I2C(board.GP1, board.GP0)

A continuación, estas dos líneas crean el acelerómetro y permiten la detección de golpes (para la lectura de los dados).

# Create Accelerometer object
accelerometer = adafruit_adxl34x.ADXL343(i2c)

accelerometer.enable_tap_detection()

Hora de ejecutar el código

Para ejecutar el código, pulse el botón Ejecutar en Thonny, que es el botón con un icono de reproducción en un botón verde en la barra de herramientas superior.

A continuación, conéctate a la dirección IP de tu Raspberry Pi Pico W. Si tienes abierta la shell de Thonny, puedes verla allí. O bien, puede iniciar sesión en su router y averiguar cuál es la dirección IP del Pico W.

El Pico W ejecuta un servidor HTTP con una conexión de socket y escucha las conexiones, definidas aquí:

addr = socket.getaddrinfo('0.0.0.0', 80)[0][-1]

s = socket.socket()
s.bind(addr)
s.listen(1)

Cuando te conectes a la dirección IP de tu Pico W, se activará este código que refrescará index.html con los últimos datos cada segundo.

   cl, addr = s.accept()
        print('Client connected from', addr)
        cl_file = cl.makefile('rwb', 0)
        while True:
            line = cl_file.readline()
            if not line or line == b'\r\n':
                break
            
        response = get_html('index.html')
        data = accelerometer.acceleration
        tapped = accelerometer.events['tap']
        response = response.replace('AccX', str(data[0]))
        response = response.replace('AccY', str(data[1]))
        response = response.replace('AccZ', str(data[2]))
        if tapped:
            dice_val = str(random.randint(1,6))
        response = response.replace('DiceVal', dice_val)
        
        cl.send('HTTP/1.0 200 OK\r\nContent-type: text/html\r\n\r\n')
        cl.send(response)
        cl.close()

main.py sustituye los valores por la lectura actual cuando se conecta al servidor de Pico W.

Como puede ver, sustituye AccX, AccY y AccZ por los datos de su sensor.

Si el sensor es tocado, entonces imprimirá un número entero aleatorio de 1 a 6 en la cadena "DiceVal" en la página HTML.

¿Qué es lo siguiente?

Este tutorial representa una forma sencilla de transmitir datos de sensores a una página web con su Raspberry Pi Pico W.

De hecho, este es el código que puede utilizar para otros sensores también.

La metodología sigue siendo la misma. Tienes que encontrar las bibliotecas correctas para tus sensores, luego modificar el main.py y el index.html para que puedan obtener los datos del sensor y empujar los valores correctos en la página web.

Hay muchos otros proyectos en los que puede embarcarse, como un sensor de temperatura y humedad o quizás un proyecto de calidad del aire con un DHT22 o un BME688o un sensor de luminosidad con una resistencia luminosa.

7 Comentarios

  1. Ken Anderson el julio 15, 2022 a las 7:24 am

    Seguro que estaría bien utilizar las características de HTML5 para que pudiéramos ver cómo se hace HTML5

  2. Terry Young el septiembre 24, 2022 a las 6:47 pm

    ¿Podrían los datos ser simplemente transmitidos como una cadena en un puerto por TCP/UDP en lugar de en un formato de página web, para que pudiera ser leído por otro ordenador (para hacer medidores o algo así?)
    algo así como
    192.168.1.24:9060
    AccX, 7,923, AccY, 1,093, AccZ, -5,452
    AccX, 6,423, AccY, 1,241, AccZ, -8,769

  3. Ingo el enero 10, 2023 a las 9:11 pm

    Mal angenommen man hätte einen Pico W, der in einer Dauerschleife läuft und Messwerte erfasst; wie können diese Messwerte von einem anderen Pico W über WLAN abgefragt werden?
    En su código de ejemplo, el Pico W hace algo, cuando está basado en HTML. En mi caso, he utilizado algo como
    "getvaluefromotherpico(192.178.2.44, variablename)" - sprich er soll immer in seiner Schleife laufen und die per WLAN angefragten Anfragen nebenher bedienen, z.B. per Interrupt.
    Wie wäre sowas möglich?

    Muchas gracias y saludos
    Ingo

    • raspi berry el febrero 4, 2023 a las 11:51 am

      El otro Pico puede funcionar de forma incorrecta y los usuarios pueden acceder a la API REST del primer Pico.
      Ich verstehe die Problemstellung sonst vielleicht nicht ganz?

      Wenn es ein kommerzielles Projekt ist, können wir gern consulting-technisch aktiv werden 🙂.

  4. Luis el enero 11, 2023 a las 3:30 pm

    cómo puedo mandar esos datos a thinspeak

  5. Eddi Baars el marzo 18, 2023 a las 1:02 pm

    guten Tag, ich habe dasselbe Problem. Con curl o wget no funciona. Ich möchte die Messwerte vom Pico auf meinem Raspi4 speichern und später grafisch darstellen und statistisch auswerten. ???

  6. andrew el julio 19, 2023 a las 10:31 pm

    no hay modulo llamado network si añades el modulo netwrk desde thonny entonces se queja de que no hay modulo llamado socket lol

Deja un comentario