Medição Precisa de Temperatura, Pressão e Altitude com BMP280 e Arduino UNO
Componentes e Materiais
- Arduino UNO – 1 unidade
- Adafruit BMP280 – 1 unidade
- Adafruit OLED 128x32 I2C – 1 unidade
Sobre o Projeto
Neste tutorial, utilizamos o sensor BMP280 para medir temperatura, pressão atmosférica e altitude, com o auxílio de um Arduino UNO e um display OLED. O BMP280 é um sensor de alta precisão que opera via interface I²C. Abaixo, alguns parâmetros-chave do datasheet:

O projeto exibe as medições nos sistemas métrico e imperial. Os componentes são conectados conforme mostrado nas imagens:



Teste e Solução de Problemas
Após a ligação, recomenda-se testar o código de exemplo da biblioteca (BMP280test). Se o módulo não for detectado:

Execute um scanner I²C (desconecte outros dispositivos I²C como LCD ou OLED). Se o módulo estiver funcional, o scanner mostrará o endereço:

Anote o endereço e edite o arquivo .cpp da biblioteca (geralmente em Documentos/Arduino/Libraries). Abra com um editor adequado (ex.: Dev-C++):


Na linha 41, altere o endereço I²C padrão (0x77) para o encontrado (ex.: 0x76):

Salve e execute o teste novamente:

Fotos do Teste


Espero que funcione para você. Deixe comentários se tiver dúvidas.
Código
Quatro versões disponíveis:
bmp280_Serial_metric.ino– Saída serial em unidades métricasbmp280_Serial_Imperial.ino– Saída serial em unidades imperiaisbmp280_OLED_m.ino– Exibição no OLED em métricobmp280_OLED_US.ino– Exibição no OLED em imperial
bmp280_Serial_metric.ino
/* Este código é para uso com Adafruit BMP280 (Métrico)
* Mede temperatura e pressão e exibe no monitor serial com altitude
* Versão modificada do exemplo da Adafruit
* Consulte www.surtrtech.com ou canal SurtrTech no YouTube */
#include <Adafruit_BMP280.h>
Adafruit_BMP280 bmp; // Interface I2C
void setup() {
Serial.begin(9600);
Serial.println(F("BMP280 test"));
if (!bmp.begin()) {
Serial.println(F("Não foi possível encontrar um sensor BMP280 válido, verifique a fiação!"));
while (1);
}
/* Configurações padrão do datasheet. */
bmp.setSampling(Adafruit_BMP280::MODE_NORMAL, /* Modo de operação. */
Adafruit_BMP280::SAMPLING_X2, /* Sobreamostragem de temperatura. */
Adafruit_BMP280::SAMPLING_X16, /* Sobreamostragem de pressão. */
Adafruit_BMP280::FILTER_X16, /* Filtragem. */
Adafruit_BMP280::STANDBY_MS_500); /* Tempo de espera. */
}
void loop() {
Serial.print(F("Temperatura = "));
Serial.print(bmp.readTemperature());
Serial.println(" *C");
Serial.print(F("Pressão = "));
Serial.print(bmp.readPressure()/100); // Pressão em hPa
Serial.println(" hPa");
Serial.print(F("Altitude aprox. = "));
Serial.print(bmp.readAltitude(1019.66)); // Pressão ao nível do mar (hPa) na sua região
Serial.println(" m");
Serial.println();
delay(2000);
}
bmp280_Serial_Imperial.ino
/* Este código é para uso com Adafruit BMP280 (Imperial)
* Mede temperatura e pressão e exibe no monitor serial com altitude
* Versão modificada do exemplo da Adafruit
* Consulte www.surtrtech.com ou canal SurtrTech no YouTube */
#include <Adafruit_BMP280.h>
Adafruit_BMP280 bmp; // I2C
void setup() {
Serial.begin(9600);
Serial.println(F("BMP280 test"));
if (!bmp.begin()) {
Serial.println(F("Não foi possível encontrar um sensor BMP280 válido, verifique a fiação!"));
while (1);
}
/* Configurações padrão do datasheet. */
bmp.setSampling(Adafruit_BMP280::MODE_NORMAL,
Adafruit_BMP280::SAMPLING_X2,
Adafruit_BMP280::SAMPLING_X16,
Adafruit_BMP280::FILTER_X16,
Adafruit_BMP280::STANDBY_MS_500);
}
void loop() {
float f = bmp.readTemperature()*9/5 + 32; // Conversão para Fahrenheit
Serial.print(F("Temperatura = "));
Serial.print(f);
Serial.println(" *F");
float P = bmp.readPressure()/3386.39; // Pressão em polegadas de mercúrio
Serial.print(F("Pressão = "));
Serial.print(P);
Serial.println(" inHg");
float A = bmp.readAltitude(1019.66)*3.28084; // Altitude em pés
Serial.print(F("Altitude aprox. = "));
Serial.print(A);
Serial.println(" ft");
Serial.println();
delay(2000);
}
bmp280_OLED_m.ino
/* Este código é para uso com Adafruit BMP280 e tela OLED (Métrico)
* Mede temperatura e pressão e exibe no display OLED com altitude
* Versão modificada do exemplo da Adafruit
* Consulte www.surtrtech.com ou canal SurtrTech no YouTube */
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Adafruit_BMP280.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 32
#define OLED_RESET -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
Adafruit_BMP280 bmp;
void setup() {
bmp.begin();
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.clearDisplay();
display.display();
display.setTextColor(WHITE);
display.setTextSize(1);
display.print("SurtrTech");
display.setCursor(32,12);
display.setTextSize(2);
display.println("BMP280");
display.display();
delay(2000);
}
void loop() {
display.clearDisplay();
float T = bmp.readTemperature();
float P = bmp.readPressure()/100;
float A = bmp.readAltitude(1019.66);
display.setCursor(0,0);
display.setTextColor(WHITE);
display.setTextSize(2);
display.print("Temp");
display.setCursor(0,18);
display.print(T,1);
display.setCursor(50,17);
display.setTextSize(1);
display.print("C");
display.setTextSize(1);
display.setCursor(65,0);
display.print("Pres");
display.setCursor(65,10);
display.print(P);
display.setCursor(110,10);
display.print("hPa");
display.setCursor(65,25);
display.print("Alt");
display.setCursor(90,25);
display.print(A,0);
display.setCursor(110,25);
display.print("m");
display.display();
delay(2000);
}
bmp280_OLED_US.ino
/* Este código é para uso com Adafruit BMP280 e tela OLED (Imperial)
* Mede temperatura e pressão e exibe no display OLED com altitude
* Versão modificada do exemplo da Adafruit
* Consulte www.surtrtech.com ou canal SurtrTech no YouTube */
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Adafruit_BMP280.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 32
#define OLED_RESET -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
Adafruit_BMP280 bmp;
void setup() {
bmp.begin();
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.clearDisplay();
display.display();
display.setTextColor(WHITE);
display.setTextSize(1);
display.print("SurtrTech");
display.setCursor(32,12);
display.setTextSize(2);
display.println("BMP280");
display.display();
delay(2000);
}
void loop() {
display.clearDisplay();
float T = bmp.readTemperature()*9/5 + 32;
float P = bmp.readPressure()/3386.39;
float A = bmp.readAltitude(1019.66)*3.28084;
display.setCursor(0,0);
display.setTextColor(WHITE);
display.setTextSize(2);
display.print("Temp");
display.setCursor(0,18);
display.print(T,1);
display.setCursor(50,17);
display.setTextSize(1);
display.print("F");
display.setTextSize(1);
display.setCursor(65,0);
display.print("Pres");
display.setCursor(65,10);
display.print(P);
display.setCursor(100,10);
display.print("inHg");
display.setCursor(65,25);
display.print("Alt");
display.setCursor(90,25);
display.print(A,0);
display.setCursor(110,25);
display.print("ft");
display.display();
delay(2000);
}
Bibliotecas Necessárias
Esquemático
Ambos os módulos utilizam interface I²C: SDA/SCL ligados aos pinos A4 e A5 do Arduino. O BMP280 é alimentado por 5V, enquanto o OLED utiliza 3.3V.

Processo de manufatura
- Sistema Integrado de Controle de Acesso com QR, RFID e Verificação de Temperatura
- Conecte Múltiplos Sensores DS18B20 1-Wire ao Raspberry Pi para Monitoramento Preciso de Temperatura
- Construa um Sensor de Temperatura Remoto com Raspberry Pi e Python – Guia Passo a Passo
- Monitoramento Contínuo de Temperatura e Umidade no Raspberry Pi com EzTemp
- Controle de Temperatura Caseiro para Homebrew: Monitore e Regule com Arduino
- Raspberry Pi BMP085: Leituras Precisas de Temperatura e Pressão via I2C
- Medição e Registro Precisos de Termopar para Laboratório e Experimentos Científicos
- Construa um Sistema de Monitoramento de Temperatura e Luz Multi-Sensor com Raspberry Pi e DS18B20
- Dispositivo de Precisão para Medição de Pressão e Fluxo de Ar com Sensor Analógico
- Registrador de Temperatura e Umidade com Arduino, DHT11 e Ethernet Shield