From 97684c6c7315ede61717b7a99c4348184b23a85a Mon Sep 17 00:00:00 2001 From: Ben Meadors Date: Sun, 31 Jul 2022 08:52:47 -0500 Subject: [PATCH] Add bmp-280 support (#1581) --- platformio.ini | 1 + protobufs | 2 +- src/debug/i2cScan.h | 3 ++ src/main.cpp | 2 +- src/main.h | 2 +- src/mesh/generated/telemetry.pb.h | 8 +++-- .../Telemetry/EnvironmentTelemetry.cpp | 10 +++++-- src/modules/Telemetry/Sensor/BMP280Sensor.cpp | 30 +++++++++++++++++++ src/modules/Telemetry/Sensor/BMP280Sensor.h | 16 ++++++++++ 9 files changed, 66 insertions(+), 8 deletions(-) create mode 100644 src/modules/Telemetry/Sensor/BMP280Sensor.cpp create mode 100644 src/modules/Telemetry/Sensor/BMP280Sensor.h diff --git a/platformio.ini b/platformio.ini index 6f79fcb04..9c6ae30f0 100644 --- a/platformio.ini +++ b/platformio.ini @@ -81,6 +81,7 @@ lib_deps = adafruit/Adafruit Unified Sensor@^1.1.4 paulstoffregen/OneWire@^2.3.5 robtillaart/DS18B20@^0.1.11 + adafruit/Adafruit BMP280 Library@^2.6.3 adafruit/Adafruit BME280 Library@^2.2.2 adafruit/Adafruit BME680 Library@^2.0.1 adafruit/Adafruit MCP9808 Library@^2.0.0 diff --git a/protobufs b/protobufs index 8c6ada3df..11d94c9b1 160000 --- a/protobufs +++ b/protobufs @@ -1 +1 @@ -Subproject commit 8c6ada3df4a9ea17a89d31b4f814d83a3c503b53 +Subproject commit 11d94c9b15e9085b0f2516735ad816a3a35d5680 diff --git a/src/debug/i2cScan.h b/src/debug/i2cScan.h index 053a4ae1e..3d737c692 100644 --- a/src/debug/i2cScan.h +++ b/src/debug/i2cScan.h @@ -124,6 +124,9 @@ void scanI2Cdevice(void) } else if (registerValue == 0x60) { DEBUG_MSG("BME-280 sensor found at address 0x%x\n", (uint8_t)addr); nodeTelemetrySensorsMap[TelemetrySensorType_BME280] = addr; + } else { + DEBUG_MSG("BMP-280 sensor found at address 0x%x\n", (uint8_t)addr); + nodeTelemetrySensorsMap[TelemetrySensorType_BMP280] = addr; } } if (addr == INA_ADDR || addr == INA_ADDR_ALTERNATE) { diff --git a/src/main.cpp b/src/main.cpp index c8cf4d6fc..66c4021c1 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -93,7 +93,7 @@ uint32_t serialSinceMsec; bool axp192_found; // Array map of sensor types (as array index) and i2c address as value we'll find in the i2c scan -uint8_t nodeTelemetrySensorsMap[6] = { 0, 0, 0, 0, 0, 0 }; +uint8_t nodeTelemetrySensorsMap[7] = { 0, 0, 0, 0, 0, 0, 0 }; Router *router = NULL; // Users of router don't care what sort of subclass implements that API diff --git a/src/main.h b/src/main.h index b9ae581ac..02dce04b3 100644 --- a/src/main.h +++ b/src/main.h @@ -19,7 +19,7 @@ extern bool axp192_found; extern bool isCharging; extern bool isUSBPowered; -extern uint8_t nodeTelemetrySensorsMap[6]; +extern uint8_t nodeTelemetrySensorsMap[7]; // Global Screen singleton. extern graphics::Screen *screen; diff --git a/src/mesh/generated/telemetry.pb.h b/src/mesh/generated/telemetry.pb.h index d77c9ae49..9a75230dd 100644 --- a/src/mesh/generated/telemetry.pb.h +++ b/src/mesh/generated/telemetry.pb.h @@ -23,7 +23,9 @@ typedef enum _TelemetrySensorType { /* Moderate accuracy current and voltage */ TelemetrySensorType_INA260 = 4, /* Moderate accuracy current and voltage */ - TelemetrySensorType_INA219 = 5 + TelemetrySensorType_INA219 = 5, + /* High accuracy temperature and pressure */ + TelemetrySensorType_BMP280 = 6 } TelemetrySensorType; /* Struct definitions */ @@ -75,8 +77,8 @@ typedef struct _Telemetry { /* Helper constants for enums */ #define _TelemetrySensorType_MIN TelemetrySensorType_NotSet -#define _TelemetrySensorType_MAX TelemetrySensorType_INA219 -#define _TelemetrySensorType_ARRAYSIZE ((TelemetrySensorType)(TelemetrySensorType_INA219+1)) +#define _TelemetrySensorType_MAX TelemetrySensorType_BMP280 +#define _TelemetrySensorType_ARRAYSIZE ((TelemetrySensorType)(TelemetrySensorType_BMP280+1)) #ifdef __cplusplus diff --git a/src/modules/Telemetry/EnvironmentTelemetry.cpp b/src/modules/Telemetry/EnvironmentTelemetry.cpp index 15905c75b..51df254cd 100644 --- a/src/modules/Telemetry/EnvironmentTelemetry.cpp +++ b/src/modules/Telemetry/EnvironmentTelemetry.cpp @@ -11,12 +11,14 @@ #include // Sensors +#include "Sensor/BMP280Sensor.h" #include "Sensor/BME280Sensor.h" #include "Sensor/BME680Sensor.h" #include "Sensor/MCP9808Sensor.h" #include "Sensor/INA260Sensor.h" #include "Sensor/INA219Sensor.h" +BMP280Sensor bmp280Sensor; BME280Sensor bme280Sensor; BME680Sensor bme680Sensor; MCP9808Sensor mcp9808Sensor; @@ -69,10 +71,12 @@ int32_t EnvironmentTelemetryModule::runOnce() DEBUG_MSG("Environment Telemetry: Initializing\n"); // it's possible to have this module enabled, only for displaying values on the screen. // therefore, we should only enable the sensor loop if measurement is also enabled - if (bme680Sensor.hasSensor()) - result = bme680Sensor.runOnce(); + if (bmp280Sensor.hasSensor()) + result = bmp280Sensor.runOnce(); if (bme280Sensor.hasSensor()) result = bme280Sensor.runOnce(); + if (bme680Sensor.hasSensor()) + result = bme680Sensor.runOnce(); if (mcp9808Sensor.hasSensor()) result = mcp9808Sensor.runOnce(); if (ina260Sensor.hasSensor()) @@ -196,6 +200,8 @@ bool EnvironmentTelemetryModule::sendOurTelemetry(NodeNum dest, bool wantReplies DEBUG_MSG("-----------------------------------------\n"); DEBUG_MSG("Environment Telemetry: Read data\n"); + if (bmp280Sensor.hasSensor()) + bmp280Sensor.getMetrics(&m); if (bme280Sensor.hasSensor()) bme280Sensor.getMetrics(&m); if (bme680Sensor.hasSensor()) diff --git a/src/modules/Telemetry/Sensor/BMP280Sensor.cpp b/src/modules/Telemetry/Sensor/BMP280Sensor.cpp new file mode 100644 index 000000000..1a41f9236 --- /dev/null +++ b/src/modules/Telemetry/Sensor/BMP280Sensor.cpp @@ -0,0 +1,30 @@ +#include "../mesh/generated/telemetry.pb.h" +#include "configuration.h" +#include "TelemetrySensor.h" +#include "BMP280Sensor.h" +#include +#include + +BMP280Sensor::BMP280Sensor() : + TelemetrySensor(TelemetrySensorType_BME280, "BMP280") +{ +} + +int32_t BMP280Sensor::runOnce() { + DEBUG_MSG("Init sensor: %s\n", sensorName); + if (!hasSensor()) { + return DEFAULT_SENSOR_MINIMUM_WAIT_TIME_BETWEEN_READS; + } + status = bmp280.begin(nodeTelemetrySensorsMap[sensorType]); + return initI2CSensor(); +} + +void BMP280Sensor::setup() { } + +bool BMP280Sensor::getMetrics(Telemetry *measurement) { + DEBUG_MSG("BMP280Sensor::getMetrics\n"); + measurement->variant.environment_metrics.temperature = bmp280.readTemperature(); + measurement->variant.environment_metrics.barometric_pressure = bmp280.readPressure() / 100.0F; + + return true; +} \ No newline at end of file diff --git a/src/modules/Telemetry/Sensor/BMP280Sensor.h b/src/modules/Telemetry/Sensor/BMP280Sensor.h new file mode 100644 index 000000000..3525f3fa3 --- /dev/null +++ b/src/modules/Telemetry/Sensor/BMP280Sensor.h @@ -0,0 +1,16 @@ +#include "../mesh/generated/telemetry.pb.h" +#include "TelemetrySensor.h" +#include + +class BMP280Sensor : virtual public TelemetrySensor { +private: + Adafruit_BMP280 bmp280; + +protected: + virtual void setup() override; + +public: + BMP280Sensor(); + virtual int32_t runOnce() override; + virtual bool getMetrics(Telemetry *measurement) override; +}; \ No newline at end of file