add support for BMP280 temperature+pressure sensor

This commit is contained in:
recrof
2025-06-29 00:17:46 +02:00
parent 5fa6533291
commit 9530744ff4
5 changed files with 69 additions and 23 deletions

View File

@@ -15,6 +15,16 @@ static Adafruit_AHTX0 AHTX0;
static Adafruit_BME280 BME280; static Adafruit_BME280 BME280;
#endif #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 <Adafruit_BMP280.h>
static Adafruit_BMP280 BMP280;
#endif
#if ENV_INCLUDE_INA3221 #if ENV_INCLUDE_INA3221
#define TELEM_INA3221_ADDRESS 0x42 // INA3221 3 channel current sensor I2C address #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 #define TELEM_INA3221_SHUNT_VALUE 0.100 // most variants will have a 0.1 ohm shunts
@@ -55,6 +65,17 @@ bool EnvironmentSensorManager::begin() {
} }
#endif #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 ENV_INCLUDE_INA3221
if (INA3221.begin(TELEM_INA3221_ADDRESS, &Wire)) { if (INA3221.begin(TELEM_INA3221_ADDRESS, &Wire)) {
MESH_DEBUG_PRINTLN("Found INA3221 at address: %02X", TELEM_INA3221_ADDRESS); 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; sensors_event_t humidity, temp;
AHTX0.getEvent(&humidity, &temp); AHTX0.getEvent(&humidity, &temp);
telemetry.addTemperature(TELEM_CHANNEL_SELF, temp.temperature); telemetry.addTemperature(TELEM_CHANNEL_SELF, temp.temperature);
telemetry.addRelativeHumidity(TELEM_CHANNEL_SELF, humidity.relative_humidity); telemetry.addRelativeHumidity(TELEM_CHANNEL_SELF, humidity.relative_humidity);
} }
#endif #endif
@@ -110,6 +131,14 @@ bool EnvironmentSensorManager::querySensors(uint8_t requester_permissions, Cayen
} }
#endif #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 ENV_INCLUDE_INA3221
if (INA3221_initialized) { if (INA3221_initialized) {
for(int i = 0; i < TELEM_INA3221_NUM_CHANNELS; i++) { 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 { const char* EnvironmentSensorManager::getSettingName(int i) const {
#if ENV_INCLUDE_GPS #if ENV_INCLUDE_GPS
return (gps_detected && i == 0) ? "gps" : NULL; return (gps_detected && i == 0) ? "gps" : NULL;
#else #else
return NULL; return NULL;
#endif #endif
} }
@@ -184,7 +213,7 @@ bool EnvironmentSensorManager::setSettingValue(const char* name, const char* val
void EnvironmentSensorManager::initBasicGPS() { void EnvironmentSensorManager::initBasicGPS() {
Serial1.setPins(PIN_GPS_TX, PIN_GPS_RX); Serial1.setPins(PIN_GPS_TX, PIN_GPS_RX);
#ifdef GPS_BAUD_RATE #ifdef GPS_BAUD_RATE
Serial1.begin(GPS_BAUD_RATE); Serial1.begin(GPS_BAUD_RATE);
#else #else
@@ -200,7 +229,7 @@ void EnvironmentSensorManager::initBasicGPS() {
#ifndef PIN_GPS_EN #ifndef PIN_GPS_EN
MESH_DEBUG_PRINTLN("No GPS wake/reset pin found for this board. Continuing on..."); MESH_DEBUG_PRINTLN("No GPS wake/reset pin found for this board. Continuing on...");
#endif #endif
// Give GPS a moment to power up and send data // Give GPS a moment to power up and send data
delay(1000); delay(1000);
@@ -226,7 +255,7 @@ void EnvironmentSensorManager::start_gps() {
gps_active = true; gps_active = true;
#ifdef PIN_GPS_EN #ifdef PIN_GPS_EN
pinMode(PIN_GPS_EN, OUTPUT); pinMode(PIN_GPS_EN, OUTPUT);
digitalWrite(PIN_GPS_EN, HIGH); digitalWrite(PIN_GPS_EN, HIGH);
return; return;
#endif #endif
@@ -241,7 +270,7 @@ void EnvironmentSensorManager::stop_gps() {
return; return;
#endif #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() { void EnvironmentSensorManager::loop() {

View File

@@ -10,9 +10,10 @@ protected:
bool AHTX0_initialized = false; bool AHTX0_initialized = false;
bool BME280_initialized = false; bool BME280_initialized = false;
bool BMP280_initialized = false;
bool INA3221_initialized = false; bool INA3221_initialized = false;
bool INA219_initialized = false; bool INA219_initialized = false;
bool gps_detected = false; bool gps_detected = false;
bool gps_active = false; bool gps_active = false;
@@ -31,7 +32,7 @@ public:
EnvironmentSensorManager(){}; EnvironmentSensorManager(){};
#endif #endif
bool begin() override; 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 #if ENV_INCLUDE_GPS
void loop() override; void loop() override;
#endif #endif

View File

@@ -19,15 +19,16 @@ build_flags =
-D SX126X_RX_BOOSTED_GAIN=1 -D SX126X_RX_BOOSTED_GAIN=1
-D ENV_INCLUDE_AHTX0=1 -D ENV_INCLUDE_AHTX0=1
-D ENV_INCLUDE_BME280=1 -D ENV_INCLUDE_BME280=1
-D ENV_INCLUDE_BMP280=1
-D ENV_INCLUDE_INA3221=1 -D ENV_INCLUDE_INA3221=1
-D ENV_INCLUDE_INA219=1 -D ENV_INCLUDE_INA219=1
-D ENV_INCLUDE_GPS=1 -D ENV_INCLUDE_GPS=1
-D PIN_GPS_RX=45 -D PIN_GPS_RX=45
-D PIN_GPS_TX=46 -D PIN_GPS_TX=46
-D PIN_GPS_EN=-1 -D PIN_GPS_EN=-1
build_src_filter = ${esp32_base.build_src_filter} build_src_filter = ${esp32_base.build_src_filter}
+<../variants/heltec_v3> +<../variants/heltec_v3>
+<helpers/sensors> +<helpers/sensors>
lib_deps = lib_deps =
${esp32_base.lib_deps} ${esp32_base.lib_deps}
adafruit/Adafruit SSD1306 @ ^2.5.13 adafruit/Adafruit SSD1306 @ ^2.5.13
@@ -35,6 +36,7 @@ lib_deps =
adafruit/Adafruit INA219 @ ^1.2.3 adafruit/Adafruit INA219 @ ^1.2.3
adafruit/Adafruit AHTX0 @ ^2.0.5 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 stevemarple/MicroNMEA @ ^2.0.6
[env:Heltec_v3_repeater] [env:Heltec_v3_repeater]

View File

@@ -17,6 +17,8 @@ build_flags =
-D P_LORA_MISO=19 ; SPI MISO -D P_LORA_MISO=19 ; SPI MISO
-D P_LORA_MOSI=27 ; SPI MOSI -D P_LORA_MOSI=27 ; SPI MOSI
-D P_LORA_TX_LED=2 ; LED pin for TX indication -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_VBAT_READ=35 ; Battery voltage reading (analog pin)
-D PIN_USER_BTN=0 -D PIN_USER_BTN=0
-D ARDUINO_LOOP_STACK_SIZE=16384 -D ARDUINO_LOOP_STACK_SIZE=16384
@@ -25,11 +27,21 @@ build_flags =
-D WRAPPER_CLASS=CustomSX1276Wrapper -D WRAPPER_CLASS=CustomSX1276Wrapper
-D SX127X_CURRENT_LIMIT=120 -D SX127X_CURRENT_LIMIT=120
-D LORA_TX_POWER=20 -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} build_src_filter = ${esp32_base.build_src_filter}
+<../variants/lilygo_tlora_v2_1> +<../variants/lilygo_tlora_v2_1>
+<helpers/sensors>
lib_deps = lib_deps =
${esp32_base.lib_deps} ${esp32_base.lib_deps}
adafruit/Adafruit SSD1306 @ ^2.5.13 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 === ; === LILYGO T-LoRa V2.1-1.6 with SX1276 environments ===
[env:LilyGo_TLora_V2_1_1_6_Repeater] [env:LilyGo_TLora_V2_1_1_6_Repeater]

View File

@@ -1,7 +1,7 @@
[Faketec] [Faketec]
extends = nrf52840_base extends = nrf52_base
board = promicro_nrf52840 board = promicro_nrf52840
build_flags = ${nrf52840_base.build_flags} build_flags = ${nrf52_base.build_flags}
-I variants/promicro -I variants/promicro
-D FAKETEC -D FAKETEC
-D RADIO_CLASS=CustomSX1262 -D RADIO_CLASS=CustomSX1262
@@ -19,20 +19,22 @@ build_flags = ${nrf52840_base.build_flags}
-D ENV_INCLUDE_GPS=1 -D ENV_INCLUDE_GPS=1
-D ENV_INCLUDE_AHTX0=1 -D ENV_INCLUDE_AHTX0=1
-D ENV_INCLUDE_BME280=1 -D ENV_INCLUDE_BME280=1
-D ENV_INCLUDE_BMP280=1
-D ENV_INCLUDE_INA3221=1 -D ENV_INCLUDE_INA3221=1
-D ENV_INCLUDE_INA219=1 -D ENV_INCLUDE_INA219=1
build_src_filter = ${nrf52840_base.build_src_filter} build_src_filter = ${nrf52_base.build_src_filter}
+<helpers/nrf52/PromicroBoard.cpp> +<helpers/nrf52/PromicroBoard.cpp>
+<helpers/sensors> +<helpers/sensors>
+<../variants/promicro> +<../variants/promicro>
lib_deps= ${nrf52840_base.lib_deps} lib_deps= ${nrf52_base.lib_deps}
adafruit/Adafruit SSD1306 @ ^2.5.13 adafruit/Adafruit SSD1306 @ ^2.5.13
adafruit/Adafruit INA3221 Library @ ^1.0.1 adafruit/Adafruit INA3221 Library @ ^1.0.1
adafruit/Adafruit INA219 @ ^1.2.3 adafruit/Adafruit INA219 @ ^1.2.3
adafruit/Adafruit AHTX0 @ ^2.0.5 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 stevemarple/MicroNMEA @ ^2.0.6
[env:Faketec_Repeater] [env:Faketec_Repeater]
extends = Faketec extends = Faketec
build_src_filter = ${Faketec.build_src_filter} build_src_filter = ${Faketec.build_src_filter}
@@ -116,9 +118,9 @@ lib_deps = ${Faketec.lib_deps}
densaugeo/base64 @ ~1.4.0 densaugeo/base64 @ ~1.4.0
[ProMicroLLCC68] [ProMicroLLCC68]
extends = nrf52840_base extends = nrf52_base
board = promicro_nrf52840 board = promicro_nrf52840
build_flags = ${nrf52840_base.build_flags} build_flags = ${nrf52_base.build_flags}
-I variants/promicro -I variants/promicro
-D PROMICROLLCC68 -D PROMICROLLCC68
-D RADIO_CLASS=CustomLLCC68 -D RADIO_CLASS=CustomLLCC68
@@ -127,15 +129,15 @@ build_flags = ${nrf52840_base.build_flags}
-D SX126X_CURRENT_LIMIT=140 -D SX126X_CURRENT_LIMIT=140
-D SX126X_RX_BOOSTED_GAIN=1 -D SX126X_RX_BOOSTED_GAIN=1
build_src_filter = build_src_filter =
${nrf52840_base.build_src_filter} ${nrf52_base.build_src_filter}
+<helpers/nrf52/PromicroBoard.cpp> +<helpers/nrf52/PromicroBoard.cpp>
+<helpers/sensors> +<helpers/sensors>
+<../variants/promicro> +<../variants/promicro>
lib_deps= ${nrf52840_base.lib_deps} lib_deps= ${nrf52_base.lib_deps}
adafruit/Adafruit INA3221 Library @ ^1.0.1 adafruit/Adafruit INA3221 Library @ ^1.0.1
adafruit/Adafruit INA219 @ ^1.2.3 adafruit/Adafruit INA219 @ ^1.2.3
adafruit/Adafruit AHTX0 @ ^2.0.5 adafruit/Adafruit AHTX0 @ ^2.0.5
adafruit/Adafruit BME280 Library @ ^2.3.0 adafruit/Adafruit BME280 Library @ ^2.3.0
[env:ProMicroLLCC68_Repeater] [env:ProMicroLLCC68_Repeater]
extends = ProMicroLLCC68 extends = ProMicroLLCC68