From 9530744ff4073c641cbe12ea11d86098f59294c6 Mon Sep 17 00:00:00 2001 From: recrof Date: Sun, 29 Jun 2025 00:17:46 +0200 Subject: [PATCH] add support for BMP280 temperature+pressure sensor --- .../sensors/EnvironmentSensorManager.cpp | 41 ++++++++++++++++--- .../sensors/EnvironmentSensorManager.h | 5 ++- variants/heltec_v3/platformio.ini | 6 ++- variants/lilygo_tlora_v2_1/platformio.ini | 12 ++++++ variants/promicro/platformio.ini | 28 +++++++------ 5 files changed, 69 insertions(+), 23 deletions(-) diff --git a/src/helpers/sensors/EnvironmentSensorManager.cpp b/src/helpers/sensors/EnvironmentSensorManager.cpp index b3de0568..b672cdd4 100644 --- a/src/helpers/sensors/EnvironmentSensorManager.cpp +++ b/src/helpers/sensors/EnvironmentSensorManager.cpp @@ -15,6 +15,16 @@ static Adafruit_AHTX0 AHTX0; static Adafruit_BME280 BME280; #endif +#if ENV_INCLUDE_BMP280 +#ifndef TELEM_BMP280_ADDRESS +#define TELEM_BMP280_ADDRESS 0x76 // BMP280 environmental sensor I2C address +#endif +#define TELEM_BMP280_SEALEVELPRESSURE_HPA (1013.25) // Athmospheric pressure at sea level +#include +static Adafruit_BMP280 BMP280; +#endif + + #if ENV_INCLUDE_INA3221 #define TELEM_INA3221_ADDRESS 0x42 // INA3221 3 channel current sensor I2C address #define TELEM_INA3221_SHUNT_VALUE 0.100 // most variants will have a 0.1 ohm shunts @@ -55,6 +65,17 @@ bool EnvironmentSensorManager::begin() { } #endif + #if ENV_INCLUDE_BMP280 + if (BMP280.begin(TELEM_BMP280_ADDRESS)) { + MESH_DEBUG_PRINTLN("Found BMP280 at address: %02X", TELEM_BMP280_ADDRESS); + MESH_DEBUG_PRINTLN("BMP sensor ID: %02X", BMP280.sensorID()); + BMP280_initialized = true; + } else { + BMP280_initialized = false; + MESH_DEBUG_PRINTLN("BMP280 was not found at I2C address %02X", TELEM_BMP280_ADDRESS); + } + #endif + #if ENV_INCLUDE_INA3221 if (INA3221.begin(TELEM_INA3221_ADDRESS, &Wire)) { MESH_DEBUG_PRINTLN("Found INA3221 at address: %02X", TELEM_INA3221_ADDRESS); @@ -97,7 +118,7 @@ bool EnvironmentSensorManager::querySensors(uint8_t requester_permissions, Cayen sensors_event_t humidity, temp; AHTX0.getEvent(&humidity, &temp); telemetry.addTemperature(TELEM_CHANNEL_SELF, temp.temperature); - telemetry.addRelativeHumidity(TELEM_CHANNEL_SELF, humidity.relative_humidity); + telemetry.addRelativeHumidity(TELEM_CHANNEL_SELF, humidity.relative_humidity); } #endif @@ -110,6 +131,14 @@ bool EnvironmentSensorManager::querySensors(uint8_t requester_permissions, Cayen } #endif + #if ENV_INCLUDE_BMP280 + if (BMP280_initialized) { + telemetry.addTemperature(TELEM_CHANNEL_SELF, BMP280.readTemperature()); + telemetry.addBarometricPressure(TELEM_CHANNEL_SELF, BMP280.readPressure()); + telemetry.addAltitude(TELEM_CHANNEL_SELF, BME280.readAltitude(TELEM_BME280_SEALEVELPRESSURE_HPA)); + } + #endif + #if ENV_INCLUDE_INA3221 if (INA3221_initialized) { for(int i = 0; i < TELEM_INA3221_NUM_CHANNELS; i++) { @@ -152,7 +181,7 @@ int EnvironmentSensorManager::getNumSettings() const { const char* EnvironmentSensorManager::getSettingName(int i) const { #if ENV_INCLUDE_GPS return (gps_detected && i == 0) ? "gps" : NULL; - #else + #else return NULL; #endif } @@ -184,7 +213,7 @@ bool EnvironmentSensorManager::setSettingValue(const char* name, const char* val void EnvironmentSensorManager::initBasicGPS() { Serial1.setPins(PIN_GPS_TX, PIN_GPS_RX); - + #ifdef GPS_BAUD_RATE Serial1.begin(GPS_BAUD_RATE); #else @@ -200,7 +229,7 @@ void EnvironmentSensorManager::initBasicGPS() { #ifndef PIN_GPS_EN MESH_DEBUG_PRINTLN("No GPS wake/reset pin found for this board. Continuing on..."); #endif - + // Give GPS a moment to power up and send data delay(1000); @@ -226,7 +255,7 @@ void EnvironmentSensorManager::start_gps() { gps_active = true; #ifdef PIN_GPS_EN pinMode(PIN_GPS_EN, OUTPUT); - digitalWrite(PIN_GPS_EN, HIGH); + digitalWrite(PIN_GPS_EN, HIGH); return; #endif @@ -241,7 +270,7 @@ void EnvironmentSensorManager::stop_gps() { return; #endif - MESH_DEBUG_PRINTLN("Stop GPS is N/A on this board. Actual GPS state unchanged"); + MESH_DEBUG_PRINTLN("Stop GPS is N/A on this board. Actual GPS state unchanged"); } void EnvironmentSensorManager::loop() { diff --git a/src/helpers/sensors/EnvironmentSensorManager.h b/src/helpers/sensors/EnvironmentSensorManager.h index c9ec6870..76bffc48 100644 --- a/src/helpers/sensors/EnvironmentSensorManager.h +++ b/src/helpers/sensors/EnvironmentSensorManager.h @@ -10,9 +10,10 @@ protected: bool AHTX0_initialized = false; bool BME280_initialized = false; + bool BMP280_initialized = false; bool INA3221_initialized = false; bool INA219_initialized = false; - + bool gps_detected = false; bool gps_active = false; @@ -31,7 +32,7 @@ public: EnvironmentSensorManager(){}; #endif bool begin() override; - bool querySensors(uint8_t requester_permissions, CayenneLPP& telemetry) override; + bool querySensors(uint8_t requester_permissions, CayenneLPP& telemetry) override; #if ENV_INCLUDE_GPS void loop() override; #endif diff --git a/variants/heltec_v3/platformio.ini b/variants/heltec_v3/platformio.ini index 8f9b1a27..17a0899a 100644 --- a/variants/heltec_v3/platformio.ini +++ b/variants/heltec_v3/platformio.ini @@ -19,15 +19,16 @@ build_flags = -D SX126X_RX_BOOSTED_GAIN=1 -D ENV_INCLUDE_AHTX0=1 -D ENV_INCLUDE_BME280=1 + -D ENV_INCLUDE_BMP280=1 -D ENV_INCLUDE_INA3221=1 - -D ENV_INCLUDE_INA219=1 + -D ENV_INCLUDE_INA219=1 -D ENV_INCLUDE_GPS=1 -D PIN_GPS_RX=45 -D PIN_GPS_TX=46 -D PIN_GPS_EN=-1 build_src_filter = ${esp32_base.build_src_filter} +<../variants/heltec_v3> - + + + lib_deps = ${esp32_base.lib_deps} adafruit/Adafruit SSD1306 @ ^2.5.13 @@ -35,6 +36,7 @@ lib_deps = adafruit/Adafruit INA219 @ ^1.2.3 adafruit/Adafruit AHTX0 @ ^2.0.5 adafruit/Adafruit BME280 Library @ ^2.3.0 + adafruit/Adafruit BMP280 Library@^2.6.8 stevemarple/MicroNMEA @ ^2.0.6 [env:Heltec_v3_repeater] diff --git a/variants/lilygo_tlora_v2_1/platformio.ini b/variants/lilygo_tlora_v2_1/platformio.ini index d9cecfc2..1ecaf664 100644 --- a/variants/lilygo_tlora_v2_1/platformio.ini +++ b/variants/lilygo_tlora_v2_1/platformio.ini @@ -17,6 +17,8 @@ build_flags = -D P_LORA_MISO=19 ; SPI MISO -D P_LORA_MOSI=27 ; SPI MOSI -D P_LORA_TX_LED=2 ; LED pin for TX indication + -D PIN_BOARD_SDA=21 + -D PIN_BOARD_SCL=22 -D PIN_VBAT_READ=35 ; Battery voltage reading (analog pin) -D PIN_USER_BTN=0 -D ARDUINO_LOOP_STACK_SIZE=16384 @@ -25,11 +27,21 @@ build_flags = -D WRAPPER_CLASS=CustomSX1276Wrapper -D SX127X_CURRENT_LIMIT=120 -D LORA_TX_POWER=20 + -D ENV_INCLUDE_AHTX0=1 + -D ENV_INCLUDE_BME280=1 + -D ENV_INCLUDE_BMP280=1 + -D ENV_INCLUDE_INA3221=1 + -D ENV_INCLUDE_INA219=1 build_src_filter = ${esp32_base.build_src_filter} +<../variants/lilygo_tlora_v2_1> + + lib_deps = ${esp32_base.lib_deps} adafruit/Adafruit SSD1306 @ ^2.5.13 + adafruit/Adafruit INA3221 Library @ ^1.0.1 + adafruit/Adafruit INA219 @ ^1.2.3 + adafruit/Adafruit AHTX0 @ ^2.0.5 + adafruit/Adafruit BME280 Library @ ^2.3.0 ; === LILYGO T-LoRa V2.1-1.6 with SX1276 environments === [env:LilyGo_TLora_V2_1_1_6_Repeater] diff --git a/variants/promicro/platformio.ini b/variants/promicro/platformio.ini index e7099d1e..246019c2 100644 --- a/variants/promicro/platformio.ini +++ b/variants/promicro/platformio.ini @@ -1,7 +1,7 @@ [Faketec] -extends = nrf52840_base +extends = nrf52_base board = promicro_nrf52840 -build_flags = ${nrf52840_base.build_flags} +build_flags = ${nrf52_base.build_flags} -I variants/promicro -D FAKETEC -D RADIO_CLASS=CustomSX1262 @@ -19,20 +19,22 @@ build_flags = ${nrf52840_base.build_flags} -D ENV_INCLUDE_GPS=1 -D ENV_INCLUDE_AHTX0=1 -D ENV_INCLUDE_BME280=1 + -D ENV_INCLUDE_BMP280=1 -D ENV_INCLUDE_INA3221=1 -D ENV_INCLUDE_INA219=1 -build_src_filter = ${nrf52840_base.build_src_filter} +build_src_filter = ${nrf52_base.build_src_filter} + - + + + +<../variants/promicro> -lib_deps= ${nrf52840_base.lib_deps} +lib_deps= ${nrf52_base.lib_deps} adafruit/Adafruit SSD1306 @ ^2.5.13 adafruit/Adafruit INA3221 Library @ ^1.0.1 adafruit/Adafruit INA219 @ ^1.2.3 adafruit/Adafruit AHTX0 @ ^2.0.5 - adafruit/Adafruit BME280 Library @ ^2.3.0 + adafruit/Adafruit BME280 Library @ ^2.3.0 + adafruit/Adafruit BMP280 Library@^2.6.8 stevemarple/MicroNMEA @ ^2.0.6 - + [env:Faketec_Repeater] extends = Faketec build_src_filter = ${Faketec.build_src_filter} @@ -116,9 +118,9 @@ lib_deps = ${Faketec.lib_deps} densaugeo/base64 @ ~1.4.0 [ProMicroLLCC68] -extends = nrf52840_base +extends = nrf52_base board = promicro_nrf52840 -build_flags = ${nrf52840_base.build_flags} +build_flags = ${nrf52_base.build_flags} -I variants/promicro -D PROMICROLLCC68 -D RADIO_CLASS=CustomLLCC68 @@ -127,15 +129,15 @@ build_flags = ${nrf52840_base.build_flags} -D SX126X_CURRENT_LIMIT=140 -D SX126X_RX_BOOSTED_GAIN=1 build_src_filter = - ${nrf52840_base.build_src_filter} + ${nrf52_base.build_src_filter} + - + + + +<../variants/promicro> -lib_deps= ${nrf52840_base.lib_deps} +lib_deps= ${nrf52_base.lib_deps} adafruit/Adafruit INA3221 Library @ ^1.0.1 adafruit/Adafruit INA219 @ ^1.2.3 adafruit/Adafruit AHTX0 @ ^2.0.5 - adafruit/Adafruit BME280 Library @ ^2.3.0 + adafruit/Adafruit BME280 Library @ ^2.3.0 [env:ProMicroLLCC68_Repeater] extends = ProMicroLLCC68