소스 검색

Merge pull request #955 from liquidraver/dev

Add simple BME680 support to RAK (RAK1906)
ripplebiz 9 달 전
부모
커밋
666447eafc
3개의 변경된 파일37개의 추가작업 그리고 0개의 파일을 삭제
  1. 2 0
      platformio.ini
  2. 34 0
      src/helpers/sensors/EnvironmentSensorManager.cpp
  3. 1 0
      src/helpers/sensors/EnvironmentSensorManager.h

+ 2 - 0
platformio.ini

@@ -125,6 +125,7 @@ build_flags =
   -D ENV_INCLUDE_INA260=1
   -D ENV_INCLUDE_MLX90614=1
   -D ENV_INCLUDE_VL53L0X=1
+  -D ENV_INCLUDE_BME680=1
 lib_deps =
   adafruit/Adafruit INA3221 Library @ ^1.0.1
   adafruit/Adafruit INA219 @ ^1.2.3
@@ -139,3 +140,4 @@ lib_deps =
   adafruit/Adafruit MLX90614 Library @ ^2.1.5
   adafruit/Adafruit_VL53L0X @ ^1.2.4
   stevemarple/MicroNMEA @ ^2.0.6
+  adafruit/Adafruit BME680 Library @ ^2.0.4

+ 34 - 0
src/helpers/sensors/EnvironmentSensorManager.cpp

@@ -6,6 +6,15 @@
 #define TELEM_WIRE &Wire  // Use default I2C bus for Environment Sensors
 #endif
 
+#ifdef ENV_INCLUDE_BME680
+#ifndef TELEM_BME680_ADDRESS
+#define TELEM_BME680_ADDRESS 0x76
+#endif
+#define TELEM_BME680_SEALEVELPRESSURE_HPA (1013.25)
+#include <Adafruit_BME680.h>
+static Adafruit_BME680 BME680;
+#endif
+
 #if ENV_INCLUDE_AHTX0
 #define TELEM_AHTX_ADDRESS      0x38      // AHT10, AHT20 temperature and humidity sensor I2C address
 #include <Adafruit_AHTX0.h>
@@ -286,6 +295,16 @@ bool EnvironmentSensorManager::begin() {
   }
   #endif
 
+  #if ENV_INCLUDE_BME680
+  if (BME680.begin(TELEM_BME680_ADDRESS, TELEM_WIRE)) {
+    MESH_DEBUG_PRINTLN("Found BME680 at address: %02X", TELEM_BME680_ADDRESS);
+    BME680_initialized = true;
+  } else {
+    BME680_initialized = false;
+    MESH_DEBUG_PRINTLN("BME680 was not found at I2C address %02X", TELEM_BME680_ADDRESS);
+  }
+  #endif
+
   return true;
 }
 
@@ -415,6 +434,19 @@ bool EnvironmentSensorManager::querySensors(uint8_t requester_permissions, Cayen
     }
     #endif
 
+    #if ENV_INCLUDE_BME680
+    if (BME680_initialized) {
+      if (BME680.performReading()) {
+        telemetry.addTemperature(TELEM_CHANNEL_SELF, BME680.temperature);
+        telemetry.addRelativeHumidity(TELEM_CHANNEL_SELF, BME680.humidity);
+        telemetry.addBarometricPressure(TELEM_CHANNEL_SELF, BME680.pressure / 100);
+        telemetry.addAltitude(TELEM_CHANNEL_SELF, 44330.0 * (1.0 - pow((BME680.pressure / 100) / TELEM_BME680_SEALEVELPRESSURE_HPA, 0.1903)));
+        telemetry.addAnalogInput(next_available_channel, BME680.gas_resistance);
+        next_available_channel++;
+      }
+    }
+    #endif
+
   }
 
   return true;
@@ -623,6 +655,7 @@ void EnvironmentSensorManager::stop_gps() {
 void EnvironmentSensorManager::loop() {
   static long next_gps_update = 0;
 
+  #if ENV_INCLUDE_GPS
   _location->loop();
 
   if (millis() > next_gps_update) {
@@ -647,5 +680,6 @@ void EnvironmentSensorManager::loop() {
     }
     next_gps_update = millis() + 1000;
   }
+  #endif
 }
 #endif

+ 1 - 0
src/helpers/sensors/EnvironmentSensorManager.h

@@ -20,6 +20,7 @@ protected:
   bool MLX90614_initialized = false;
   bool VL53L0X_initialized = false;
   bool SHT4X_initialized = false;
+  bool BME680_initialized = false;
 
   bool gps_detected = false;
   bool gps_active = false;