#include <Wire.h>
#define BME280_ADDRESS 0x76
#define SEA_LEVEL_PRESSURE 1013.25 // Pressão atmosférica ao nível do mar em hPa
float temperature_celsius, pressure_hpa, humidity_percent, altitude;
bool bmeInitialized = false;
// FUNÇÕES
bool testConnection(uint8_t address) {
Wire.beginTransmission(address);
return (Wire.endTransmission());
}
//
void bmeBegin() {
Wire.beginTransmission(BME280_ADDRESS);
Wire.write(0xF2); // Registro de controle de umidade
Wire.write(0x01); // Configurar para oversampling de x1
Wire.endTransmission();
Wire.beginTransmission(BME280_ADDRESS);
Wire.write(0xF4); // Registro de controle de temperatura e pressão
Wire.write(0x27); // Configurar para oversampling de x1, modo normal
Wire.endTransmission();
//
bmeInitialized = true;
}
void setup() {
Wire.begin();
Serial.begin(9600);
// Verificar se o sensor BME280 está respondendo
if (!testConnection(BME280_ADDRESS)) {
bmeBegin(); // Configurar o sensor BME280
} else {
Serial.println("Sensor BME280 não encontrado!");
bmeInitialized = false;
}
}
void loop() {
if (!bmeInitialized) {
if (!testConnection(BME280_ADDRESS)) {
bmeBegin(); // Configurar o sensor BME280
}
} else {
// Verificar se o sensor BME280 está respondendo
Wire.beginTransmission(BME280_ADDRESS);
Wire.write(0xF7); // Registro de dados de pressão
if (Wire.endTransmission() == 0) {
Wire.requestFrom(BME280_ADDRESS, 8); // Ler 8 bytes de dados
// Ler e converter os dados para valores reais
temperature_celsius = ((Wire.read() << 12) | (Wire.read() << 4) | (Wire.read() >> 4)) / 100.0;
pressure_hpa = ((Wire.read() << 12) | (Wire.read() << 4) | (Wire.read() >> 4)) / 256.0;
humidity_percent = ((Wire.read() << 8) | Wire.read()) / 1024.0;
// Calcular a altitude
altitude = 44330.0 * (1.0 - pow(pressure_hpa / SEA_LEVEL_PRESSURE, 0.1903));
// Imprimir os dados
Serial.print("Temp: ");
Serial.print(temperature_celsius);
Serial.print(" °C");
Serial.print("\tPress: ");
Serial.print(pressure_hpa);
Serial.print(" hPa");
Serial.print("\tUmid: ");
Serial.print(humidity_percent);
Serial.print(" %");
Serial.print("\tAltit: ");
Serial.print(altitude);
Serial.println(" m");
} else {
temperature_celsius = 0; pressure_hpa = 0; humidity_percent = 0; altitude = 0;
Serial.println("Temp: x °C\tPress: x hpa\tUmid: x %\tAltit x m");
}
}
// Outras atividades do código...
delay(500);
}