diff --git a/src/helpers/sensors/BME280Sensor.h b/src/helpers/sensors/BME280Sensor.h new file mode 100644 index 00000000..1226fce5 --- /dev/null +++ b/src/helpers/sensors/BME280Sensor.h @@ -0,0 +1,55 @@ +#pragma once +#include +#include + +#define TELEM_BME280_ADDRESS 0x76 // BME280 environmental sensor I2C address +#define SEALEVELPRESSURE_HPA (1013.25) // Athmospheric pressure at sea level + +static Adafruit_BME280 BME280; + +class BME280Sensor { + bool initialized = false; +public: + void begin() { + if (BME280.begin(TELEM_BME280_ADDRESS, &Wire)) { + MESH_DEBUG_PRINTLN("Found BME280 at address: %02X", TELEM_BME280_ADDRESS); + MESH_DEBUG_PRINTLN("BME sensor ID: %02X", BME280.sensorID); + initialized = true; + } else { + initialized = false; + MESH_DEBUG_PRINTLN("BME280 was not found at I2C address %02X", TELEM_BME280_ADDRESS); + } + } + + bool isInitialized() const { return initialized; }; + + float getRelativeHumidity() const { + if (initialized) { + return BME280.readHumidity();; + } + } + + float getTemperature() const { + if (initialized) { + return BME280.readTemperature();; + } + } + + float getBarometricPressure() const { + if (initialized) { + return BME280.readPressure(); + } + } + + float getAltitude() const { + if (initialized) { + return BME280.readAltitude(SEALEVELPRESSURE_HPA); + } + } + + void setTemperatureCompensation(float delta) { + if (initialized) { + BME280.setTemperatureCompensation(delta); + } + } +}; diff --git a/src/helpers/sensors/EnvironmentSensorManager.cpp b/src/helpers/sensors/EnvironmentSensorManager.cpp index b0497471..cf931470 100644 --- a/src/helpers/sensors/EnvironmentSensorManager.cpp +++ b/src/helpers/sensors/EnvironmentSensorManager.cpp @@ -4,6 +4,7 @@ bool EnvironmentSensorManager::begin() { INA3221_sensor.begin(); INA219_sensor.begin(); AHTX0_sensor.begin(); + BME280_sensor.begin(); return true; } @@ -32,6 +33,12 @@ bool EnvironmentSensorManager::querySensors(uint8_t requester_permissions, Cayen telemetry.addTemperature(TELEM_CHANNEL_SELF, AHTX0_sensor.getTemperature()); telemetry.addRelativeHumidity(TELEM_CHANNEL_SELF, AHTX0_sensor.getRelativeHumidity()); } + if (BME280_sensor.isInitialized()) { + telemetry.addTemperature(TELEM_CHANNEL_SELF, BME280_sensor.getTemperature()); + telemetry.addRelativeHumidity(TELEM_CHANNEL_SELF, BME280_sensor.getRelativeHumidity()); + telemetry.addBarometricPressure(TELEM_CHANNEL_SELF, BME280_sensor.getBarometricPressure()); + telemetry.addAltitude(TELEM_CHANNEL_SELF, BME280_sensor.getAltitude()); + } } return true; diff --git a/src/helpers/sensors/EnvironmentSensorManager.h b/src/helpers/sensors/EnvironmentSensorManager.h index 95a7476b..6d02f9fc 100644 --- a/src/helpers/sensors/EnvironmentSensorManager.h +++ b/src/helpers/sensors/EnvironmentSensorManager.h @@ -4,6 +4,7 @@ #include "INA3221Sensor.h" #include "INA219Sensor.h" #include "AHTX0Sensor.h" +#include "BME280Sensor.h" #define NUM_SENSOR_SETTINGS 3 #define TELEM_INA3221_SETTING_CH1 "INA3221-1" @@ -19,6 +20,7 @@ protected: INA3221Sensor INA3221_sensor; AHTX0Sensor AHTX0_sensor; INA219Sensor INA219_sensor; + BME280Sensor BME280_sensor; public: EnvironmentSensorManager(){}; bool begin() override; diff --git a/variants/promicro/platformio.ini b/variants/promicro/platformio.ini index 8cabf6e6..7b6771e0 100644 --- a/variants/promicro/platformio.ini +++ b/variants/promicro/platformio.ini @@ -22,6 +22,7 @@ lib_deps= ${nrf52840_base.lib_deps} robtillaart/INA3221 @ ^0.4.1 robtillaart/INA219 @ ^0.4.1 adafruit/Adafruit AHTX0@^2.0.5 + adafruit/Adafruit BME280 Library@^2.3.0 [env:Faketec_Repeater] extends = Faketec