This commit is contained in:
Ben Meadors 2024-09-10 18:25:39 -05:00
parent 8ab2e91df6
commit c0d8602e7c
7 changed files with 142 additions and 7 deletions

View File

@ -151,13 +151,10 @@ lib_deps =
ClosedCube OPT3001@^1.1.2
emotibit/EmotiBit MLX90632@^1.0.8
dfrobot/DFRobot_RTU@^1.0.3
https://github.com/boschsensortec/Bosch-BSEC2-Library#v1.7.2502
boschsensortec/BME68x Sensor Library@^1.1.40407
https://github.com/KodinLanewave/INA3221@^1.0.0
lewisxhe/SensorLib@^0.2.0
mprograms/QMC5883LCompass@^1.2.0
https://github.com/meshtastic/DFRobot_LarkWeatherStation#dee914270dc7cb3e43fbf034edd85a63a16a12ee
https://github.com/meshtastic/i2c-sensor#8e97122268960593c8c279df1a84a29970136a8f

View File

@ -52,7 +52,8 @@ class ScanI2C
AHT10,
BMX160,
DFROBOT_LARK,
NAU7802
NAU7802,
CUSTOM_SENSOR,
} DeviceType;
// typedef uint8_t DeviceAddress;

View File

@ -7,6 +7,7 @@
#include "linux/LinuxHardwareI2C.h"
#endif
#if !defined(ARCH_PORTDUINO) && !defined(ARCH_STM32WL)
#include "I2CDefinitions.h"
#include "main.h" // atecc
#endif
@ -377,6 +378,7 @@ void ScanI2CTwoWire::scanPort(I2CPort port, uint8_t *address, uint8_t asize)
SCAN_SIMPLE_CASE(OPT3001_ADDR, OPT3001, "OPT3001 light sensor found\n");
SCAN_SIMPLE_CASE(MLX90632_ADDR, MLX90632, "MLX90632 IR temp sensor found\n");
SCAN_SIMPLE_CASE(NAU7802_ADDR, NAU7802, "NAU7802 based scale found\n");
SCAN_SIMPLE_CASE(MT_I2C_ADDRESS, CUSTOM_SENSOR, "Meshtastic custom I2C sensor found\n");
default:
LOG_INFO("Device found at address 0x%x was not able to be enumerated\n", addr.address);

View File

@ -569,6 +569,7 @@ void setup()
SCANNER_TO_SENSORS_MAP(ScanI2C::DeviceType::SHT4X, meshtastic_TelemetrySensorType_SHT4X)
SCANNER_TO_SENSORS_MAP(ScanI2C::DeviceType::AHT10, meshtastic_TelemetrySensorType_AHT10)
SCANNER_TO_SENSORS_MAP(ScanI2C::DeviceType::DFROBOT_LARK, meshtastic_TelemetrySensorType_DFROBOT_LARK)
SCANNER_TO_SENSORS_MAP(ScanI2C::DeviceType::CUSTOM_SENSOR, meshtastic_TelemetrySensorType_CUSTOM_SENSOR)
i2cScanner.reset();
#endif

View File

@ -24,6 +24,7 @@
#include "Sensor/BMP085Sensor.h"
#include "Sensor/BMP280Sensor.h"
#include "Sensor/BMP3XXSensor.h"
#include "Sensor/CustomI2CSensor.h"
#include "Sensor/DFRobotLarkSensor.h"
#include "Sensor/LPS22HBSensor.h"
#include "Sensor/MCP9808Sensor.h"
@ -56,6 +57,7 @@ MLX90632Sensor mlx90632Sensor;
DFRobotLarkSensor dfRobotLarkSensor;
NAU7802Sensor nau7802Sensor;
BMP3XXSensor bmp3xxSensor;
CustomI2CSensor customI2CSensor;
#ifdef T1000X_SENSOR_EN
T1000xSensor t1000xSensor;
#endif
@ -82,7 +84,7 @@ int32_t EnvironmentTelemetryModule::runOnce()
*/
// moduleConfig.telemetry.environment_measurement_enabled = 1;
// moduleConfig.telemetry.environment_screen_enabled = 1;
// moduleConfig.telemetry.environment_screen_enabled = 1;
// moduleConfig.telemetry.environment_update_interval = 15;
if (!(moduleConfig.telemetry.environment_measurement_enabled || moduleConfig.telemetry.environment_screen_enabled)) {
@ -143,6 +145,8 @@ int32_t EnvironmentTelemetryModule::runOnce()
result = mlx90632Sensor.runOnce();
if (nau7802Sensor.hasSensor())
result = nau7802Sensor.runOnce();
if (customI2CSensor.hasSensor())
result = customI2CSensor.runOnce();
#endif
}
return result;
@ -397,6 +401,10 @@ bool EnvironmentTelemetryModule::getEnvironmentTelemetry(meshtastic_Telemetry *m
m->variant.environment_metrics.relative_humidity = m_ahtx.variant.environment_metrics.relative_humidity;
}
}
if (customI2CSensor.hasSensor()) {
valid = valid && customI2CSensor.getMetrics(m);
hasSensor = true;
}
#endif
return valid && hasSensor;

View File

@ -0,0 +1,107 @@
#include "configuration.h"
#if !MESHTASTIC_EXCLUDE_ENVIRONMENTAL_SENSOR
#include "../mesh/generated/meshtastic/telemetry.pb.h"
#include "CustomI2CSensor.h"
#include "I2CClient.h"
#include "I2CDefinitions.h"
#include "TelemetrySensor.h"
CustomI2CSensor::CustomI2CSensor() : TelemetrySensor(meshtastic_TelemetrySensorType_CUSTOM_SENSOR, "CUSTOM") {}
int32_t CustomI2CSensor::runOnce()
{
LOG_INFO("Init sensor: %s\n", sensorName);
if (!hasSensor()) {
return DEFAULT_SENSOR_MINIMUM_WAIT_TIME_BETWEEN_READS;
} else {
status = 1;
}
return initI2CSensor();
}
void CustomI2CSensor::setup()
{
// populates lastMetricsRecieved when data is received
Wire.requestFrom(MT_I2C_ADDRESS, meshtastic_EnvironmentMetrics_size);
Wire.onReceive(onReceiveMetrics);
}
bool CustomI2CSensor::getMetrics(meshtastic_Telemetry *measurement)
{
// Wire.requestFrom(MT_I2C_ADDRESS, meshtastic_EnvironmentMetrics_size);
// auto length = Wire.available();
// LOG_DEBUG("CustomI2CSensor::getMetrics=%d\n", length);
// uint8_t buffer[meshtastic_EnvironmentMetrics_size];
// Wire.readBytes(buffer, length);
// meshtastic_EnvironmentMetrics metrics = meshtastic_EnvironmentMetrics_init_zero;
// proto_decode(buffer, meshtastic_EnvironmentMetrics_size, meshtastic_EnvironmentMetrics_fields, &metrics);
measurement->which_variant = meshtastic_Telemetry_environment_metrics_tag;
if (lastMetricsRecieved.has_temperature) {
measurement->variant.environment_metrics.has_temperature = true;
measurement->variant.environment_metrics.temperature = lastMetricsRecieved.temperature;
}
if (lastMetricsRecieved.has_relative_humidity) {
measurement->variant.environment_metrics.has_relative_humidity = true;
measurement->variant.environment_metrics.relative_humidity = lastMetricsRecieved.relative_humidity;
}
if (lastMetricsRecieved.has_barometric_pressure) {
measurement->variant.environment_metrics.has_barometric_pressure = true;
measurement->variant.environment_metrics.barometric_pressure = lastMetricsRecieved.barometric_pressure;
}
if (lastMetricsRecieved.has_gas_resistance) {
measurement->variant.environment_metrics.has_gas_resistance = true;
measurement->variant.environment_metrics.gas_resistance = lastMetricsRecieved.gas_resistance;
}
if (lastMetricsRecieved.has_iaq) {
measurement->variant.environment_metrics.has_iaq = true;
measurement->variant.environment_metrics.iaq = lastMetricsRecieved.iaq;
}
if (lastMetricsRecieved.has_voltage) {
measurement->variant.environment_metrics.has_voltage = true;
measurement->variant.environment_metrics.voltage = lastMetricsRecieved.voltage;
}
if (lastMetricsRecieved.has_current) {
measurement->variant.environment_metrics.has_current = true;
measurement->variant.environment_metrics.current = lastMetricsRecieved.current;
}
if (lastMetricsRecieved.has_distance) {
measurement->variant.environment_metrics.has_distance = true;
measurement->variant.environment_metrics.distance = lastMetricsRecieved.distance;
}
if (lastMetricsRecieved.has_lux) {
measurement->variant.environment_metrics.has_lux = true;
measurement->variant.environment_metrics.lux = lastMetricsRecieved.lux;
}
if (lastMetricsRecieved.has_white_lux) {
measurement->variant.environment_metrics.has_white_lux = true;
measurement->variant.environment_metrics.white_lux = lastMetricsRecieved.white_lux;
}
if (lastMetricsRecieved.has_ir_lux) {
measurement->variant.environment_metrics.has_ir_lux = true;
measurement->variant.environment_metrics.ir_lux = lastMetricsRecieved.ir_lux;
}
if (lastMetricsRecieved.has_uv_lux) {
measurement->variant.environment_metrics.has_uv_lux = true;
measurement->variant.environment_metrics.uv_lux = lastMetricsRecieved.uv_lux;
}
if (lastMetricsRecieved.has_wind_direction) {
measurement->variant.environment_metrics.has_wind_direction = true;
measurement->variant.environment_metrics.wind_direction = lastMetricsRecieved.wind_direction;
}
if (lastMetricsRecieved.has_wind_speed) {
measurement->variant.environment_metrics.has_wind_speed = true;
measurement->variant.environment_metrics.wind_speed = lastMetricsRecieved.wind_speed;
}
if (lastMetricsRecieved.has_wind_lull) {
measurement->variant.environment_metrics.has_wind_lull = true;
measurement->variant.environment_metrics.wind_lull = lastMetricsRecieved.wind_lull;
}
return true;
}
#endif

View File

@ -0,0 +1,19 @@
#include "configuration.h"
#if !MESHTASTIC_EXCLUDE_ENVIRONMENTAL_SENSOR
#include "../mesh/generated/meshtastic/telemetry.pb.h"
#include "TelemetrySensor.h"
class CustomI2CSensor : public TelemetrySensor
{
protected:
virtual void setup() override;
public:
CustomI2CSensor();
virtual int32_t runOnce() override;
virtual bool getMetrics(meshtastic_Telemetry *measurement) override;
};
#endif