Sensores de pressão atmosférica: Do BMP085 ao BMP280

Desde sua fundação em 2005, a Bosch Sensortec vem entregando ao mercado diversos sensores e eletrônicos para as mais diversas aplicações. Dentre os produtos desenvolvidos pela mesma neste período estão os sensores de pressão atmosférica da série BMP, que, apesar de poucos utilizarem, além de contar com a medição de pressão atmosférica, ainda contam com a medição de temperatura.

Recentemente recebemos alguns produtos da Autocore Robótica, para quem não conhece, a Autocore vende diversos produtos, como, por exemplo, Arduino, peças para robótica, diversos componentes eletrônicos, uma variedade de sensores e ainda conta com ferramentas e recursos para prototipagem e desenvolvimento de projetos, vale a pena conferir, basta clicar na imagem abaixo.

Visite a Autocore Robótica

 

Aplicações

Existem inúmeros projetos que podem precisar de dados barométricos. Frequentemente são usados no monitoramento das mudanças nas condições de tempo, onde através da pressão atmosférica associada com outros dados é possível predizer alguma situação por vir, como, por exemplo, quando se diz que há uma Baixa Pressão pode indicar chuva, tempestade e até mesmo nevasca, onde ocorre, enquanto Alta Pressão pode indicar poucas nuvens ou dia ensolarado.

Uma outra aplicação dos sensores está relacionada diretamente com a altitude.

Imagem: http://www.seara.ufc.br/

É possível utilizar a pressão atmosférica para determinar exatamente qual sua altitude. Ao nível do mar a pressão atmosférica está por volta de 1013hPa. Ao contrário do que alguns pensam, quanto mais alto, menor a pressão e vice versa. Os limites de altitude que o sensor consegue determinar estão diretamente relacionados com a faixa de operação deles, quanto mais a faixa de medição, maior a faixa de altitude capaz de determinar.

BMP085

Introduzido em outubro de 2009, o BMP085 foi amplamente utilizado em aplicações com microcontroladores, contando com uma ampla faixa de leitura de pressão, 300 a 1100 hPa, o que permite determinar altitudes desde 9000 metros acima do nível do mar, até cerca de -500m. Em sua melhor configuração ele é possível de ter uma precisão de 0.03 hPa (0.25m). Quanto a estrutura o mesmo tem uma área de 5.00 x 5.00 mm, com uma altura de 1.2mm, sendo ele o maior da série.

Código de Exemplo:

#include <Wire.h>
#include <Adafruit_BMP085.h>

Adafruit_BMP085 bmp;
  
void setup() {
  Serial.begin(9600);
  if (!bmp.begin()) {
  Serial.println("Sensor não encontrado");
  while (1) {}
  }
}
  
void loop() {
    Serial.print("Temperatura = ");
    Serial.print(bmp.readTemperature());
    Serial.println(" *C");
    
    Serial.print("Pressão = ");
    Serial.print(bmp.readPressure());
    Serial.println(" Pa");
    
    // Usando como referência 1013.25 millibar = 101325 Pascal
    Serial.print("Altitude = ");
    Serial.print(bmp.readAltitude());
    Serial.println(" metros");

    Serial.print("Pressão no nivel do mar (calculada) = ");
    Serial.print(bmp.readSealevelPressure());
    Serial.println(" Pa");

    Serial.println();
    delay(500);
}

 

BMP180

Chegando no mercado em Abril de 2013, o BMP180, já veio substituindo o BMP085, porém agora muito mais preciso e menor que seu antecessor. Algumas características permaneceram as mesmas como, por exemplo, tensão e faixa de operação. Seu novo encapsulamento, o LGA, foi também um dos motivos para o tamanho reduzido, sendo este agora de 3.6mm x 3.8mm com uma altura de 0.93mm. Quanto a precisão o BMP180 traz uma precisão de 0.02hPa (0.17m) em seu modo mais avançado, o tempo de medição também não sofreu muita alteração.

Código de exemplo:

#include <SFE_BMP180.h>
#include <Wire.h>

SFE_BMP180 pressure;
double baseline;

void setup()
{
  Serial.begin(9600);
  
  if (pressure.begin())
    Serial.println("BMP180 iniciado");
  else
  {
    Serial.println("BMP180 não encontrado\n\n");
    while(1); 
  }
  baseline = getPressure();
  
  Serial.print("Pressão base: ");
  Serial.print(baseline);
  Serial.println(" mb");  
}

void loop()
{
  double a,P;
  
  P = getPressure();

  a = pressure.altitude(P,baseline);
  
  Serial.print("Altitude: ");
  if (a >= 0.0) Serial.print(" ");
  Serial.print(a,1);
  Serial.print(" metros, ");
  
  delay(500);
}


double getPressure()
{
  char status;
  double T,P,p0,a;

  status = pressure.startTemperature();
  if (status != 0)
  {

    delay(status);
    status = pressure.getTemperature(T);
    if (status != 0)
    {
      status = pressure.startPressure(3);
      if (status != 0)
      {
        
        delay(status);

        status = pressure.getPressure(P,T);
        if (status != 0)
        {
          return(P);
        }
        else Serial.println("Erro medindo a pressao\n");
      }
      else Serial.println("Erro iniciando a medicao de pressao\n");
    }
    else Serial.println("Erro medindo a temperatura\n");
  }
  else Serial.println("Erro iniciando a medicao de temperatura\n");
}

BMP280

O último sensor que falaremos, e o mais recente, o BMP280 foi introduzido no mercado em Maio de 2015, substituindo todos os anteriores. Ele chegou ainda menor, mais preciso e veloz. Ele chega também em encapsulamento LGA porém agora com 2.0 × 2.5 mm e  0.95 mm de altura. Ele é, em média, 13% mais veloz que o BMP180, ou seja, seu tempo de amostragem foi reduzido o que permite mais medições em um mesmo período de tempo. Outra novidade foi o duplo protocolo de comunicação, desde o BMP085 todos os sensores estavam restritos ao uso do I2C para se comunicarem, no BMP280 foi introduzido, além do I2C, a opção de se usar o SPI. Sua precisão em sua melhor configuração agora é de 0.0016 hPa (0,01 m).

Código de exemplo:

#include <Wire.h>
#include <SPI.h>
#include <Adafruit_Sensor.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);
  
  if (!bmp.begin()) {  
    Serial.println(F("BMP280 não encontrado!"));
    while (1);
  }
}

void loop() {
    Serial.print(F("Temperatura = "));
    Serial.print(bmp.readTemperature());
    Serial.println(" *C");
    
    Serial.print(F("Pressão = "));
    Serial.print(bmp.readPressure());
    Serial.println(" Pa");

    Serial.print(F("Altitude = "));
    Serial.print(bmp.readAltitude(1013.25)); // referência de 1013.25 Pa
    Serial.println(" m");
    
    Serial.println();
    delay(2000);
}

 

16

Graduando em Engenharia Elétrica pela Universidade Federal de São João del Rei (UFSJ) também é Técnico em Eletrotécnica pelo Centro Federal de Educação Tecnológica de Minas Gerais (CEFET-MG). Apaixonado por criação e desenvolvimento de projetos relacionados à software e hardware.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *