fbpx
ArduinoNovidadeSérie Arduino

Como utilizar o sensor de pressão atmosférica – Barômetro BMP180 com Arduino

O barômetro BMP 180 é um sensor capaz de medir a pressão atmosférica e a temperatura do ambiente, bem como determinar a altitude e monitorar as mudanças no clima. Este componente possui uma faixa de medições entre 30.000 e 110.000 Pa, proporciona uma precisão absoluta de 2,5hPa e uma medição de temperatura na faixa entre -45ºC e 85ºC, com precisão de ± 1ºC.

Este sensor é muito utilizado em projetos que envolver aperfeiçoamento da navegação GPS, cálculo de posição e detecção de inclinação, pequenas estações meteorológicas, entre outras.

A imagem mostra uma foto tirada do Sensor de pressão atmosférica - barômetro BMP180
Figura 1 – Sensor de pressão atmosférica – Barômetro BMP180

O módulo BMP180 possui 4 pinos: VIN, GND, SCL e SDA, conforme mostra a Figura 2:

A imagem mostra os 4 pinos do sensor de pressão atmosférica - barômetro BMP180
Figura 2 – Pinos do sensor de pressão atmosférica BMP180

Cada pino possui a seguinte função:

  • VIN: Pino de alimentação do módulo. Recomenda-se a utilização de uma fonte de alimentação com tensão entre 1,8V e 3,6 V;
  • GND: Pino de aterramento (GND);
  • SCL: Pino clock serial para interface I2C;
  • SDA: Pino de dados serial para interface I2C.

Neste tutorial, iremos aprender a utilizar o barômetro BMP180 em conjunto com o Arduino para medir a temperatura, pressão absoluta e pressão relativa de um determinado local.


MATERIAIS NECESSÁRIOS


ESQUEMÁTICO DE LIGAÇÃO

Inicialmente, certifique-se de que a sua placa Arduino esteja desligada. Em seguida monte os circuitos da Figura 3, utilizando o sensor BMP180 e os jumpers.

A Figura ilustra as ligações entre o arduino e o sensor BMP para funcionamento do circuito.
Figura 3 – Circuito para uso do sensor de pressão atmosférica – Barômetro BMP180

Ao montar o circuito observe os seguintes pontos:

  • O pino VIN do sensor deve ser conectado a entrada 3V3 do Arduino.
  • O pino GND do sensor deve ser conectado a entrada GND do Arduino.
  • O pino SCL do sensor deve ser conectado a entrada analógica A5 do Arduino.
  • O pino SDA do sensor deve ser conectado a entrada analógica A4 do Arduino.

ELABORANDO O CÓDIGO

Após a montagem do circuito, vamos a programação do Sketch. Acompanhe os passos a seguir para melhor compreensão da lógica de programação.

Neste projeto, faremos uso da biblioteca Wire para realizar a comunicação I2C entre o sensor BMP 180 e o Arduino. Usaremos também a biblioteca SFE_BMP180 para leitura do sensor BMP 180, que se encontram disponíveis para download no seguinte link:

Link: Biblioteca SFE_BMP180

Instale a biblioteca SFE_BMP180 por meio do seguinte caminho: Toolbar > Sketch > Incluir biblioteca > Adicionar biblioteca ZIP. Após isto, vamos entender a lógica de programação:

1. Incluir as bibliotecas

Iniciaremos o código incluindo as bibliotecas SFE_BMP180 e Wire por meio das instruções #include <SFE_BMP180.h> e #include <Wire.h>.

2. Criar objeto para leitura do sensor

Em seguida, criaremos o objeto sensor na classe SFE_BMP180 da biblioteca.

3. Declarar as variáveis

Iniciaremos declarando a variável ALTITUDE, por meio da instrução #define ALTITUDE 920. Neste caso, é necessário alterar o valor da variável ALTITUDE para o valor, em metros, da altitude em relação ao nível do mar do seu local de teste. Para obter essa informação é possível pesquisar seu endereço no Google Earth ou What is my elevation?.

Em seguida, vamos declarar a variável status, para verificação do resultado; a variável temperatura, para armazenar o valor da temperatura lida pelo sensor; a variável pressao para armazenar o valor da pressão absoluta coletada pelo sensor; e a variável pressao_relativa para armazenar o valor da pressão relativa ao nível do mar.

4. Iniciar a comunicação serial e o sensor BMP180

Inicializaremos a comunicação serial através da instrução Serial.begin(9600);. A inicialização do sensor ocorre por meio da função sensor.begin(). Para verificar se o sensor foi inicializado com sucesso utilizaremos a lógica if…else.

5. Leitura da temperatura

Iniciaremos o loop realizando a leitura da temperatura. A instrução status = sensor.startTemperature(); inicializa a leitura da temperatura. Se a variável status receber valor diferente de zero, significa que não houve erro na inicialização da leitura. O comando delay(status); realiza um pequeno intervalo para garantir que a leitura seja finalizada.

A instrução status = sensor.getTemperature(temperatura); é utilizada para armazenar o valor lido da temperatura na variável temperatura. Novamente a variável status é testada, por meio da estrutura if…else, para verificar erro de leitura. Sendo status diferente de zero, o valor medido e gravado na variável temperatura será impresso no monitor serial.

6. Leitura da pressão absoluta

A instrução status = sensor.startPressure(3); inicializa a leitura da pressão pelo sensor BMP180. Assim como na leitura da temperatura, verificamos se o valor da variável status foi diferente de zero, com esta condição satisfeita podemos afirmar que não houve erro na inicialização da leitura. Após esta verificação, incluímos um pequeno período de espera com o comando delay(status);.

Em seguida, atribuímos o valor medido de pressão à variável pressao, em função da variável temperatura, por meio da instrução status = sensor.getPressure (pressao, temperatura);. Logo após, faremos mais uma verificação da variável status e, não havendo erro de leitura, imprimimos no monitor serial o valor contido na variável pressao.

7. Leitura da pressão relativa ao nível do mar

A instrução pressao_relativa = sensor.sealevel(pressao, ALTITUDE); será responsável por atribuir o valor medido de pressão relativa à variável pressao_relativa, em função da ALTITUDE. Após isso, imprimiremos na serial o valor contido na variável pressao_relativa.

8. Imprimir o valor da altitude

Para completar nosso barômetro vamos imprimir o valor da altitude (contido na variável ALTITUDE) no monitor serial.

Ao final, o código do projeto proposto ficará da seguinte maneira:

#include <SFE_BMP180.h> //Biblioteca para sensor BMP180
#include <Wire.h> //Biblioteca para comunicação I2C

SFE_BMP180 sensor; //Define objeto sensor na classe SFE_BMP180 da biblioteca
int ALTITUDE = 920; // Altitude da casa da robótica em metros
char status; //Variável auxiliar para verificação do resultado
double temperatura; //variável para armazenar o valor da temperatura
double pressao; //variável para armazenar o valor da pressão absoluta
double pressao_relativa; //variável para armazenar a pressão relativa

void setup() {
  Serial.begin(9600); //Inicializa comunicação serial com velocidade de 9600
  //Inicialização do sensor
  if (sensor.begin()) {
    Serial.println("===========================================================");
    Serial.println("Sensor BMP180 inicializado com sucesso");
  } else {
    Serial.println("Falha na inicializacao do sensor BMP180\n\n");
    while (1);
  }
}

void loop() {

  //Leitura da temperatura
  status = sensor.startTemperature(); //Inicializa a leitura da temperatura
  if (status != 0) //se status for diferente de zero (sem erro de leitura)
  {
    delay(status); //Realiza uma pequena pausa para que a leitura seja finalizada
    status = sensor.getTemperature(temperatura); //Armazena o valor da temperatura na variável temperatura
    if (status != 0) //se status for diferente de zero (sem erro de leitura)
    {
      Serial.print("Temperatura: "); //Imprime "Temperatura: " na serial
      Serial.print(temperatura, 1); //Imprime o valor da variável temperatura com uma casa decimal após a vírgula 
      Serial.println(" graus Celsius "); //Imprime " graus Celsius " na serial

      //Leitura da Pressão Absoluta
      status = sensor.startPressure(3); //Inicializa a leitura
      if (status != 0) //se status for diferente de zero (sem erro de leitura)
      {
        delay(status);//Realiza uma pequena pausa para que a leitura seja finalizada
        status = sensor.getPressure(pressao, temperatura); //Atribui o valor medido de pressão à variável pressao, em função da variável temperatura
        if (status != 0) //se status for diferente de zero (sem erro de leitura)
        {
          //Imprime na serial o valor da Pressão absoluta
          Serial.print("Pressao absoluta: ");
          Serial.print(pressao, 1);
          Serial.println(" hpa ");

          //Leitura da Pressão Relativa
          pressao_relativa = sensor.sealevel(pressao, ALTITUDE); //Atribui o valor medido de pressão relativa à variavel pressao_relativa, em função da ALTITUDE
          Serial.print("Pressao relativa ao nivel do mar: ");
          Serial.print(pressao_relativa, 1); //Imprime na serial o valor da pressão relativa
          Serial.println(" hpa ");

          //Imprimir a Altitude
          Serial.print("Altitude: ");
          Serial.print(ALTITUDE);
          Serial.println(" metros ");
        }
      }
    }
  }
  else Serial.println("Erro na leitura do sensor\n");
    delay(5000);
    Serial.println("===========================================================");
}

Espero ter ajudado,

Obrigada a todos e em caso de dúvidas deixe seu comentário abaixo!

Att. Carol Correia Viana

Dúvidas? Deixe seu comentário

Carol Correia Viana

Bacharel em Engenharia Elétrica com ênfase em Eletrônica, mestra em Engenharia Industrial e especialista em Docência com ênfase em Educação Inclusiva. Atua no setor de Desenvolvimento de Produtos na Casa da Robótica. Editora chefe e articulista no Blog da Robótica. Fanática por livros, Star Wars e projetos Maker.

Deixe uma pergunta

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.