From b51be320dd4c9e1a8d768e85d1bc7df1b25e195a Mon Sep 17 00:00:00 2001 From: Ben Meadors Date: Tue, 25 Jan 2022 14:22:48 -0600 Subject: [PATCH] BME680 support (#1142) --- platformio.ini | 3 +- proto | 2 +- src/mesh/generated/mesh.pb.h | 7 +-- .../EnvironmentalMeasurementPlugin.cpp | 43 ++++++++++++++----- src/plugins/EnvironmentalMeasurementPlugin.h | 4 +- 5 files changed, 43 insertions(+), 16 deletions(-) diff --git a/platformio.ini b/platformio.ini index 64ccca36c..922f2bfcd 100644 --- a/platformio.ini +++ b/platformio.ini @@ -115,7 +115,8 @@ lib_deps = paulstoffregen/OneWire@^2.3.5 robtillaart/DS18B20@^0.1.11 adafruit/Adafruit BME280 Library@^2.2.2 - + adafruit/Adafruit BME680 Library@^2.0.1 + ; Common settings for ESP targes, mixin with extends = esp32_base [esp32_base] extends = arduino_base diff --git a/proto b/proto index 6c39b5bf4..b47cadbc3 160000 --- a/proto +++ b/proto @@ -1 +1 @@ -Subproject commit 6c39b5bf472677122b3ebf77b434af09038ff0dc +Subproject commit b47cadbc372c03936c3d03cb134874426dad6d11 diff --git a/src/mesh/generated/mesh.pb.h b/src/mesh/generated/mesh.pb.h index 39f49a80b..246cfd823 100644 --- a/src/mesh/generated/mesh.pb.h +++ b/src/mesh/generated/mesh.pb.h @@ -31,7 +31,8 @@ typedef enum _HardwareModel { HardwareModel_NRF52_UNKNOWN = 36, HardwareModel_PORTDUINO = 37, HardwareModel_ANDROID_SIM = 38, - HardwareModel_DIY_V1 = 39 + HardwareModel_DIY_V1 = 39, + HardwareModel_RAK11200 = 40 } HardwareModel; typedef enum _Team { @@ -285,8 +286,8 @@ typedef struct _ToRadio { /* Helper constants for enums */ #define _HardwareModel_MIN HardwareModel_UNSET -#define _HardwareModel_MAX HardwareModel_DIY_V1 -#define _HardwareModel_ARRAYSIZE ((HardwareModel)(HardwareModel_DIY_V1+1)) +#define _HardwareModel_MAX HardwareModel_RAK11200 +#define _HardwareModel_ARRAYSIZE ((HardwareModel)(HardwareModel_RAK11200+1)) #define _Team_MIN Team_CLEAR #define _Team_MAX Team_BROWN diff --git a/src/plugins/EnvironmentalMeasurementPlugin.cpp b/src/plugins/EnvironmentalMeasurementPlugin.cpp index 24ec1c586..377241c48 100644 --- a/src/plugins/EnvironmentalMeasurementPlugin.cpp +++ b/src/plugins/EnvironmentalMeasurementPlugin.cpp @@ -13,11 +13,12 @@ #include #include #include +#include #define DEFAULT_SENSOR_MINIMUM_WAIT_TIME_BETWEEN_READS 1000 #define DHT_SENSOR_MINIMUM_WAIT_TIME_BETWEEN_READS 1000 #define DS18B20_SENSOR_MINIMUM_WAIT_TIME_BETWEEN_READS 1000 -#define BME280_SENSOR_MINIMUM_WAIT_TIME_BETWEEN_READS 1000 +#define BME_SENSOR_MINIMUM_WAIT_TIME_BETWEEN_READS 1000 #define FAILED_STATE_SENSOR_READ_MULTIPLIER 10 #define DISPLAY_RECEIVEID_MEASUREMENTS_ON_SCREEN true @@ -100,16 +101,33 @@ int32_t EnvironmentalMeasurementPlugin::runOnce() radioConfig.preferences.environmental_measurement_plugin_sensor_pin); return (DHT_SENSOR_MINIMUM_WAIT_TIME_BETWEEN_READS); case RadioConfig_UserPreferences_EnvironmentalMeasurementSensorType_BME280: - unsigned bmeStatus; + unsigned bme280Status; // Default i2c address for BME280 - bmeStatus = bme.begin(0x76); - if (!bmeStatus) { + bme280Status = bme280.begin(0x76); + if (!bme280Status) { DEBUG_MSG("Could not find a valid BME280 sensor, check wiring, address, sensor ID!"); // TODO more verbose diagnostics } else { DEBUG_MSG("EnvironmentalMeasurement: Opened BME280 on default i2c bus"); } - return (BME280_SENSOR_MINIMUM_WAIT_TIME_BETWEEN_READS); + return (BME_SENSOR_MINIMUM_WAIT_TIME_BETWEEN_READS); + case RadioConfig_UserPreferences_EnvironmentalMeasurementSensorType_BME680: + unsigned bme680Status; + // Default i2c address for BME280 + bme680Status = bme680.begin(0x76); + if (!bme680Status) { + DEBUG_MSG("Could not find a valid BME680 sensor, check wiring, address, sensor ID!"); + // TODO more verbose diagnostics + } else { + DEBUG_MSG("EnvironmentalMeasurement: Opened BME680 on default i2c bus"); + // Set up oversampling and filter initialization + bme680.setTemperatureOversampling(BME680_OS_8X); + bme680.setHumidityOversampling(BME680_OS_2X); + bme680.setPressureOversampling(BME680_OS_4X); + bme680.setIIRFilterSize(BME680_FILTER_SIZE_3); + bme680.setGasHeater(320, 150); // 320*C for 150 ms + } + return (BME_SENSOR_MINIMUM_WAIT_TIME_BETWEEN_READS); default: DEBUG_MSG("EnvironmentalMeasurement: Invalid sensor type selected; Disabling plugin"); return (INT32_MAX); @@ -161,7 +179,8 @@ int32_t EnvironmentalMeasurementPlugin::runOnce() case RadioConfig_UserPreferences_EnvironmentalMeasurementSensorType_DHT22: return (DHT_SENSOR_MINIMUM_WAIT_TIME_BETWEEN_READS); case RadioConfig_UserPreferences_EnvironmentalMeasurementSensorType_BME280: - return (BME280_SENSOR_MINIMUM_WAIT_TIME_BETWEEN_READS); + case RadioConfig_UserPreferences_EnvironmentalMeasurementSensorType_BME680: + return (BME_SENSOR_MINIMUM_WAIT_TIME_BETWEEN_READS); default: return (DEFAULT_SENSOR_MINIMUM_WAIT_TIME_BETWEEN_READS); } @@ -307,10 +326,14 @@ bool EnvironmentalMeasurementPlugin::sendOurEnvironmentalMeasurement(NodeNum des m.temperature = this->dht->readTemperature(); break; case RadioConfig_UserPreferences_EnvironmentalMeasurementSensorType_BME280: - m.temperature = bme.readTemperature(); - m.relative_humidity = bme.readHumidity(); - // TODO Work out standard units for pressure. This is in hPa from the Adafruit example - m.barometric_pressure = bme.readPressure() / 100.0F; + m.temperature = bme280.readTemperature(); + m.relative_humidity = bme280.readHumidity(); + m.barometric_pressure = bme280.readPressure() / 100.0F; + break; + case RadioConfig_UserPreferences_EnvironmentalMeasurementSensorType_BME680: + m.temperature = bme680.readTemperature(); + m.relative_humidity = bme680.readHumidity(); + m.barometric_pressure = bme680.readPressure() / 100.0F; break; default: DEBUG_MSG("EnvironmentalMeasurement: Invalid sensor type selected; Disabling plugin"); diff --git a/src/plugins/EnvironmentalMeasurementPlugin.h b/src/plugins/EnvironmentalMeasurementPlugin.h index 79f844e89..511012c07 100644 --- a/src/plugins/EnvironmentalMeasurementPlugin.h +++ b/src/plugins/EnvironmentalMeasurementPlugin.h @@ -8,6 +8,7 @@ #include #include #include +#include class EnvironmentalMeasurementPlugin : private concurrency::OSThread, public ProtobufPlugin { @@ -38,7 +39,8 @@ class EnvironmentalMeasurementPlugin : private concurrency::OSThread, public Pro DHT *dht = NULL; OneWire *oneWire = NULL; DS18B20 *ds18b20 = NULL; - Adafruit_BME280 bme; + Adafruit_BME280 bme280; + Adafruit_BME680 bme680; const MeshPacket *lastMeasurementPacket; uint32_t sensor_read_error_count = 0; };