Desenvolvendo uma estação meteorológica com Raspberry Pi Pico

Fala galera tudo bem com vocês? Em nosso último tutorial aprendemos como dar os primeiros passos com o Raspberry Pi Pico, agora vamos fazer algo um pouco mais elaborado, vamos desenvolver uma estação meteorológica com Raspberry Pi Pico! Nós já desenvolvemos um estação com Esp8266 e uma com Arduino Cloud, clique aqui para ver o tutorial da primeira e clique aqui para ver o tutorial da segunda!

Pessoal o ano já está acabando, outubro (2021) já está quase no fim, estamos com a intenção de fazer um tutorial diferente para o fim de ano, e vou pedir a ajuda de vocês, qual projeto bacana nós deveríamos publicar aqui no blog no fim de ano? Aguardo a sugestão de vocês nos comentários ou no e-mail: contato@arduinoomega.com!

Raspberry Pi Pico x Arduino x Esp 8266/32

Lembra que fizemos um projeto de Sensor de Temperatura e Umidade com o Arduino e depois com o Esp32? Pois
tai, pra não deixar o Raspberry enciumado vamos fazer também esse projeto nele, porém a linguagem será Python, ahh, se você não conhece Python e deseja que escrevemos um tutorial aqui sobre essa linguagem de programação, comenta aqui neste post que poderemos desenvolver e publicar, afinal esse blog é de vocês, escrevemos o que vocês querem ler!!

Montagem do Circuito

Na imagem abaixo temos o circuito de montagem, creio que você já tenha lido o artigo introdutório sobre Raspberry Pi Pico, se ainda não leu, clique aqui para ler esse tutorial introdutório e depois volte aqui. A montagem é simples acredito que não tenha muita dificuldade em entender o circuito, a diferença do Pi Pico para o Esp e Arduino é que ele não vem com os conectores soldados, então você precisará solda-los.

Aproveite que temos um kit de Raspberry Pi Pico em nossa loja, comprei o seu kit e monte este projeto!

Como dito anteriormente o Rasp Pico não vem com os pinos macho soldados, na verdade ele é vendido totalmente “liso”, por isso recomendamos que ao comprar o seu Rasp Pico, compre também duas barras de pinos macho ou um kit igual ao da imagem acima!

Ao soldar os pinos em seu Raspberry Pi Pico, ele ficará como na imagem abaixo:

Pico sem os pinos soldados
Pico com os pinos soldados

Mas por que ela vem sem esses pinos machos?


Bem, um dos motivos é que esta placa foi pensada não para prototipar e sim para desenvolver um produto final, por esse motivo ela vem lisinha para que você possa soldá-la direto em outra placa principal ou soldar um chicote da placa para os sensores e atuadores por exemplo.


Pois então, corre lá, solda sua placa e monta o circuito conforme imagem do início desse artigo que agora vamos partir para os códigos.

Mergulhando no código

É natural haver comparações entre as tecnologias Arduino, ESP e Raspberry, e este post é justamente para ajudar a entender as diferenças e aplicações de dada tecnologia!

Ma para isso, precisamos entender o que comparar, por exemplo, você talvez se assuste ao baixar o arquivo dos códigos neste link e se deparar com 03 códigos, ai pensar que é muito mais difícil programar no Raspberry Pi Pico do que no ESP ou Arduino, pois neste caso tenho que escrever 03 códigos e 02 deles são um pouco longos, mas não é bem isso que acontece, realmente você precisará carregar os 03 códigos para a sua placa Raspberry Pi Pico que você comprou no Arduino ômega, porem 02 deles são como se fosse as bibliotecas do display e do sensor DHT11 que você usa ao programar o Arduino, a diferença é que no Arduino esses códigos vão de forma direta na importação delas, já aqui no Raspberry Pi Pico tenho que envia-los manualmente, então na teoria o único código que você precisaria entender é o código do arquivo main.py, que pode ser visto abaixo:

from machine import Pin, I2C
from ssd1306 import SSD1306_I2C
import utime as time
from dht import DHT11, InvalidChecksum
 
WIDTH  = 128                                            # largura da tela oled
HEIGHT = 64                                             # altura da tela oled
 
i2c = I2C(0, scl=Pin(9), sda=Pin(8), freq=200000)       # Init I2C usando pinos GP8 e GP9 (pinos I2C0 padrão)
print("I2C Address      : "+hex(i2c.scan()[0]).upper()) # Exibir endereço do dispositivo
print("I2C Configuration: "+str(i2c))                   # Exibir configuração I2C
 
 
oled = SSD1306_I2C(WIDTH, HEIGHT, i2c)                  # Init, você está em exibição
 
while True:
    time.sleep(1)
    pin = Pin(28, Pin.OUT, Pin.PULL_DOWN)
    sensor = DHT11(pin)
    t  = (sensor.temperature)
    h = (sensor.humidity)
    print("Temperature: {}".format(sensor.temperature))
    print("Humidity: {}".format(sensor.humidity))
    # Limpe o display do oled caso ele tenha algum lixo nele.
    oled.fill(0)       
    
    # Adicione algum texto
    oled.text("Temp: ",10,10)
    oled.text(str(sensor.temperature),50,10)
    oled.text("*C",90,10)
    
    oled.text("Humi: ",10,30)
    oled.text(str(sensor.humidity),50,30)
    oled.text("%",90,30)
    
    time.sleep(1)
    oled.show()

Acima está o código principal de nosso projeto e de inicio já importamos 04 bibliotecas, 02 nativas do microPython, “machine” e “utime”, e as 02 outras são externas, que é necessário enviar o código pro RPI Pico, “ssd1306” e “dht”.

  
from machine import Pin, I2C
from ssd1306 import SSD1306_I2C
import utime as time
from dht import DHT11, InvalidChecksum

Nas linhas seguintes, 6 e 7, definimos o tamanho do display de O’Led.

WIDTH  = 128                                            # largura da tela oled
HEIGHT = 64                                             # altura da tela oled

Na linha 9 inicializa a comunicação I2C usando os pino GP8 e GP9, SCL e SDA respectivamente, e logo em seguida apresenta o endereço I2C com o print na linha 10 e a sua configuração com o print da linha 11.

i2c = I2C(0, scl=Pin(9), sda=Pin(8), freq=200000)       # Init I2C usando pinos GP8 e GP9 (pinos I2C0 padrão)
print("I2C Address      : "+hex(i2c.scan()[0]).upper()) # Exibir endereço do dispositivo
print("I2C Configuration: "+str(i2c))                   # Exibir configuração I2C

Na linha 14 do nosso código passamos os parâmetros da classe SSD1306_I2C atribuindo a ela a largura, comprimento e informações do i2c atribuídos na linha 09.

oled = SSD1306_I2C(WIDTH, HEIGHT, i2c)                  # Init, você está em exibição

A partir da linha 16 é que inicia o loop do projeto, onde realmente roda o código, nela criamos um laço de repetição infinito através do “while True” na linha 16 e na 17 esperamos 1 segundo para que o sensor DHT11 arme o dispositivo. Na linha 18 configuramos o pino que está conectado o sensor atribuindo os parâmetros na classe Pin( pino que o sensor está conectado, define que o pino é de Saída, define que é saída default baixa), tudo isso é armazenado em um novo objeto “pin” que será passado na classe “DHT11” já na linha seguinte, 19. Mais uma vez
tudo é salvo em um novo objeto que definimos ser a variável “sensor”.


Pronto, concluindo as inicializações agora vem a parte de leitura do sensor e impressão na tela do computador. Na linha 20 é a instrução para ler a temperatura e na linha 21 para ler a umidade sendo armazenado os valores nas variáveis “t” e ”h” respectivamente.


Nas linhas 22 e 23 imprime esses valores no tela do pc, isso é bom pois quem não tem o display de o’led poderia parar o código aqui e já teria o projeto funcionando mostrando o resultado da temperatura e umidade na tela do seu computador.

while True:
    time.sleep(1)
    pin = Pin(28, Pin.OUT, Pin.PULL_DOWN)
    sensor = DHT11(pin)
    t  = (sensor.temperature)
    h = (sensor.humidity)
    print("Temperature: {}".format(sensor.temperature))
    print("Humidity: {}".format(sensor.humidity))

Das linhas 25 a 37 já são instruções comuns bem parecidas com a IDE do Arduino onde serão responsáveis pela exibição da informação no display de O’Led.

# Limpe o display do oled caso ele tenha algum lixo nele.
    oled.fill(0)       
    
    # Adicione algum texto
    oled.text("Temp: ",10,10)
    oled.text(str(sensor.temperature),50,10)
    oled.text("*C",90,10)
    
    oled.text("Humi: ",10,30)
    oled.text(str(sensor.humidity),50,30)
    oled.text("%",90,30)
    
    time.sleep(1)
    oled.show()

Abaixo tem uma parte do código responsável pela configuração e correto funcionamento do display de O’led (arquivo SSD1306.py, clique aqui para fazer o download do código completo), e como comentado no inicio deste artigo não é necessário comentá-lo, basta apenas saber importa-lo e como usar, como foi ensinado nas linhas acima.

# MicroPython SSD1306 Driver OLED, interfaces I2C e SPI
 
from micropython import const
import framebuf
 
 
# register definitions
SET_CONTRAST = const(0x81)
SET_ENTIRE_ON = const(0xA4)
SET_NORM_INV = const(0xA6)
SET_DISP = const(0xAE)
SET_MEM_ADDR = const(0x20)
SET_COL_ADDR = const(0x21)
SET_PAGE_ADDR = const(0x22)
SET_DISP_START_LINE = const(0x40)
SET_SEG_REMAP = const(0xA0)
SET_MUX_RATIO = const(0xA8)
SET_COM_OUT_DIR = const(0xC0)
SET_DISP_OFFSET = const(0xD3)
SET_COM_PIN_CFG = const(0xDA)
SET_DISP_CLK_DIV = const(0xD5)
SET_PRECHARGE = const(0xD9)
SET_VCOM_DESEL = const(0xDB)
SET_CHARGE_PUMP = const(0x8D)
...

E por fim o código (arquivo dht.py, clique aqui para fazer o download do código completo) seguinte é responsável pelo funcionamento correto do sensor de temperatura e umidade da família DHT, observe que tanto esse código quanto o anterior importam bibliotecas nativas para dentro deles e uma delas é importada aqui sendo a biblioteca “micropython”.

import array
import micropython
import utime
from machine import Pin
from micropython import const
 
class InvalidChecksum(Exception):
    pass
 
class InvalidPulseCount(Exception):
    pass
 
MAX_UNCHANGED = const(100)
MIN_INTERVAL_US = const(200000)
HIGH_LEVEL = const(50)
EXPECTED_PULSES = const(84)
 

Conclusão

Neste post aprendemos a desenvolver uma estação meteorológica com o Raspberry Pi Pico, vimos algumas diferenças entre o código dele (que fizemos na linguagem python) para o código do Arduino ou Esp. Vimo também que o Rasp Pico é enviado “liso” de fábrica, e que é preciso comprar as barras de pino para podermos soldar no Pico e assim conectá-lo em uma protoboard para podermos prototipar os nossos projetos!

Sobre Sandro Mesquita 20 artigos
Prof. Sandro Mesquita, Msc. Eng de Software, CREA - 44680 .

2 Trackbacks / Pingbacks

  1. Série sobre Python e Arduino - Parte 1 - Blog Arduino Ômega
  2. como acessar o banco de dados usando Arduino e Python

Deixe uma resposta

O seu endereço de email não será publicado.


*