Quantcast
Channel: MakerHero
Viewing all articles
Browse latest Browse all 416

Estação meteorológica com Raspberry Pi Pico 2 W

$
0
0

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.

Navegador de 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:

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.

Estação meteorológica com Raspberry Pi: circuito

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)”:

Instalando o MicroPython na Raspberry Pi Pico 2 W

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.

Instalando o MicroPython na Raspberry Pi Pico 2 W

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:

Usando o sensor AHT10 com MicroPython

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:

  1. 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.
  2. Na parte superior da janela FIles (identificada como “This computer”) navegue até o arquivo baixado e o selecione.
  3. 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:

  1. Se conectar à rede WiFi
  2. Aguardar conexões na porta 80 (porta padrão para servidores WEB)
  3. 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.

Estação meteorológica com Raspberry Pi: funcionamento

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.


Viewing all articles
Browse latest Browse all 416