mirror of
https://github.com/meshtastic/firmware.git
synced 2025-06-08 14:12:05 +00:00
environment: add DPS310 high-accuracy barometer (#6237)
* dps310: initial scan support * dps310 sensor support * new protobufs * new protobufs * address cr --------- Co-authored-by: Ben Meadors <benmmeadors@gmail.com>
This commit is contained in:
parent
a3a9b2fe84
commit
f5e0e282b6
@ -106,6 +106,7 @@ lib_deps =
|
|||||||
adafruit/Adafruit BMP085 Library@1.2.4
|
adafruit/Adafruit BMP085 Library@1.2.4
|
||||||
adafruit/Adafruit BME280 Library@2.2.4
|
adafruit/Adafruit BME280 Library@2.2.4
|
||||||
adafruit/Adafruit BMP3XX Library@2.1.5
|
adafruit/Adafruit BMP3XX Library@2.1.5
|
||||||
|
adafruit/Adafruit DPS310@1.1.5
|
||||||
adafruit/Adafruit MCP9808 Library@2.0.2
|
adafruit/Adafruit MCP9808 Library@2.0.2
|
||||||
adafruit/Adafruit INA260 Library@1.5.2
|
adafruit/Adafruit INA260 Library@1.5.2
|
||||||
adafruit/Adafruit INA219@1.2.3
|
adafruit/Adafruit INA219@1.2.3
|
||||||
|
@ -67,6 +67,7 @@ class ScanI2C
|
|||||||
INA226,
|
INA226,
|
||||||
NXP_SE050,
|
NXP_SE050,
|
||||||
DFROBOT_RAIN,
|
DFROBOT_RAIN,
|
||||||
|
DPS310,
|
||||||
} DeviceType;
|
} DeviceType;
|
||||||
|
|
||||||
// typedef uint8_t DeviceAddress;
|
// typedef uint8_t DeviceAddress;
|
||||||
|
@ -237,6 +237,16 @@ void ScanI2CTwoWire::scanPort(I2CPort port, uint8_t *address, uint8_t asize)
|
|||||||
logFoundDevice("BMP085/BMP180", (uint8_t)addr.address);
|
logFoundDevice("BMP085/BMP180", (uint8_t)addr.address);
|
||||||
type = BMP_085;
|
type = BMP_085;
|
||||||
break;
|
break;
|
||||||
|
case 0x00:
|
||||||
|
// do we have a DPS310 instead?
|
||||||
|
registerValue = getRegisterValue(ScanI2CTwoWire::RegisterLocation(addr, 0x0D), 1);
|
||||||
|
switch (registerValue) {
|
||||||
|
case 0x10:
|
||||||
|
logFoundDevice("DPS310", (uint8_t)addr.address);
|
||||||
|
type = DPS310;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
registerValue = getRegisterValue(ScanI2CTwoWire::RegisterLocation(addr, 0x00), 1); // GET_ID
|
registerValue = getRegisterValue(ScanI2CTwoWire::RegisterLocation(addr, 0x00), 1); // GET_ID
|
||||||
switch (registerValue) {
|
switch (registerValue) {
|
||||||
|
@ -641,6 +641,7 @@ void setup()
|
|||||||
scannerToSensorsMap(i2cScanner, ScanI2C::DeviceType::MAX30102, meshtastic_TelemetrySensorType_MAX30102);
|
scannerToSensorsMap(i2cScanner, ScanI2C::DeviceType::MAX30102, meshtastic_TelemetrySensorType_MAX30102);
|
||||||
scannerToSensorsMap(i2cScanner, ScanI2C::DeviceType::CGRADSENS, meshtastic_TelemetrySensorType_RADSENS);
|
scannerToSensorsMap(i2cScanner, ScanI2C::DeviceType::CGRADSENS, meshtastic_TelemetrySensorType_RADSENS);
|
||||||
scannerToSensorsMap(i2cScanner, ScanI2C::DeviceType::DFROBOT_RAIN, meshtastic_TelemetrySensorType_DFROBOT_RAIN);
|
scannerToSensorsMap(i2cScanner, ScanI2C::DeviceType::DFROBOT_RAIN, meshtastic_TelemetrySensorType_DFROBOT_RAIN);
|
||||||
|
scannerToSensorsMap(i2cScanner, ScanI2C::DeviceType::DPS310, meshtastic_TelemetrySensorType_DPS310);
|
||||||
|
|
||||||
i2cScanner.reset();
|
i2cScanner.reset();
|
||||||
#endif
|
#endif
|
||||||
|
@ -29,6 +29,7 @@
|
|||||||
#include "Sensor/CGRadSensSensor.h"
|
#include "Sensor/CGRadSensSensor.h"
|
||||||
#include "Sensor/DFRobotGravitySensor.h"
|
#include "Sensor/DFRobotGravitySensor.h"
|
||||||
#include "Sensor/DFRobotLarkSensor.h"
|
#include "Sensor/DFRobotLarkSensor.h"
|
||||||
|
#include "Sensor/DPS310Sensor.h"
|
||||||
#include "Sensor/LPS22HBSensor.h"
|
#include "Sensor/LPS22HBSensor.h"
|
||||||
#include "Sensor/MCP9808Sensor.h"
|
#include "Sensor/MCP9808Sensor.h"
|
||||||
#include "Sensor/MLX90632Sensor.h"
|
#include "Sensor/MLX90632Sensor.h"
|
||||||
@ -45,6 +46,7 @@ BMP085Sensor bmp085Sensor;
|
|||||||
BMP280Sensor bmp280Sensor;
|
BMP280Sensor bmp280Sensor;
|
||||||
BME280Sensor bme280Sensor;
|
BME280Sensor bme280Sensor;
|
||||||
BME680Sensor bme680Sensor;
|
BME680Sensor bme680Sensor;
|
||||||
|
DPS310Sensor dps310Sensor;
|
||||||
MCP9808Sensor mcp9808Sensor;
|
MCP9808Sensor mcp9808Sensor;
|
||||||
SHTC3Sensor shtc3Sensor;
|
SHTC3Sensor shtc3Sensor;
|
||||||
LPS22HBSensor lps22hbSensor;
|
LPS22HBSensor lps22hbSensor;
|
||||||
@ -127,6 +129,8 @@ int32_t EnvironmentTelemetryModule::runOnce()
|
|||||||
result = bmp3xxSensor.runOnce();
|
result = bmp3xxSensor.runOnce();
|
||||||
if (bme680Sensor.hasSensor())
|
if (bme680Sensor.hasSensor())
|
||||||
result = bme680Sensor.runOnce();
|
result = bme680Sensor.runOnce();
|
||||||
|
if (dps310Sensor.hasSensor())
|
||||||
|
result = dps310Sensor.runOnce();
|
||||||
if (mcp9808Sensor.hasSensor())
|
if (mcp9808Sensor.hasSensor())
|
||||||
result = mcp9808Sensor.runOnce();
|
result = mcp9808Sensor.runOnce();
|
||||||
if (shtc3Sensor.hasSensor())
|
if (shtc3Sensor.hasSensor())
|
||||||
@ -418,6 +422,10 @@ bool EnvironmentTelemetryModule::getEnvironmentTelemetry(meshtastic_Telemetry *m
|
|||||||
valid = valid && bme680Sensor.getMetrics(m);
|
valid = valid && bme680Sensor.getMetrics(m);
|
||||||
hasSensor = true;
|
hasSensor = true;
|
||||||
}
|
}
|
||||||
|
if (dps310Sensor.hasSensor()) {
|
||||||
|
valid = valid && dps310Sensor.getMetrics(m);
|
||||||
|
hasSensor = true;
|
||||||
|
}
|
||||||
if (mcp9808Sensor.hasSensor()) {
|
if (mcp9808Sensor.hasSensor()) {
|
||||||
valid = valid && mcp9808Sensor.getMetrics(m);
|
valid = valid && mcp9808Sensor.getMetrics(m);
|
||||||
hasSensor = true;
|
hasSensor = true;
|
||||||
@ -632,6 +640,11 @@ AdminMessageHandleResult EnvironmentTelemetryModule::handleAdminMessageForModule
|
|||||||
if (result != AdminMessageHandleResult::NOT_HANDLED)
|
if (result != AdminMessageHandleResult::NOT_HANDLED)
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
if (dps310Sensor.hasSensor()) {
|
||||||
|
result = dps310Sensor.handleAdminMessage(mp, request, response);
|
||||||
|
if (result != AdminMessageHandleResult::NOT_HANDLED)
|
||||||
|
return result;
|
||||||
|
}
|
||||||
if (mcp9808Sensor.hasSensor()) {
|
if (mcp9808Sensor.hasSensor()) {
|
||||||
result = mcp9808Sensor.handleAdminMessage(mp, request, response);
|
result = mcp9808Sensor.handleAdminMessage(mp, request, response);
|
||||||
if (result != AdminMessageHandleResult::NOT_HANDLED)
|
if (result != AdminMessageHandleResult::NOT_HANDLED)
|
||||||
|
45
src/modules/Telemetry/Sensor/DPS310Sensor.cpp
Normal file
45
src/modules/Telemetry/Sensor/DPS310Sensor.cpp
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
#include "configuration.h"
|
||||||
|
|
||||||
|
#if !MESHTASTIC_EXCLUDE_ENVIRONMENTAL_SENSOR
|
||||||
|
|
||||||
|
#include "../mesh/generated/meshtastic/telemetry.pb.h"
|
||||||
|
#include "DPS310Sensor.h"
|
||||||
|
#include "TelemetrySensor.h"
|
||||||
|
#include <Adafruit_DPS310.h>
|
||||||
|
|
||||||
|
DPS310Sensor::DPS310Sensor() : TelemetrySensor(meshtastic_TelemetrySensorType_DPS310, "DPS310") {}
|
||||||
|
|
||||||
|
int32_t DPS310Sensor::runOnce()
|
||||||
|
{
|
||||||
|
LOG_INFO("Init sensor: %s", sensorName);
|
||||||
|
if (!hasSensor()) {
|
||||||
|
return DEFAULT_SENSOR_MINIMUM_WAIT_TIME_BETWEEN_READS;
|
||||||
|
}
|
||||||
|
status = dps310.begin_I2C(nodeTelemetrySensorsMap[sensorType].first, nodeTelemetrySensorsMap[sensorType].second);
|
||||||
|
|
||||||
|
dps310.configurePressure(DPS310_1HZ, DPS310_4SAMPLES);
|
||||||
|
dps310.configureTemperature(DPS310_1HZ, DPS310_4SAMPLES);
|
||||||
|
dps310.setMode(DPS310_CONT_PRESTEMP);
|
||||||
|
|
||||||
|
return initI2CSensor();
|
||||||
|
}
|
||||||
|
|
||||||
|
void DPS310Sensor::setup() {}
|
||||||
|
|
||||||
|
bool DPS310Sensor::getMetrics(meshtastic_Telemetry *measurement)
|
||||||
|
{
|
||||||
|
sensors_event_t temp, press;
|
||||||
|
|
||||||
|
if (!dps310.getEvents(&temp, &press)) {
|
||||||
|
LOG_DEBUG("DPS310 getEvents no data");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
measurement->variant.environment_metrics.has_temperature = true;
|
||||||
|
measurement->variant.environment_metrics.has_barometric_pressure = true;
|
||||||
|
measurement->variant.environment_metrics.temperature = temp.temperature;
|
||||||
|
measurement->variant.environment_metrics.barometric_pressure = press.pressure;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
#endif
|
23
src/modules/Telemetry/Sensor/DPS310Sensor.h
Normal file
23
src/modules/Telemetry/Sensor/DPS310Sensor.h
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
#include "configuration.h"
|
||||||
|
|
||||||
|
#if !MESHTASTIC_EXCLUDE_ENVIRONMENTAL_SENSOR
|
||||||
|
|
||||||
|
#include "../mesh/generated/meshtastic/telemetry.pb.h"
|
||||||
|
#include "TelemetrySensor.h"
|
||||||
|
#include <Adafruit_DPS310.h>
|
||||||
|
|
||||||
|
class DPS310Sensor : public TelemetrySensor
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
Adafruit_DPS310 dps310;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
virtual void setup() override;
|
||||||
|
|
||||||
|
public:
|
||||||
|
DPS310Sensor();
|
||||||
|
virtual int32_t runOnce() override;
|
||||||
|
virtual bool getMetrics(meshtastic_Telemetry *measurement) override;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
Loading…
Reference in New Issue
Block a user