O sensor de pressão e temperatura BMP280 é o sucessor dos sensores BMP085 e BMP180, com excelentes ganhos em termos de precisão e reduzido consumo de energia, mantendo o baixo custo.
O BMP280 realiza medições de pressão com precisão de ±1 hPa e temperatura com precisão de ±1 °C. Com essa precisão, é possível realizar medições de altitude com margem de erro de ±1 metro.
Neste post vamos mostrar isso usando o sensor para exibir os valores de temperatura, pressão e altitude em um display OLED.
O hardware do módulo BMP280
O antigo sensor BMP180 foi redesenhado pela Bosch, resultando no BMP280 (datasheet) com um tamanho significativamente menor. Isso traz excelentes ganhos em termos de consumo de energia tornando-o ideal para projetos operados por baterias por longos períodos, como por exemplo drones e estações meteorológicas.
Com relação à medição de pressão, o BMP280 efetua a leitura entre 300 e 1100hPa, o que corresponde à faixa de altitude de +9000 à -500 m.
Na imagem abaixo mostramos a pinagem do módulo BMP280, que funciona com interfaces SPI e I2C.
Temos os pinos de alimentação (Vcc (3.3V) e GND), e os pinos de interface SPI: SCL(Clock) e SDA (Data), CSB (Chip Select) e SDO (Serial Data OUT).
Para conectar o módulo usando a interface I2C, usamos os mesmos pinos SCL e SDA que já estamos acostumados a ver em outros projetos. O pino SDO é usado para seleção do endereço I2C: 0x76 com o pino em estado baixo (LOW), e 0x77 para o estado alto (HIGH).
Usando o BMP280 com Arduino Uno
No nosso circuito de testes vamos usar um Arduino Uno com o BMP280 e um display OLED compartilhando o barramento I2C. Isso libera os demais pinos do Arduino Uno para outros sensores, o que é muito útil por exemplo se quisermos montar uma estação meteorológica com sensor de umidade, sensor UV, anemômetro, etc.
Neste exemplo vamos usar o endereço 0x77 da interface I2C, mantendo o pino SDO em nível alto (HIGH). Fazemos isso conectando o SDO ao pino 3.3V, que é o mesmo usado para alimentação do módulo. Os pinos SCL e SDA estão conectados aos pinos analógicos A4 e A5 do Arduino.
Instalação das bibliotecas
Para o programa de teste vamos usar as bibliotecas Adafruit Unified Sensor, Adafruit BMP280 e U8GLIB. A instalação pode ser feita por meio do Gerenciador de Bibliotecas da IDE do Arduino (estamos usando a IDE versão 1.8.1).
Primeiramente, acesse o menu Sketch, depois Incluir Biblioteca e finalmente Gerenciar Bibliotecas:
Dentro do Gerenciador de Biblioteca, digite na caixa do lado direito “Adafruit BMP280“. A biblioteca da Adafruit será exibida logo abaixo, bastando que você clique em Instalar para que seja incluída na IDE:
Faça o mesmo procedimento para a próxima biblioteca, digitando “Unified Sensor based libraries” na caixa de seleção:
E por último, repita o procedimento para a biblioteca U8GLIB. Finalizada a instalação, podemos carregar o nosso programa de teste.
Dúvidas na instalação da biblioteca? Confira o post Como instalar uma biblioteca na IDE Arduino.
Programa BMP280 e Arduino
O programa usa as três bibliotecas adicionadas anteriormente, sendo que a U8Glib é a responsável pelos comandos do display gráficos, e as duas bibliotecas da Adafruit ficam encarregadas da comunicação com o sensor BMP280:
//Programa: Temperatura, Pressao e Altitude com BMP280 //Autor: Arduino e Cia #include <Wire.h> #include <U8glib.h> #include <Adafruit_Sensor.h> #include <Adafruit_BMP280.h> Adafruit_BMP280 sensor_bmp; //Definicoes do display Oled U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_FAST); void draw() { //Comandos graficos para o display devem ser colocados aqui u8g.setFont(u8g_font_8x13B); u8g.drawRFrame(0, 16, 128, 48, 4); u8g.drawRFrame(0, 0, 128, 16, 4); u8g.drawStr(40, 13, "BMP280"); //Mostra a temperatura u8g.drawStr(10, 31, "Temp: C"); u8g.drawCircle(93, 22, 2); //Grau u8g.setPrintPos(55, 31); u8g.print(sensor_bmp.readTemperature(), 1); //Mostra a pressao (em hPa) u8g.drawStr(10, 45, "Pres:"); u8g.setPrintPos(55, 45); u8g.print(sensor_bmp.readPressure(), 1); //Mostra a altitude u8g.drawStr(10, 59, "Alt : m"); u8g.setPrintPos(55, 59); u8g.print(sensor_bmp.readAltitude(1013.25)); } void setup() { Serial.begin(9600); Serial.println("Teste modulo BMP280"); //Verifica a conexão do sensor BMP280 if (!sensor_bmp.begin()) { Serial.println("Sensor não encontrado. Verifique as conexoes!"); while (1); } //Display Oled if ( u8g.getMode() == U8G_MODE_R3G3B2 ) { u8g.setColorIndex(255); // white } else if ( u8g.getMode() == U8G_MODE_GRAY2BIT ) { u8g.setColorIndex(3); // max intensity } else if ( u8g.getMode() == U8G_MODE_BW ) { u8g.setColorIndex(1); // pixel on } else if ( u8g.getMode() == U8G_MODE_HICOLOR ) { u8g.setHiColorByRGB(255, 255, 255); } } void loop() { //Chama a rotina de desenho na tela u8g.firstPage(); do { draw(); } while ( u8g.nextPage() ); delay(10000); }
Após o carregamento do programa, as informações de temperatura, pressão e altitude medidas pelo módulo serão exibidas no display Oled, conforme mostra a imagem do início deste post.
Gostou? Confira outros posts com sensores aqui mesmo no Arduino e Cia!