From 4015b409ac235d0e187c316fb22e1b2ce1b58ab9 Mon Sep 17 00:00:00 2001 From: mcenderdragon Date: Fri, 31 Jul 2026 14:47:48 +0200 Subject: [PATCH 1/3] added test if messurement of BME280Sensor was successfull --- src/modules/Telemetry/Sensor/BME280Sensor.cpp | 46 +++++++++++++++---- 1 file changed, 36 insertions(+), 10 deletions(-) diff --git a/src/modules/Telemetry/Sensor/BME280Sensor.cpp b/src/modules/Telemetry/Sensor/BME280Sensor.cpp index 779b2e603d3..64180b68270 100644 --- a/src/modules/Telemetry/Sensor/BME280Sensor.cpp +++ b/src/modules/Telemetry/Sensor/BME280Sensor.cpp @@ -30,16 +30,42 @@ bool BME280Sensor::initDevice(TwoWire *bus, ScanI2C::FoundDevice *dev) bool BME280Sensor::getMetrics(meshtastic_Telemetry *measurement) { - measurement->variant.environment_metrics.has_temperature = true; - measurement->variant.environment_metrics.has_relative_humidity = true; - measurement->variant.environment_metrics.has_barometric_pressure = true; - LOG_DEBUG("BME280 getMetrics"); - bme280.takeForcedMeasurement(); - measurement->variant.environment_metrics.temperature = bme280.readTemperature(); - measurement->variant.environment_metrics.relative_humidity = bme280.readHumidity(); - measurement->variant.environment_metrics.barometric_pressure = bme280.readPressure() / 100.0F; - + if(bme280.takeForcedMeasurement()) + { + measurement->variant.environment_metrics.temperature = bme280.readTemperature(); + measurement->variant.environment_metrics.relative_humidity = bme280.readHumidity(); + measurement->variant.environment_metrics.barometric_pressure = bme280.readPressure() / 100.0F; + measurement->variant.environment_metrics.has_temperature = true; + measurement->variant.environment_metrics.has_relative_humidity = true; + measurement->variant.environment_metrics.has_barometric_pressure = true; + } + else + { + LOG_WARN("BME280 meassurment failed, attempting reset."); + if(bme280.init()) + { + bme280.setSampling(Adafruit_BME280::MODE_FORCED, + Adafruit_BME280::SAMPLING_X1, // Temp. oversampling + Adafruit_BME280::SAMPLING_X1, // Pressure oversampling + Adafruit_BME280::SAMPLING_X1, // Humidity oversampling + Adafruit_BME280::FILTER_OFF, Adafruit_BME280::STANDBY_MS_1000); + LOG_DEBUG("BME280 reset success, getMetrics"); + if(bme280.takeForcedMeasurement()) + { + measurement->variant.environment_metrics.temperature = bme280.readTemperature(); + measurement->variant.environment_metrics.relative_humidity = bme280.readHumidity(); + measurement->variant.environment_metrics.barometric_pressure = bme280.readPressure() / 100.0F; + measurement->variant.environment_metrics.has_temperature = true; + measurement->variant.environment_metrics.has_relative_humidity = true; + measurement->variant.environment_metrics.has_barometric_pressure = true; + } + else + { + LOG_WARN("BME280 meassurment failed again."); + } + } + } return true; } -#endif \ No newline at end of file +#endif From ed13900fc364969a12de1132a2aed506a1dc1d49 Mon Sep 17 00:00:00 2001 From: MCenderdragon Date: Sun, 2 Aug 2026 20:40:44 +0200 Subject: [PATCH 2/3] added Timeout to I2c --- src/modules/Telemetry/Sensor/BME280Sensor.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/modules/Telemetry/Sensor/BME280Sensor.cpp b/src/modules/Telemetry/Sensor/BME280Sensor.cpp index 64180b68270..a45b33cbddf 100644 --- a/src/modules/Telemetry/Sensor/BME280Sensor.cpp +++ b/src/modules/Telemetry/Sensor/BME280Sensor.cpp @@ -12,6 +12,7 @@ BME280Sensor::BME280Sensor() : TelemetrySensor(meshtastic_TelemetrySensorType_BM bool BME280Sensor::initDevice(TwoWire *bus, ScanI2C::FoundDevice *dev) { + bus->setTimeout(50); LOG_INFO("Init sensor: %s", sensorName); status = bme280.begin(dev->address.address, bus); if (!status) { From f3ee4612f14be8702bcbf81614045c2c6112cde9 Mon Sep 17 00:00:00 2001 From: MCenderdragon Date: Sun, 2 Aug 2026 21:43:35 +0200 Subject: [PATCH 3/3] extracted duplcaietd codei into extra calls & fixed spelling. --- src/modules/Telemetry/Sensor/BME280Sensor.cpp | 57 +++++++++++-------- 1 file changed, 32 insertions(+), 25 deletions(-) diff --git a/src/modules/Telemetry/Sensor/BME280Sensor.cpp b/src/modules/Telemetry/Sensor/BME280Sensor.cpp index a45b33cbddf..b96e23b236e 100644 --- a/src/modules/Telemetry/Sensor/BME280Sensor.cpp +++ b/src/modules/Telemetry/Sensor/BME280Sensor.cpp @@ -10,6 +10,15 @@ BME280Sensor::BME280Sensor() : TelemetrySensor(meshtastic_TelemetrySensorType_BME280, "BME280") {} +static void setSensorConfigs(Adafruit_BME280 *bme280) +{ + bme280->setSampling(Adafruit_BME280::MODE_FORCED, + Adafruit_BME280::SAMPLING_X1, // Temp. oversampling + Adafruit_BME280::SAMPLING_X1, // Pressure oversampling + Adafruit_BME280::SAMPLING_X1, // Humidity oversampling + Adafruit_BME280::FILTER_OFF, Adafruit_BME280::STANDBY_MS_1000); +} + bool BME280Sensor::initDevice(TwoWire *bus, ScanI2C::FoundDevice *dev) { bus->setTimeout(50); @@ -19,54 +28,52 @@ bool BME280Sensor::initDevice(TwoWire *bus, ScanI2C::FoundDevice *dev) return status; } - bme280.setSampling(Adafruit_BME280::MODE_FORCED, - Adafruit_BME280::SAMPLING_X1, // Temp. oversampling - Adafruit_BME280::SAMPLING_X1, // Pressure oversampling - Adafruit_BME280::SAMPLING_X1, // Humidity oversampling - Adafruit_BME280::FILTER_OFF, Adafruit_BME280::STANDBY_MS_1000); + setSensorConfigs(&bme280); initI2CSensor(); return status; } +static void getSensorData(meshtastic_Telemetry *measurement, Adafruit_BME280 *bme280) +{ + measurement->variant.environment_metrics.temperature = bme280->readTemperature(); + measurement->variant.environment_metrics.relative_humidity = bme280->readHumidity(); + measurement->variant.environment_metrics.barometric_pressure = bme280->readPressure() / 100.0F; + measurement->variant.environment_metrics.has_temperature = true; + measurement->variant.environment_metrics.has_relative_humidity = true; + measurement->variant.environment_metrics.has_barometric_pressure = true; +} + bool BME280Sensor::getMetrics(meshtastic_Telemetry *measurement) { LOG_DEBUG("BME280 getMetrics"); if(bme280.takeForcedMeasurement()) { - measurement->variant.environment_metrics.temperature = bme280.readTemperature(); - measurement->variant.environment_metrics.relative_humidity = bme280.readHumidity(); - measurement->variant.environment_metrics.barometric_pressure = bme280.readPressure() / 100.0F; - measurement->variant.environment_metrics.has_temperature = true; - measurement->variant.environment_metrics.has_relative_humidity = true; - measurement->variant.environment_metrics.has_barometric_pressure = true; + getSensorData(measurement, &bme280); + return true; } else { - LOG_WARN("BME280 meassurment failed, attempting reset."); + LOG_WARN("BME280 measurement failed, attempting reset."); if(bme280.init()) { - bme280.setSampling(Adafruit_BME280::MODE_FORCED, - Adafruit_BME280::SAMPLING_X1, // Temp. oversampling - Adafruit_BME280::SAMPLING_X1, // Pressure oversampling - Adafruit_BME280::SAMPLING_X1, // Humidity oversampling - Adafruit_BME280::FILTER_OFF, Adafruit_BME280::STANDBY_MS_1000); + setSensorConfigs(&bme280); LOG_DEBUG("BME280 reset success, getMetrics"); if(bme280.takeForcedMeasurement()) { - measurement->variant.environment_metrics.temperature = bme280.readTemperature(); - measurement->variant.environment_metrics.relative_humidity = bme280.readHumidity(); - measurement->variant.environment_metrics.barometric_pressure = bme280.readPressure() / 100.0F; - measurement->variant.environment_metrics.has_temperature = true; - measurement->variant.environment_metrics.has_relative_humidity = true; - measurement->variant.environment_metrics.has_barometric_pressure = true; + getSensorData(measurement, &bme280); + return true; } else { - LOG_WARN("BME280 meassurment failed again."); + LOG_WARN("BME280 measurement failed again."); } } + else + { + LOG_WARN("BME280 reset/reinit failed."); + } } - return true; + return false; } #endif