Transmita dados de sensores através de WiFi com o seu Raspberry Pi Pico W

Raspberry Pi Pico W tutorial dados do sensor de fluxo

Já alguma vez quis transmitir dados de sensores com o seu Raspberry Pi Pico W?

Uma das melhores utilizações para o Raspberry Pi Pico W envolve a sua capacidade de servir uma página Web. Isto significa que pode usá-lo para monitorizar dados de sensores a partir do seu telemóvel, desde que esteja dentro do alcance do WiFi. Este projeto fornecerá uma base simples sobre como monitorizar dados de aceleração e também criar um dado digital, que é ativado quando se toca no sensor ADXL343.

Raspberry Pi Pico W ligado a um ADXL343

Vídeo

Peças necessárias

O que é o ADXL343?

O ADXL343 da Analog Devices é um seguimento do seu predecessor, o ADXL345.

O sensor pode medir três eixos de medição e tem quatro ajustes de sensibilidade,+-2g, +-4g, +-8g ou +-16g. O alcance inferior dá mais resolução para movimentos lentos, o alcance superior é bom para o rastreio de alta velocidade.

O ADXL343 também tem uma biblioteca CircuitPython que podemos utilizar em MicroPython, tornando muito mais fácil o seu arranque.

Terá de ter os cabeçalhos soldados no ADXL343, bem como no Pico W, para poder transmitir dados do sensor com o Pico W.

Ligação do ADXL343 ao Pico W

Há quatro pinos que precisa de ligar ao Raspberry Pi.

Ligue o VIN pino a um Saída 3.3V no seu Raspberry Pi Pico W;

Ligue o GND a um pino de terra no seu Pico W;

Ligue o SDA pino para GPIO0;

Ligue o SCL pino para GPIO1.

Firmware MicroPython Intermitente para o Raspberry Pi Pico W

Em primeiro lugar, terá de fazer piscar o firmware de MicroPython para o Pico W, se ainda não o fez.

Pode descarregá-lo aqui.

Em seguida, mantenha premido o botão BOOTSEL e ligue o seu Pico ao seu computador. Deverá ver uma nova unidade. Copie o ficheiro .UF2 que descarregou para essa unidade.

Criar o Thonny para o Raspberry Pi Pico W

Abrir a Thonny. Se ainda não o descarregou, obtê-lo aqui.

Definir o intérprete para MicroPython (Raspberry Pi Pico) na parte inferior esquerda da janela do Thonny IDE.

Copiar bibliotecas para o Pico W

Descarregue as bibliotecas e ficheiros aqui a partir do nosso repo Github.

Pode descarregar um ficheiro ZIP indo a esse link e clicando no verde "Código" e clicando Descarregar ZIP.

Uma vez descarregado, descomprima-o em algum lugar que se lembre.

Depois, no seu Thonny IDE, clique em Ver > Ficheiros para ver o seu sistema de ficheiros e o sistema de ficheiros do Pico W.

Navegar para os ficheiros descomprimidos e ir para a pasta MicroPython > II Pico W Sensor Server. Copie tudo no seu Pico W clicando com o botão direito do rato em cada item e clicando em "Upload to /".

Modificando o código

Para conseguir que o Raspberry Pi Pico se ligue à sua rede WiFi, terá de se abrir secrets.py e modificar o ssid e pwvalor do produto. Introduza o SSID (nome) da sua rede no primeiro e a palavra-passe no segundo. Guardar o ficheiro.

O index.html é a página web que será servida. A linha "<p>X AccX | Y AccY | Z AccZ</p>" e <p>Resultado DiceVal</p> serão substituídos por dados de sensores quando o projecto for executado.

Ligue o seu Raspberry Pi Pico a WiFi

O main.py é onde a acção acontece.

Estas linhas ligam-no ao seu WiFi. Não se esqueça de mudar a corda em rp2.país se o seu país não for a Alemanha (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)

O LED de bordo piscará três vezes se uma ligação WiFi for bem sucedida, graças a estas linhas de código. Irá também imprimir uma mensagem e o seu endereço IP que pode ser visualizado em Thonny. Este endereço IP é útil para aceder ao servidor mais 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])

Se houver um erro, o LED piscará com base no valor do código de erro.

Significados de erro

  • 0 = Link Down
  • 1 = Link Join
  • 2 = Link NoIp
  • 3 = Ligar
  • -1 = Link Fail
  • -2 = Link NoNet
  • -3 = Link BadAuth

Ligar o Pico W a ADXL343

Esta linha inicializa um objecto I2C:

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

Em seguida, estas duas linhas criam o acelerómetro e permitem a detecção de torneira (para leitura de dados).

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

accelerometer.enable_tap_detection()

Tempo para executar o código

Para executar o código, prima o botão Executar em Thonny, que é o botão com um ícone de reprodução num botão verde na barra de ferramentas superior.

Depois, ligue-se ao endereço IP do seu Raspberry Pi Pico W. Se tiver a casca do Thonny aberta, pode vê-la lá. Ou então, pode entrar no seu router e descobrir qual é o endereço IP do Pico W.

O Pico W executa um servidor HTTP com uma ligação socket e ouve as ligações, definidas aqui:

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

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

Quando se liga ao endereço IP do seu Pico W, este código irá activar este código que actualizará index.html com os dados mais recentes a 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 substitui os valores com a leitura actual quando se liga ao servidor do Pico W.

Como pode ver, substitui AccX, AccY e AccZ com os dados do seu sensor.

Se o sensor for tocado, então imprimirá um inteiro aleatório de 1 a 6 na string "DiceVal" na página HTML.

O que se segue?

Este tutorial representa uma forma simples de transmitir dados de sensores para uma página Web com o Raspberry Pi Pico W.

Na verdade, este é o código que também pode utilizar para outros sensores.

A metodologia continua a ser a mesma. É necessário encontrar as bibliotecas correctas para os seus sensores, depois modificar o main.py e index.html para que possam obter os dados dos sensores e empurrar os valores certos para a página web.

Existem muitos outros projectos em que se pode embarcar, como um sensor de temperatura e humidade ou talvez um projeto de qualidade do ar com um DHT22 ou BME688ou um sensor de luminosidade com uma resistência à luz.

7 comentários

  1. Ken Anderson em Julho 15, 2022 às 7:24 am

    Seria certamente agradável usar as características do HTML5 para que pudéssemos ver como o HTML5 é feito

  2. Terry Young em Setembro 24, 2022 às 6:47 pm

    Poderiam os dados ser simplesmente transmitidos como talvez uma string numa porta por TCP/UDP em vez de num formato de página web, para que pudessem ser lidos por outro computador (para fazer calibres ou algo assim?)
    algo 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 em Janeiro 10, 2023 às 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?
    In deinem Beispielcode ist es so, das der Pico W etwas macht, wenn er über HTML angesprochen wird. In meinem Fall bräuchte ich sowas wie eine
    "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?

    Besten Dank e Gruß
    Ingo

    • raspi berry em Fevereiro 4, 2023 às 11:51 am

      O Pico eere Pico könnte in einer Schleife laufen, und die Werte per REST API vom ersten Pico abfragen?
      Ich verstehe die Problemstellung sonst vielleicht nicht ganz?

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

  4. Luis em Janeiro 11, 2023 às 3:30 pm

    cómo puedo mandar esos datos a thinspeak

  5. Eddi Baars em Março 18, 2023 às 1:02 pm

    guten Tag, ich habe dasselbe Problem. Mit curl oder wget funktioniert es nicht. Ich möchte die Messwerte vom Pico auf meinem Raspi4 speichern und später grafisch darstellen und statistisch auswerten. ???

  6. andrew em Julho 19, 2023 às 10:31 pm

    nenhum módulo chamado network se adicionar o módulo netwrk do thonny ele então reclama de nenhum módulo chamado socket lol

Deixe um comentário