Neste post vamos ver como fazer uma pequena estação meteorológica com a Raspberry Pi Pico 2 W. Para medir as informações de pressão, temperatura e umidade vamos usar os sensores BMP280 e AHT10. O resultado poderá ser acessado através de um navegador, por exemplo no seu celular.
Objetivos
Este tutorial você aprenderá a:
- Conectar os sensores BMP280 e AHT10 à Raspberry Pi Pico 2 W
- Instalar o MicroPython na Raspberry Pi Pico 2 W
- Usar módulos de terceiros no MicroPython
- Ler as informações dos sensores AHT10 e BMP280
- Conectar a Raspberry Pi Pico 2 W na sua rede WiFi
- Hospedar uma página Web na Raspberry Pi Pico 2 W
Estação meteorológica com Raspberry Pi: materiais necessários
Para este projeto você vai precisar de:
- Placa Raspberry Pi Pico 2 W
- Sensor AHT10
- Sensor BMP280
- Resistores de 1kΩ (2 unidades)
- Jumpers Macho-Macho
- Protoboard
- Cabo Micro USB
Estação meteorológica com Raspberry Pi: circuito
Os dois sensores utilizados utilizam comunicação I2C. Nesta comunicação, cada dispositivo tem um endereço, permitindo que múltiplos dispositivos sejam conectados aos mesmos pinos do microcontrolador. Como a Raspberry Pi Pico 2 W possui duas interfaces I2C, poderíamos também ter conectado um sensor em cada uma.
Instalando o MicroPython na Raspberry Pi Pico 2 W
Neste projeto vamos programar a Raspberry Pi Pico 2 W em MicroPython, uma linguagem sofisticada cujo interpretador roda diretamente na placa.
A forma mais simples de instalar e interagir com o MicroPython é usando a IDE (Integrated Development Environment) Thonny. Você pode baixar o Thonny diretamente de https://thonny.org/, estão disponíveis versões para Windows, Mac e Linux.
Execute o Thonny e selecione Tools Option Interpreter. Na tela apresentada, selecione no alto “MicroPython (Raspberry Pi Pico)”:
Aperte o botão BOOT na Raspberry Pi Pico 2 W e conecte-a ao micro com o botão apertado. Ao soltar o botão o micro irá reconhecer uma unidade de disco RP2350.
Agora clique na parte inferior em “Install or update MicroPython” e selecione as opções “family” e “variant” como indicado abaixo; o campo version será preenchido automaticamente.
Clique em Install e aguarde a instalação (demora uns 15 segundos, dependendo da velocidade da sua conexão com a internet) e feche as janelas (Close e depois OK). Na Shell deverá aparecer a mensagem “MicroPython vx.xx ….”.
Usando o sensor AHT10 com MicroPython
O sensor AHT10 é capaz de medir umidade de 0% a 100% e temperatura de -40ºC a 85ºC, com precisão de ±2% na medição da umidade e ±0,3°C para temperatura.
Vamos fazer o nosso próprio módulo (biblioteca) para interagir com este sensor. O primeiro passo é criar o diretório lib na placa, onde serão instalados os módulos. Para isso, certifique-se que View Files está ligado, clique nos três tracinhos à direita de Raspberry Pi Pico e selecione New Directory:
Digite lib e Enter. Em seguida selecione lib e use a opção “Focus into” do botão direito do mouse.
Copie o código abaixo na janela principal do Thonny e use File Save As para salvar na placa com o nome aht10.py.
from machine import I2C,Pin from time import sleep_ms class AHT10: # Endereco I2C do AHT10 AHT_ADDR = 0x38 # Le status do ADH10 def getStatus(self): resp = self.i2c.readfrom (AHT10.AHT_ADDR, 1) return resp[0] def __init__(self, i2c): # salva o objeto para acesso ao i2c self.i2c = i2c # Verifica se precisa calibrar status = self.getStatus() if (status & 0x08) == 0: # print ('Calibrando') self.i2c.writeto(AHT10.AHT_ADDR, b'\xE1\x08\x00') sleep_ms(10) def getData(self): # dispara leitura self.i2c.writeto(AHT10.AHT_ADDR, b'\xAC\x33\x00') # aguarda leitura sleep_ms(80) # le resposta resp = self.i2c.readfrom (AHT10.AHT_ADDR, 6) # decodifica resposta umid = (resp[1] << 12) + (resp[2] << 4) + (resp[3] >> 4) umid = (umid / 0x100000) * 100.0 temp = ((resp[3] & 0x0F) << 16) + (resp[4] << 8) + resp[5] temp = (temp / 0x100000) * 200.0 - 50.0 return temp, umid if __name__ == "__main__": i2c = I2C(0, sda=Pin(16), scl=Pin(17)) aht10 = AHT10(i2c) while True: temp, umid = aht10.getData() print ('Umidade = {:.1f}% Temperatura = {:.1f}C'.format( umid, temp)) sleep_ms(2000)
Usando o sensor BMP280 com MicroPython
O sensor BMP280 é capaz de medir a pressão atmosférica de 300 a 1100 hPa com uma precisão de ±0.12 hPa. Ele é capaz também de medir temperaturas na faixa de -40 a 85 °C com precisão de ±1.0 °C. Neste projeto não vamos usar a medição de temperatura do BMP280 porque o sensor AHT10 é mais preciso.
Uma das vantagens de programar em MicroPython é que já existem muitos módulos disponíveis para ele. No caso, vamos usar o módulo em
https://github.com/dafvid/micropython-bmp280/blob/master/bmp280.py para tratar o sensor BMP280.
Nesta página, clique no botão para fazer o download do código em uma pasta do seu micro. Use o Thonny para copiar o arquivo baixado para o diretório lib da placa:
- Na parte inferior da janela Files (identificada como “Raspberry Pi Pico”), selecione o diretório lib e use a opção “Focus in” do botão direito do mouse.
- Na parte superior da janela FIles (identificada como “This computer”) navegue até o arquivo baixado e o selecione.
- Clique o botão direito do mouse e selecione “upload to /lib”
Estação meteorológica com Raspberry Pi: código MicroPython
O nosso programa principal irá executar os seguintes passos:
- Se conectar à rede WiFi
- Aguardar conexões na porta 80 (porta padrão para servidores WEB)
- Ao receber uma conexão, obterá os dados dos sensores e enviará uma página HTML para o dispositivo que conectou.
A página enviada especifica que uma atualização deve ser feita a cada 15 segundos.
O código abaixo deve ser digitado em uma nova aba de código e salvo na placa (no diretório raiz, clique em ‘Raspberrt Pi Pico’ na parte inferior da janela Files) com o nome estacao.py.
# Estacao Meteorologica from machine import Pin, I2C from time import sleep import socket import network from aht10 import AHT10 from bmp280 import BMP280, BMP280_CASE_INDOOR # Cria o objeto de acesso à interface I2C i2c = I2C(0, sda=Pin(16), scl=Pin(17)) # Inicia os sensores bmp280 = BMP280(i2c) bmp280.use_case(BMP280_CASE_INDOOR) aht10 = AHT10(i2c) # Ativa a interface de rede wlan = network.WLAN(network.STA_IF) wlan.active(True) wlan.connect("ESSID","senha") # Gera a página web def web_page(bmp, aht10): temp, umidade = aht10.getData() pressao = bmp.pressure html = """<html><head><meta charset="UTF-8"/> <meta http-equiv="refresh" content="15"/> <meta name="viewport" content="width=device-width, initial-scale=1"/> <link rel="icon" href="data:,"/> <style>body { text-align: center; font-family: "Helvetica", Arial;} img {display: block; margin-left: auto; margin-right: auto; margin-bottom: 10px;} table { border-collapse: collapse; width:55%; margin-left:auto; margin-right:auto; } th { padding: 12px; background-color: #87034F; color: white; } tr { border: 2px solid #000556; padding: 12px; } tr:hover { background-color: #bcbcbc; } td { border: none; padding: 14px; text-align: center; } .sensor { color:DarkBlue; font-weight: bold; background-color: #ffffff; padding: 1px; </style></head> <body><h1>Estação Meteorológica - Raspberry Pi Pico 2 W</h1> <img src= "https://www.makerhero.com/wp-content/uploads/2023/02/makerhero-logo.svg" alt="maker hero" style="max-width:100%;"> <table><tr><th>Informação</th><th>Valor</th></tr> <tr><td>Temperatura</td><td><span class="sensor">"""+f'{temp:.1f} C'+""" </span></td></tr> <tr><td>Pressão</td><td><span class="sensor">"""+f'{pressao/100:.1f} hPa'+""" </span></td></tr> <tr><td>Umidade</td><td><span class="sensor">"""+f'{umidade:.1f} %'+""" </span></td></tr> </html>""" return html # Aguarda a conexão print ('Aguardando conexão à rede WiFi') espera = 10 while espera > 0: if wlan.status() < 0 or wlan.status() >= 3: break espera -= 1 sleep(1) # Verifica se conectou if wlan.status() != 3: raise RuntimeError('Não conseguiu conectar à rede WiFi') else: print('Conectado à rede WiFi') ip=wlan.ifconfig()[0] print('IP: ', ip) # Aguarda conexõesw no port 80 addr = socket.getaddrinfo('0.0.0.0', 80)[0][-1] server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server.bind(('', 80)) server.listen(5) print('Aguardando conexões') # Laço principal (eterno enquanto dure) while True: try: conn, addr = server.accept() conn.settimeout(3.0) print('Recebeu conexão de', addr) request = conn.recv(1024) conn.settimeout(None) #print('Request:', request) response = web_page(bmp280, aht10) conn.send('HTTP/1.0 200 OK\r\nContent-type: text/html\r\n\r\n') conn.sendall(response) conn.close() except OSError as e: conn.close() print('Conexão fechada')
Estação meteorológica com Raspberry Pi: funcionamento
Com o programa principal selecionado no Thonny, digite F5 para executá-lo. Na janela Shell será apresentado o endereço IP que a placa recebeu do roteador WiFi. Em um micro, tablet ou celular, navegue para este endereço. Serão apresentadas as leituras dos sensores; elas serão atualizadas a cada 15 segundos.
Observações e Sugestões
- Se você salvar o programa principal na placa com o nome main.py, ele será executado automaticamente quando a placa for ligada.
- Ao invés de se conectar a uma rede existente, você pode criar uma nova rede:
wlan = network.WLAN(network.WLAN.IF_AP) wlan.active(True) wlan.config(essid='Pico2', password='makerhero')
Neste caso, para acessar a página se conecte à rede “Pico2” (senha “makerhero” e navegue para o endereço “192.168.4.1”. Você vai precisar alterar também o HTML para retirar a tag <img> que referencia uma imagem na internet.
- Experimente usar outros sensores, inclusive para acrescentar outras informações.
- Neste exemplo estamos implementando “na unha” o HTTP (protocolo para acesso a servidores WEB). Existem bibliotecas específicas para isso, como a microdot (https://github.com/miguelgrinberg/microdot)
Conclusão
Neste post vimos um exemplo prático de como usar a Raspberry Pi Pico 2 W para implementar uma estação meteorológica. Usando a linguagem MicroPython, foi bastante simples trabalhar com os sensores AHT10 e BMP280, que nos forneceram informações de temperatura, umidade relativa e pressão atmosférica. Graças à capacidade de comunicação WiFi da Raspberry Pi Pico 2 W, estas informações podem ser fornecidas para dispositivos conectados a uma rede local e acessados via um navegador WEB.
Você já utilizou o MicroPython em exemplos? Pretende montar este ou outros projetos com a Raspberry Pi Pico 2 W? Conte para a gente nos comentários.
Se você tiver dúvidas, sugestões ou experiências para compartilhar, fique a vontade para deixar um comentário abaixo. E para não perder nenhum conteúdo como este, não deixe de nos seguir no Instagram.
O post Estação meteorológica com Raspberry Pi Pico 2 W apareceu primeiro em MakerHero.