Primeiros Passos com o BMP180

Introdução
Você já viajou de carro para algum lugar mais alto ou mais baixo que sua cidade natal? Você deve ter sentido a pressão em seus ouvidos alterar conforme você estava subindo ou descendo a serra. Isso se deve ao fato que a pressão atmosférica varia conforme a altitude de sua localização aumenta ou diminui. É possível realizar a leitura da pressão que está sendo imposta ao seu corpo através de um barômetro. O sensor BMP180 é capaz de realizar leituras de pressão, como um barômetro, e de temperatura, como um sensor DHT11. O BMP180 utiliza a comunicação I2C para enviar os dados de suas leituras para o Arduino.
Neste tutorial, você vai aprender a realizar leituras das variáveis do sensor barométrico através da comunicação I2C do módulo com a BlackBoard UNO.
Lista de Materiais
Teoria
Oversample
Controladores AVR da Atmel, como o ATmega328 de placas da plataforma Arduino UNO, possuem conversores ADC (Analog to Digital Converter) com uma resolução de 10 bits. Na maioria dos casos, uma resolução de 10 bits é o bastante para obter leituras precisas de sensores, porém, em alguns casos específicos é necessário aumentar a resolução do conversor ADC ou utilizar outro conversor ADC externo. "Oversample and decimation" é o método utilizado para aumentar a resolução do conversor ADC interno dos processadores da Atmel, sem a necessidade de utilizar um conversor externo. Esse método, basicamente, aumenta consideravelmente a frequência de amostragem da porta utilizada para aumentar a resolução do conversor e reduzir possíveis ruídos a leitura. A biblioteca utilizada por este tutorial utiliza comandos de oversampling para adquirir leituras mais precisas e seu parâmetros.
Circuito
Para realizar leituras de pressão e temperatura através do sensor BMP180, monte o circuito a seguir.

Código
Para esse tutorial, é necessário realizar a instalação da biblioteca SFE_BMP180 da Low Power Lab. Caso você não saiba como realizar a instalação da biblioteca, você pode aprender através do tutorial Adicionando Bibliotecas na IDE Arduino. Com a biblioteca adicionada à Arduino IDE, carregue o código a seguir para sua placa.
/*******************************************************************************
* Modulo BMP180 Primeiros Passos (v1.0)
*
* Codigo de exemplo para retornar os valores de temperatura, pressao e altitude
* lidos pelo sensor BMP180 atraves de comunicacao I2C.
*
* Copyright 2019 RoboCore.
* Escrito por Giovanni de Castro (06/06/2019).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version (<https://www.gnu.org/licenses/>).
*******************************************************************************/
//adicao de bibliotecas
#include <SFE_BMP180.h>
#include <Wire.h>
SFE_BMP180 modulo; //declaracao do objeto modulo na classe SFE_BMP180 da biblioteca
const int ALTITUDE = 760; //definicao do valor da altitude
const int TEMPO_ESPERA = 3000; //declaracao da variavel do tempo de espera
//definicao de variaveis
char status;
double temperatura;
double pressao_relativa;
double pressao;
void setup(){
Serial.begin(9600); //inicializacao do monitor serial
//inicializacao do sensor
if(modulo.begin()){
Serial.println("Sucesso na inicializacao do BMP180");
} else {
Serial.println("Falha na inicializacao do BMP180");
while(1);
}
}
void loop (){
status = modulo.startTemperature(); //inicializa a leitura de temperatura
if(status != 0){ //garante que a variavel auxiliar de status e diferente de 0
delay(status); //aguarda a finalizacao da inicializacao
status = modulo.getTemperature(temperatura); //realiza a medicao de temperatura
if(status != 0){ //garante que a variavel auxiliar de status e diferente de 0
//imprime as leituras obtidas
Serial.print("Temperatura: ");
Serial.print(temperatura,2); //imprime a leitura da variavel temperatura com oversample
Serial.println(" °C");
status = modulo.startPressure(3); //inicializa a leitura de pressao com oversample
if(status != 0){ //garante que a variavel auxiliar de status e diferente de 0
delay(status); //aguarda a finalizacao da inicializacao
status = modulo.getPressure(pressao,temperatura); //realiza a medicao de pressao
if(status != 0){ //garante que a variavel auxiliar de status e diferente de 0
//imprime as leituras obtidas
Serial.print("Pressao: ");
Serial.print(pressao,2); //imprime a leitura da variavel pressao com oversample
Serial.println(" mbar");
pressao_relativa = modulo.sealevel(pressao,ALTITUDE); //calcula a pressao relativa
//imprime as leituras obtidas
Serial.print("Pressao relativa ao nivel do mar: ");
Serial.print(pressao_relativa,2); //imprime a variavel prelativa com oversample
Serial.println(" mbar \n");
}
}
}
} else { //caso alguma das leituras nao seja feita
Serial.print("Erro na leitura do sensor"); //imprime erro de leitura
}
delay(TEMPO_ESPERA); //aguarda 3 segundos para novas leitura
}
Para este código, é necessário alterar o valor da variável ALTITUDE
para o valor, em metros, da altitude de seu local de teste do sensor, em relação ao nível do mar. É possível pesquisar o seu endereço atual no Google Earth para obter essa informação.
Entendendo o Código
O comando SFE_BMP180 modulo
inicia o objeto modulo
em função da biblioteca "SFE_BMP180", e esse objeto é utilizado posteriormente para realizar leituras através do sensor e imprimir os valores no monitor serial. Já dentro do laço setup()
, a função modulo.begin()
inicializa o objeto modulo
para ser usado em seguida.
xxxxxxxxxx
status = modulo.startTemperature();
if(status != 0){
delay(status);
status = modulo.getTemperature(temperatura);
if(status != 0){
Serial.print("Temperatura: ");
Serial.print(temperatura,2);
Serial.println(" °C");
}
}
O conjunto de comandos acima é responsável por inicializar a leitura de temperatura (startTemperature()
) e medir o valor de temperatura (getTemperature(temperatura)
). O comando status = modulo.startTemperature()
utiliza a variável auxiliar status
como um resultado para verificação. Essa verificação é feita através da condição if(status != 0)
, que verifica se o valor atribuído à variável é diferente de zero (ou seja, sem erro). O comando delay(status)
realiza uma pequena pausa para garantir que a leitura seja finalizada. Caso a verificação seja feita com sucesso, o valor é medido e gravado na variável temperatura
, que é impressa em seguida no monitor serial.
xxxxxxxxxx
status = modulo.startPressure(3);
if(status != 0){
delay(status);
status = modulo.getPressure(pressao,temperatura);
if(status != 0){
Serial.print("Pressao: ");
Serial.print(pressao,2);
Serial.println(" mbar");
}
}
Assim como o conjunto descrito anteriormente, o conjunto de comandos acima é responsável pela inicialização e medição de pressão do sensor, isso devido às funções startPressure()
e getPressure()
, respectivamente. O conjunto também realiza uma verificação sobre a leitura feita através da variável auxiliar status
. A função getPressure(pressao,temperatura)
atribui o valor medido de pressão à variável pressao
, em função da variável temperatura
.
xxxxxxxxxx
pressao_relativa = pressao.sealevel(pressao,ALTITUDE);
Serial.print("Pressao relativa ao nivel do mar: ");
Serial.print(pressao_relativa,2);
Serial.println(" mbar");
O conjunto de comandos acima é responsável pela conversão para a pressão relativa ao nível do mar, em função das variáveis pressao
e ALTITUDE
, além de imprimir o resultado obtido no monitor serial. A conversão é feita com a função sealevel()
, que utiliza a altitude informada e a pressão lida previamente.
O Que Deve Acontecer
Após carregar o código à placa com o circuito montado e abrir o monitor serial com a velocidade de 9600 bps, é possível observar as leituras retornadas pelo sensor, como na imagem abaixo.
