Interface do BMP280 com o Arduino para ler pressão, temperatura e altitude

Tempo de leitura: 6 minutes

Este artigo mostra como fazer a interface de um sensor de pressão BMP280 com o Arduino. O BMP280 é um sensor de pressão, umidade, temperatura e altitude aproximada desenvolvido pela Bosch Sensortec. É idealmente usado para aplicações relacionadas ao meio ambiente e este sensor também pode ser usado para aplicações relacionadas a próteses onde a pressão é um parâmetro muito crítico para trabalhar. É ainda útil em drones onde a pressão, temperatura e altitude podem ser úteis para monitorar e fazer observações adicionais.

O Bosch BMP280 pode ser conectado a vários microcontroladores como PIC, AVR, ESP32 / ESP8266, Arduino, etc. Neste tutorial, usaremos o Arduino para fazer a interface com nosso sensor BMP280. Além do BMP280, há também outro sensor chamado BMP180 que pode medir a pressão.

Componentes necessários

  • Arduino Uno e cabo USB.
  • BMP280.
  • ProtoBoard.
  • Jumper Wires.

 

Funcionamento do sensor de pressão BMP280

Antes de iniciar a interface. Deixe-nos saber alguns detalhes importantes sobre o sensor. Este sensor pode operar de um mínimo de 1,7 V a 3,6 V. O BMP280 consiste em um elemento sensor piezo-resistivo que é conectado a um conversor A/D. Este conversor fornece os resultados da conversão com compensação de sensor específica junto com uma interface digital e é equipado com um filtro IIR embutido para minimizar os distúrbios nos dados de saída.

O BMP280 pode ser conectado usando dois protocolos que são I2C e SPI. Ele pode medir a pressão de 300 a 1100hPa com precisão de ± 1%, a temperatura de -40 a + 85 ℃ com precisão de ± 1% e pode nos dar a altitude aproximada com alguns cálculos. A tensão de operação do sensor é de 1,2V a 3,6V com consumo de corrente de 0,1uA no modo de hibernação, o que o torna útil para aplicações de baixa potência em eletrônica embarcada. Para saber mais sobre o sensor e suas especificações técnicas, você pode conferir a Datasheet BMP280.

Vamos entender resumidamente o que é o protocolo I2C (Inter-Integrated Circuit), ele nos permite conectar vários escravos integrados com uma ou mais eletrônica mestre. É um protocolo de 2 fios que pode suportar até 1008 escravos. Cada escravo pode ser identificado usando um endereço único.

 

Diferença entre BME280 vs BMP280

Observe que existem dois tipos de sensores vendidos no mercado, ou seja, o BME280 e o BMP280. Aqui estão as diferenças entre esses dois sensores.

  • BME280 e BMP280 são desenvolvidos pela Bosch Sensortec.
  • O sensor BMP280 é usado para encontrar a pressão digital e a temperatura, enquanto o BME280 pode ser usado para medir a pressão digital, a temperatura e a umidade.
  • Por causa dessa diferença, o BME280 é um pouco mais caro do que o BMP280.
  • Portanto, dependendo dos requisitos do seu projeto, você pode selecionar o sensor que atende ao seu propósito.

Diagrama de circuito para interface do BMP280 com o Arduino

O esquema completo para conectar o BMP280 ao Arduino é mostrado abaixo. Também usei a opção de notas para ilustrar quais pinos estão conectados a quê.

As conexões são muito simples, usei uma placa de ensaio para montar o sensor e usei fios de conexão para fazer a interface do meu sensor com o Arduino. Minha configuração de hardware se parece com esta abaixo

Instale a biblioteca BMP280 no Arduino IDE

Para se comunicar com este módulo usando I2C e evitar técnicas de programação complexas, precisamos usar esta biblioteca Adafruit_BMP280_Library. Baixe a biblioteca em formato zip e siga as etapas para instalá-la em seu Arduino IDE

Vá para o local onde você baixou a pasta zip, selecione o arquivo zip e pressione abrir.

 

Isso instalará a biblioteca em seu Arduino IDE. O endereço I2C padrão deste sensor é 0x77. No caso de se obter o erro como Não foi possível encontrar um sensor BMP280 válido como mostrado abaixo, verifique a ligação!

Em seguida, se o problema persistir, altere o endereço do sensor para 0x76 no _i2caddr de Adafruit_BMP280.cpp conforme mostrado abaixo.

Se tudo estiver funcionando como deveria, a saída pode ser encontrada em seu monitor serial conforme mostrado abaixo.

Programa Arduino para ler temperatura, pressão e altitude usando BMP280

O programa completo demonstrado neste artigo pode ser encontrado no final desta página. A explicação do código é a seguinte.

Iniciamos o programa definindo as bibliotecas conforme abaixo.

#include <Wire.h>
#include <SPI.h>
#include <Adafruit_BMP280.h>

Em seguida, definiremos os pinos SPI se usarmos o protocolo de comunicação SPI.

#define BMP_SCK  (13)
#define BMP_MISO (12)
#define BMP_MOSI (11)
#define BMP_CS   (10)

No setup, definimos a taxa de transmissão do monitor serial e inicializamos o módulo I2C chamando a função begin(). Ele tem algumas instruções de impressão para tornar o código interativo na reinicialização. Se o sensor falhar na leitura devido ao endereço errado ou problema de ligação, ele dá o erro em serial para verificar a ligação e o endereço do sensor. Se o sensor se conectar com sucesso, ele começará a imprimir o valor em seu terminal serial.

  Serial.begin(9600);
  Serial.println(F("BMP280 teste"));
  if (!bmp.begin()) {
    Serial.println(F("Não foi possível encontrar um sensor BMP280 válido, verifique a ligação!"));
    while (1);
  }
/* Configurações padrão do datasheet. */
  bmp.setSampling(Adafruit_BMP280::MODE_NORMAL,     /* Modo operacional. */
                  Adafruit_BMP280::SAMPLING_X2,     /* Temp. sobreamostragem */
                  Adafruit_BMP280::SAMPLING_X16,    /* Sobreamostragem de pressão */
                  Adafruit_BMP280::FILTER_X16,      /* Filtrando. */
                  Adafruit_BMP280::STANDBY_MS_500); /* Tempo de espera. */

No loop, o código nos dá a leitura do sensor usando as funções a seguir e a imprime no terminal serial.

bmp.readTemperature() - lê a temperatura em graus centígrados
bmp.readAltitude(1013.25) - calcula a altitude em metros com base na pressão ao nível do mar definida
bmp.readPressure() - lê a pressão em hPA (hectoPascal = milibar)

No mercado, existem vários módulos de sensor, o sensor que tínhamos conosco era direto para a interface, mas há uma chance de você obter o sensor que pode ter um seletor de endereço I2C parecido com este,

Você não precisa se preocupar com isso, explicaremos como você pode fazer a interface com este sensor usando as mesmas etapas explicadas acima.

Em conclusão, este sensor nos dá facilidade para obter pressão, umidade, temperatura e altitude sem nenhuma fiação ou programação complicada. O sensor funciona com protocolo I2C, que é de fácil compreensão e possui funções predefinidas que fazem o trabalho por nós.

 

Código

/***************************************************************************
Esta é uma biblioteca para o sensor de umidade, temperatura e pressão BMP280
   Projetado especificamente para trabalhar com o Breakout Adafruit BMP280
   ----> http://www.adafruit.com/products/2651
   Esses sensores usam I2C ou SPI para se comunicar, 2 ou 4 pinos são necessários
   para fazer a interface.
   Para saber mais, visite nosso website www.capsistema.com.br
*/
#include <Wire.h>
#include <SPI.h>
#include <Adafruit_BMP280.h>
#define BMP_SCK  (13)
#define BMP_MISO (12)
#define BMP_MOSI (11)
#define BMP_CS   (10)
Adafruit_BMP280 bmp; // I2C
//Adafruit_BMP280 bmp(BMP_CS); // hardware SPI
//Adafruit_BMP280 bmp(BMP_CS, BMP_MOSI, BMP_MISO,  BMP_SCK);
void setup() {
  Serial.begin(9600);
  Serial.println(F("BMP280 teste"));
  if (!bmp.begin()) {
    Serial.println(F("Não foi possível encontrar um sensor BMP280 válido, verifique a ligação!"));
    while (1);
  }
  /* Configurações padrão do datasheet. */
  bmp.setSampling(Adafruit_BMP280::MODE_NORMAL, /* Modo operacional. */ 
                  Adafruit_BMP280::SAMPLING_X2, /* Temp. sobreamostragem */ 
                  Adafruit_BMP280::SAMPLING_X16, /* Sobreamostragem de pressão */ 
                  Adafruit_BMP280::FILTER_X16, /* Filtrando. */ 
                  Adafruit_BMP280::STANDBY_MS_500); /* Tempo de espera. */
}

void loop() {
    Serial.print(F("Temperature = "));
    Serial.print(bmp.readTemperature());
    Serial.println(" *C");
    Serial.print(F("Pressure = "));
    Serial.print(bmp.readPressure());
    Serial.println(" Pa");
    Serial.print(F("Approx altitude = "));
    Serial.print(bmp.readAltitude(1013.25)); /* Ajustado à previsão local! */
    Serial.println(" m");
    Serial.println();
    delay(2000);
}