From e4f7b9e37f0b08732d4de85bb8d0dda062589961 Mon Sep 17 00:00:00 2001 From: Mike Cochrane Date: Fri, 18 Jul 2025 18:16:59 +1200 Subject: [PATCH 1/3] Allow the SDA and SCL pins for Environment sensors to be configured independantly. Add Heltec V3 Sensor. --- .../sensors/EnvironmentSensorManager.cpp | 23 ++++++++++++++----- variants/heltec_v3/platformio.ini | 21 ++++++++++++++++- 2 files changed, 37 insertions(+), 7 deletions(-) diff --git a/src/helpers/sensors/EnvironmentSensorManager.cpp b/src/helpers/sensors/EnvironmentSensorManager.cpp index ab9487f8..b9653248 100644 --- a/src/helpers/sensors/EnvironmentSensorManager.cpp +++ b/src/helpers/sensors/EnvironmentSensorManager.cpp @@ -1,5 +1,11 @@ #include "EnvironmentSensorManager.h" +#if ENV_PIN_SDA && ENV_PIN_SCL +#define TELEM_WIRE &Wire1 // Use Wire1 as the I2C bus for Environment Sensors +#else +#define TELEM_WIRE &Wire // Use default I2C bus for Environment Sensors +#endif + #if ENV_INCLUDE_AHTX0 #define TELEM_AHTX_ADDRESS 0x38 // AHT10, AHT20 temperature and humidity sensor I2C address #include @@ -65,8 +71,13 @@ bool EnvironmentSensorManager::begin() { #endif #endif + #if ENV_PIN_SDA && ENV_PIN_SCL + Wire1.begin(ENV_PIN_SDA, ENV_PIN_SCL, 100000); + MESH_DEBUG_PRINTLN("Second I2C initialized on pins SDA: %d SCL: %d", ENV_PIN_SDA, ENV_PIN_SCL); + #endif + #if ENV_INCLUDE_AHTX0 - if (AHTX0.begin(&Wire, 0, TELEM_AHTX_ADDRESS)) { + if (AHTX0.begin(TELEM_WIRE, 0, TELEM_AHTX_ADDRESS)) { MESH_DEBUG_PRINTLN("Found AHT10/AHT20 at address: %02X", TELEM_AHTX_ADDRESS); AHTX0_initialized = true; } else { @@ -76,7 +87,7 @@ bool EnvironmentSensorManager::begin() { #endif #if ENV_INCLUDE_BME280 - if (BME280.begin(TELEM_BME280_ADDRESS, &Wire)) { + if (BME280.begin(TELEM_BME280_ADDRESS, TELEM_WIRE)) { MESH_DEBUG_PRINTLN("Found BME280 at address: %02X", TELEM_BME280_ADDRESS); MESH_DEBUG_PRINTLN("BME sensor ID: %02X", BME280.sensorID()); BME280_initialized = true; @@ -118,7 +129,7 @@ bool EnvironmentSensorManager::begin() { #endif #if ENV_INCLUDE_INA3221 - if (INA3221.begin(TELEM_INA3221_ADDRESS, &Wire)) { + if (INA3221.begin(TELEM_INA3221_ADDRESS, TELEM_WIRE)) { MESH_DEBUG_PRINTLN("Found INA3221 at address: %02X", TELEM_INA3221_ADDRESS); MESH_DEBUG_PRINTLN("%04X %04X", INA3221.getDieID(), INA3221.getManufacturerID()); @@ -133,7 +144,7 @@ bool EnvironmentSensorManager::begin() { #endif #if ENV_INCLUDE_INA219 - if (INA219.begin(&Wire)) { + if (INA219.begin(TELEM_WIRE)) { MESH_DEBUG_PRINTLN("Found INA219 at address: %02X", TELEM_INA219_ADDRESS); INA219_initialized = true; } else { @@ -327,14 +338,14 @@ void EnvironmentSensorManager::rakGPSInit(){ } else if(gpsIsAwake(WB_IO4)){ // MESH_DEBUG_PRINTLN("RAK base board is RAK19003/9"); - // MESH_DEBUG_PRINTLN("GPS is installed on Socket C"); + // MESH_DEBUG_PRINTLN("GPS is installed on Socket C"); } else if(gpsIsAwake(WB_IO5)){ // MESH_DEBUG_PRINTLN("RAK base board is RAK19001/11"); // MESH_DEBUG_PRINTLN("GPS is installed on Socket F"); } else{ - MESH_DEBUG_PRINTLN("No GPS found"); + MESH_DEBUG_PRINTLN("No GPS found"); gps_active = false; gps_detected = false; return; diff --git a/variants/heltec_v3/platformio.ini b/variants/heltec_v3/platformio.ini index edc683d2..2c5c124e 100644 --- a/variants/heltec_v3/platformio.ini +++ b/variants/heltec_v3/platformio.ini @@ -147,6 +147,26 @@ lib_deps = ${Heltec_lora32_v3.lib_deps} densaugeo/base64 @ ~1.4.0 +[env:Heltec_v3_sensor] +extends = Heltec_lora32_v3 +build_flags = + ${Heltec_lora32_v3.build_flags} + -D ADVERT_NAME='"Heltec v3 Sensor"' + -D ADVERT_LAT=0.0 + -D ADVERT_LON=0.0 + -D ADMIN_PASSWORD='"password"' + -D ENV_PIN_SDA=33 + -D ENV_PIN_SCL=34 + -D DISPLAY_CLASS=SSD1306Display +; -D MESH_PACKET_LOGGING=1 +; -D MESH_DEBUG=1 +build_src_filter = ${Heltec_lora32_v3.build_src_filter} + + + +<../examples/simple_sensor> +lib_deps = + ${Heltec_lora32_v3.lib_deps} + ${esp32_ota.lib_deps} + [env:Heltec_WSL3_repeater] extends = Heltec_lora32_v3 build_flags = @@ -214,4 +234,3 @@ build_src_filter = ${Heltec_lora32_v3.build_src_filter} lib_deps = ${Heltec_lora32_v3.lib_deps} ${esp32_ota.lib_deps} - From 9f2a77c92eaae99a8395df54dbcf6ac0864e2bc1 Mon Sep 17 00:00:00 2001 From: Mike Cochrane Date: Fri, 18 Jul 2025 18:51:00 +1200 Subject: [PATCH 2/3] Add Melexis Contact-less Infrared Sensor - MLX90614 to Heltec V3 Sensor --- .../sensors/EnvironmentSensorManager.cpp | 23 +++++++++++++++++++ .../sensors/EnvironmentSensorManager.h | 1 + variants/heltec_v3/platformio.ini | 2 ++ 3 files changed, 26 insertions(+) diff --git a/src/helpers/sensors/EnvironmentSensorManager.cpp b/src/helpers/sensors/EnvironmentSensorManager.cpp index b9653248..7299b8fc 100644 --- a/src/helpers/sensors/EnvironmentSensorManager.cpp +++ b/src/helpers/sensors/EnvironmentSensorManager.cpp @@ -53,6 +53,12 @@ static Adafruit_INA3221 INA3221; static Adafruit_INA219 INA219(TELEM_INA219_ADDRESS); #endif +#if ENV_INCLUDE_MLX90614 +#define TELEM_MLX90614_ADDRESS 0x5A // MLX90614 IR temperature sensor I2C address +#include +static Adafruit_MLX90614 MLX90614; +#endif + #if ENV_INCLUDE_GPS && RAK_BOARD static uint32_t gpsResetPin = 0; static bool i2cGPSFlag = false; @@ -153,6 +159,16 @@ bool EnvironmentSensorManager::begin() { } #endif + #if ENV_INCLUDE_MLX90614 + if (MLX90614.begin(TELEM_MLX90614_ADDRESS, TELEM_WIRE)) { + MESH_DEBUG_PRINTLN("Found MLX90614 at address: %02X", TELEM_MLX90614_ADDRESS); + MLX90614_initialized = true; + } else { + MLX90614_initialized = false; + MESH_DEBUG_PRINTLN("MLX90614 was not found at I2C address %02X", TELEM_MLX90614_ADDRESS); + } + #endif + return true; } @@ -233,6 +249,13 @@ bool EnvironmentSensorManager::querySensors(uint8_t requester_permissions, Cayen } #endif + #if ENV_INCLUDE_MLX90614 + if (MLX90614_initialized) { + telemetry.addTemperature(TELEM_CHANNEL_SELF, MLX90614.readObjectTempC()); + telemetry.addTemperature(TELEM_CHANNEL_SELF + 1, MLX90614.readAmbientTempC()); + } + #endif + } return true; diff --git a/src/helpers/sensors/EnvironmentSensorManager.h b/src/helpers/sensors/EnvironmentSensorManager.h index 2a2b209a..535d3d0f 100644 --- a/src/helpers/sensors/EnvironmentSensorManager.h +++ b/src/helpers/sensors/EnvironmentSensorManager.h @@ -15,6 +15,7 @@ protected: bool INA219_initialized = false; bool SHTC3_initialized = false; bool LPS22HB_initialized = false; + bool MLX90614_initialized = false; bool gps_detected = false; bool gps_active = false; diff --git a/variants/heltec_v3/platformio.ini b/variants/heltec_v3/platformio.ini index 2c5c124e..a2670a94 100644 --- a/variants/heltec_v3/platformio.ini +++ b/variants/heltec_v3/platformio.ini @@ -157,6 +157,7 @@ build_flags = -D ADMIN_PASSWORD='"password"' -D ENV_PIN_SDA=33 -D ENV_PIN_SCL=34 + -D ENV_INCLUDE_MLX90614=1 -D DISPLAY_CLASS=SSD1306Display ; -D MESH_PACKET_LOGGING=1 ; -D MESH_DEBUG=1 @@ -166,6 +167,7 @@ build_src_filter = ${Heltec_lora32_v3.build_src_filter} lib_deps = ${Heltec_lora32_v3.lib_deps} ${esp32_ota.lib_deps} + adafruit/Adafruit MLX90614 Library @ ^2.1.5 [env:Heltec_WSL3_repeater] extends = Heltec_lora32_v3 From 93802fe25059bf9364b49305dd666403576030e8 Mon Sep 17 00:00:00 2001 From: Mike Cochrane Date: Fri, 18 Jul 2025 22:01:47 +1200 Subject: [PATCH 3/3] Add VL53L0X time-of-flight distance sensor to Heltec V3 Sensor --- .../sensors/EnvironmentSensorManager.cpp | 28 +++++++++++++++++++ .../sensors/EnvironmentSensorManager.h | 1 + variants/heltec_v3/platformio.ini | 2 ++ 3 files changed, 31 insertions(+) diff --git a/src/helpers/sensors/EnvironmentSensorManager.cpp b/src/helpers/sensors/EnvironmentSensorManager.cpp index 7299b8fc..c95b1828 100644 --- a/src/helpers/sensors/EnvironmentSensorManager.cpp +++ b/src/helpers/sensors/EnvironmentSensorManager.cpp @@ -59,6 +59,12 @@ static Adafruit_INA219 INA219(TELEM_INA219_ADDRESS); static Adafruit_MLX90614 MLX90614; #endif +#if ENV_INCLUDE_VL53L0X +#define TELEM_VL53L0X_ADDRESS 0x29 // VL53L0X time-of-flight distance sensor I2C address +#include +static Adafruit_VL53L0X VL53L0X; +#endif + #if ENV_INCLUDE_GPS && RAK_BOARD static uint32_t gpsResetPin = 0; static bool i2cGPSFlag = false; @@ -169,6 +175,16 @@ bool EnvironmentSensorManager::begin() { } #endif + #if ENV_INCLUDE_VL53L0X + if (VL53L0X.begin(TELEM_VL53L0X_ADDRESS, false, TELEM_WIRE)) { + MESH_DEBUG_PRINTLN("Found VL53L0X at address: %02X", TELEM_VL53L0X_ADDRESS); + VL53L0X_initialized = true; + } else { + VL53L0X_initialized = false; + MESH_DEBUG_PRINTLN("VL53L0X was not found at I2C address %02X", TELEM_VL53L0X_ADDRESS); + } + #endif + return true; } @@ -256,6 +272,18 @@ bool EnvironmentSensorManager::querySensors(uint8_t requester_permissions, Cayen } #endif + #if ENV_INCLUDE_VL53L0X + if (VL53L0X_initialized) { + VL53L0X_RangingMeasurementData_t measure; + VL53L0X.rangingTest(&measure, false); // pass in 'true' to get debug data + if (measure.RangeStatus != 4) { // phase failures + telemetry.addDistance(TELEM_CHANNEL_SELF, measure.RangeMilliMeter / 1000.0f); // convert mm to m + } else { + telemetry.addDistance(TELEM_CHANNEL_SELF, 0.0f); // no valid measurement + } + } + #endif + } return true; diff --git a/src/helpers/sensors/EnvironmentSensorManager.h b/src/helpers/sensors/EnvironmentSensorManager.h index 535d3d0f..63c56643 100644 --- a/src/helpers/sensors/EnvironmentSensorManager.h +++ b/src/helpers/sensors/EnvironmentSensorManager.h @@ -16,6 +16,7 @@ protected: bool SHTC3_initialized = false; bool LPS22HB_initialized = false; bool MLX90614_initialized = false; + bool VL53L0X_initialized = false; bool gps_detected = false; bool gps_active = false; diff --git a/variants/heltec_v3/platformio.ini b/variants/heltec_v3/platformio.ini index a2670a94..67415ae9 100644 --- a/variants/heltec_v3/platformio.ini +++ b/variants/heltec_v3/platformio.ini @@ -158,6 +158,7 @@ build_flags = -D ENV_PIN_SDA=33 -D ENV_PIN_SCL=34 -D ENV_INCLUDE_MLX90614=1 + -D ENV_INCLUDE_VL53L0X=1 -D DISPLAY_CLASS=SSD1306Display ; -D MESH_PACKET_LOGGING=1 ; -D MESH_DEBUG=1 @@ -168,6 +169,7 @@ lib_deps = ${Heltec_lora32_v3.lib_deps} ${esp32_ota.lib_deps} adafruit/Adafruit MLX90614 Library @ ^2.1.5 + adafruit/Adafruit_VL53L0X @ ^1.2.4 [env:Heltec_WSL3_repeater] extends = Heltec_lora32_v3