BME280 com Raspberry Pi Pico usando MicroPython

Tempo de leitura: 8 minutes

Neste guia do usuário, veremos o sensor BME280 que é usado para pressão, umidade e temperatura. Em primeiro lugar, aprenderemos sobre o BME280 e como fazer interface com o Raspberry Pi Pico. Em seguida, trabalharemos em um exemplo simples para demonstrar seu funcionamento e, por último, mediremos Temperatura, Umidade e Pressão com o BME280 e exibiremos os valores em um OLED.

 

Pré-requisitos

Antes de começarmos esta lição, certifique-se de que você esteja familiarizado e tenha a versão mais recente do Python 3 em seu sistema, tenha configurado o MicoPython no Raspberry Pi Pico e tenha um Ambiente de Desenvolvimento Integrado (IDE) em execução no qual faremos a programação. Usaremos o mesmo Thonny IDE que usamos anteriormente quando aprendemos a piscar e perseguir LEDs em micro-python.

 

Introdução ao BME280

O sensor BME280 é usado para medir leituras de temperatura ambiente, pressão barométrica e umidade relativa. É usado principalmente em aplicativos da Web e móveis, onde o baixo consumo de energia é fundamental. Este sensor usa I2C ou SPI para comunicar dados com os microcontroladores. Embora existam várias versões diferentes do BME280 disponíveis no mercado, a que iremos estudar utiliza protocolo de comunicação I2C e SPI.

I2C significa Circuito Inter-Integrado e funciona segundo o princípio do sistema síncrono, multi-mestre e multi-escravo. Com o BME280 e o microcontrolador, o Raspberry Pi Pico atua como mestre, e o sensor BME280 como escravo por ser um dispositivo externo, atua como escravo. O Raspberry Pi Pico se comunica com o sensor BME280 através do protocolo I2C para fornecer leituras de temperatura, pressão barométrica e umidade relativa.

 

Diagrama de pinagem

A figura abaixo mostra o sensor BME280 e sua pinagem.

BME280 Pinout
BME280 Pinout
  • VCC: conectado com 3.3V
  • SCL: usado para gerar o sinal de clock
  • SDA: usado no envio e recebimento de dados

 

Esquema Raspberry Pi Pico com BME280

A conexão do BME280 com o Raspberry Pi Pico é muito simples. Temos que conectar o terminal VCC com 3,3V, terra com o terra (terra comum), SCL do sensor com SCL da placa e SDA do sensor com o pino SDA da placa.

Pinos I2C Raspberry Pi Pico

Raspberry Pi Pico tem dois controladores I2C. Ambos os controladores I2C são acessíveis através dos pinos GPIO do Raspberry Pi Pico. A tabela a seguir mostra a conexão dos pinos GPIO com os dois controladores I2C. Cada conexão do controlador pode ser configurada através de vários pinos GPIO conforme mostrado na figura. Mas antes de usar um controlador I2C, você deve configurar no software quais pinos GPIO você deseja usar com um controlador I2C específico.

Controlador I2C GPIO Pinos
I2C0 – SDA GP0/GP4/GP8/GP12/GP16/GP20
I2C0 – SCL GP1/GP5/GP9/GP13/GP17/GP21
I2C1 – SDA GP2/GP6/GP10/GP14/GP18/GP26
I2C1 – SCL GP3/GP7/GP11/GP15/GP19/GP27

As conexões entre os dois dispositivos que estamos usando podem ser vistas abaixo.

BME280 Raspberry Pi Pico
VCC 3.3V
SDA GP0 (I2C0 SDA)
SCL GP1 (I2C0 SCL)
GND GND

Usamos as mesmas conexões especificadas na tabela acima. No entanto, você também pode usar outras combinações de pinos SDA/SCL.

Raspberry Pi Pico com diagrama de conexão BME280
Raspberry Pi Pico com diagrama de conexão BME280

 

Biblioteca MicroPython BME280

Teremos que instalar a biblioteca BME280 para MicroPython para continuar com nosso projeto.

Para fazer isso com sucesso, abra seu Thonny IDE com seu Raspberry Pi Pico conectado ao seu sistema. Vá para Tools > Manage Packages. Isso abrirá o Thonny Package Manager.

Procure por “bme280” na barra de pesquisa digitando seu nome e clicando no botão ‘Pesquisar no PyPI’. Instale esta biblioteca.

Após alguns momentos, esta biblioteca será instalada com sucesso. Agora estamos prontos para programar nosso Raspberry Pi Pico com sensor BME280 em MicroPython.

 

Medindo Temperatura, Pressão e Umidade com BME280

Como já instalamos a biblioteca BME280 em nosso Raspberry Pi Pico, agora podemos usar as funções disponíveis na biblioteca BME280 para obter as leituras dos sensores.

Vejamos agora um exemplo para mostrar o funcionamento do sensor. Vamos conectar nosso sensor BME280 com o Raspberry Pi Pico através do protocolo I2C conforme mostrado acima no diagrama de conexão. Veremos um código de script MicroPython e depois de carregá-lo em nossa placa, veremos leituras de temperatura, pressão e umidade relativa impressas no terminal do shell MicroPython.

Código BME280 MicroPython

Agora vamos ver o script MicroPython para BME280 para obter as leituras do sensor. Copie o código a seguir para o arquivo .py e carregue o arquivo no Raspberry Pi Pico. Este script MicroPython lê os valores de pressão, temperatura e umidade do BME280 em linhas I2C e os imprime no console do shell MicroPython.

from machine import Pin, I2C        #importing relevant modules & classes
from time import sleep
import bme280                       #importing BME280 library

i2c=I2C(0,sda=Pin(0), scl=Pin(1), freq=400000)    #initializing the I2C method 

while True:
  bme = bme280.BME280(i2c=i2c)          #BME280 object created
  print(bme.values)
  sleep(10)           #delay of 10s

 

Como o Código Funciona?

Primeiramente, importaremos a classe Pin e a classe I2C do módulo da máquina. Isso ocorre porque temos que especificar o pino para comunicação I2C. Também importamos o módulo de sono para que possamos adicionar um atraso de 10 segundos entre nossas leituras. Além disso, importe a biblioteca bme280 que instalamos anteriormente.

from machine import Pin, I2C        #importing relevant modules & classes
from time import sleep
import bme280       #importing BME280 library

Definindo Pinos GPIO Raspberry Pi Pico para BME280

Em seguida, inicializaremos os pinos I2C GPIO para SCL e SDA, respectivamente. Usamos os pinos I2C0 SCL e I2C0 SDA.

Criamos um método I2C() que recebe quatro parâmetros. O primeiro parâmetro é o canal I2C que estamos usando. O segundo parâmetro especifica o pino I2C GPIO da placa que está conectada à linha SDA. O terceiro parâmetro especifica o pino I2C GPIO da placa que está conectada à linha SCL. O último parâmetro é a conexão de frequência.

Estamos configurando o SCL no pino 1 e o SDA no pino 0.

i2c=I2C(0,sda=Pin(0), scl=Pin(1), freq=400000)

Em seguida, executamos um loop infinito dentro do qual criamos um objeto do BME280 chamado bme e acessamos as leituras do sensor através dele. Vamos imprimir os valores no terminal dando o comando print. Também adicionamos um atraso de 10 segundos após a exibição de cada conjunto de leituras.

while True:
  bme = bme280.BME280(i2c=i2c)          #BME280 object created
  print(bme.values)
  sleep(10)           #delay of 10s

 

Demonstração

Depois de copiar o código a seguir no arquivo, clique no ícone ‘Salvar’ para salvar o código do programa no seu PC. Salve seu arquivo dando um nome que termina em .py e salve de acordo com sua preferência dando o diretório.

Depois de salvar o código, pressione o botão Executar para fazer o upload do código para o seu módulo Raspberry Pi Pico. Antes de fazer o upload do código, certifique-se de que a placa correta esteja selecionada.

Você verá as leituras de Temperatura (°C), Pressão (hPa) e Umidade (%) no console do casco. Cada conjunto de leituras será atualizado para novos após cada 10 segundos. (Programa foi mantido em inglês, pois este exemplo veio dentro do grupo de Raspberry PI Pico.

Valores do sensor Raspberry Pi Pico Display BME280 no display OLED

Nesta seção, veremos como exibir os valores de pressão, temperatura e umidade do BME280 em um display OLED 0,96 SSD1306 usando MicroPython e Raspberry Pi Pico

Você também pode gostar de ler:

Biblioteca MicroPython de exibição OLED SSD1306

Já carregamos a biblioteca BME280 MicroPython para o Raspberry Pi Pico. Para um display OLED, também precisaremos carregar uma biblioteca para o Raspberry Pi Pico.

  • Para fazer isso com sucesso, abra seu Thonny IDE com seu Raspberry Pi Pico conectado ao seu sistema. Vá para  Tools > Manage Packages. Isso abrirá o Thonny Package Manager.

  • Pesquise “ssd1306” na barra de pesquisa digitando seu nome e clicando no botão “Pesquisar no PyPI”.

  • A partir dos seguintes resultados de pesquisa, clique no destacado abaixo: micropython-ssd1306

Instale esta biblioteca.

Após alguns momentos, esta biblioteca será instalada com sucesso. Agora estamos prontos para programar nosso Raspberry Pi Pico com display OLED.

Conectando a tela OLED SSD1306 com Raspberry Pi Pico e BME280

Precisaremos dos seguintes componentes para conectar nosso Raspberry Pi Pico ao display OLED e ao BME280.

  • Raspberry PI Pico
  • Sensor BME280
  • Tela OLED SSD1306
  • Fios de conexão

O display OLED possui 4 terminais que iremos conectar com o Raspberry Pi Pico. Como o display OLED requer uma tensão de operação na faixa de 3,3-5V, conectaremos o terminal VCC com 3,3V que será comum com a placa e o sensor. O SCL do display será conectado com o pino SCL do módulo e o SDA do display será conectado com o SDA do módulo. O aterramento de todos os três dispositivos será mantido em comum.

As conexões entre os três dispositivos que estamos usando podem ser vistas abaixo.

SSD1306 OLED Display Raspberry Pi Pico BME280
VCC 3.3V VCC
SDA GP0 (I2C0 SDA) SDA
SCL GP1 (I2C0 SCL) SCL
GND GND GND

Esquema Raspberry Pi Pico com OLED e BME280

Siga o diagrama esquemático abaixo e conecte-os de acordo.

Código MicroPython: Exibindo leituras BME280 no display OLED

from machine import Pin, I2C        #importing relevant modules & classes
from time import sleep
import bme280        #importing BME280 library
from ssd1306 import SSD1306_I2C

i2c=I2C(0,sda=Pin(0), scl=Pin(1), freq=400000)    #initializing the I2C method 
oled = SSD1306_I2C(128, 64, i2c)

while True:
  oled.fill(0)
  bme = bme280.BME280(i2c=i2c)        #BME280 object created
  temperature = bme.values[0]         #reading the value of temperature
  pressure = bme.values[1]            #reading the value of pressure
  humidity = bme.values[2]            #reading the value of humidity

  print('Temperature: ', temperature)    #printing BME280 values
  print('Humidity: ', humidity)
  print('Pressure: ', pressure)
  
  oled.text("Temp "+temperature, 0, 0)
  oled.text("PA "+pressure, 0, 20)
  oled.text("Humidity "+humidity, 0,40)
  oled.show()                          #display 
  sleep(10)     #delay of 10s

Como funciona o código?

Na seção, explicaremos o código MicroPython que é usado para exibir os valores do sensor no OLED.

Biblioteca de importação

Importaremos o ssd1306, que é a biblioteca de exibição OLED que instalamos anteriormente. Isso nos ajudará a acessar todas as funções definidas dentro dele.

from ssd1306 import SSD1306_I2C

Inicializar OLED
Os dados dos pinos SCL e SDA são salvos no objeto ‘i2c’ que irá se conectar ao barramento I2C e auxiliar na comunicação entre os dois dispositivos

Agora, vamos criar um objeto ‘oled’ de SSD1306_I2C que usa a largura, altura e o objeto i2c como parâmetros.

oled = SSD1306_I2C(128, 64, i2c)

Limpa o display OLED com a rotina led.fill().

oled.fill(0)

Pegue as amostras de temperatura, umidade e pressão do sensor BME280 e imprima-as no terminal shell.

temperature = bme.values[0]         #reading the value of temperature
pressure = bme.values[1]                      #reading the value of pressure
humidity = bme.values[2]                   #reading the value of humidity

print('Temperature: ', temperature)    #printing BME280 values
print('Humidity: ', humidity)
print('Pressure: ', pressure)

Por fim, exiba o texto junto com as leituras do sensor no OLED.

oled.text("Temp "+temperature, 0, 0)
oled.text("PA "+pressure, 0, 20)
oled.text("Humidity "+humidity, 0,40)

No final, chame o método show() no método oled para que as alterações sejam exibidas no OLED. Adicione um atraso de 10 segundos entre cada conjunto de leituras.

oled.show()                      
sleep(10)

 

Demonstração

Carregue o código acima como um arquivo .py para Raspberry Pi Pico. Pressione o botão de execução para fazer upload do código para o módulo Raspberry Pi Pico. Você verá os valores de temperatura, pressão e umidade do BME280 no visor OLED da seguinte forma:

Além disso, o console shell também mostra o conjunto de leituras do sensor BME280:

 

Visits: 1 Visits: 1126029