diff --git a/platformio.ini b/platformio.ini index 87eb0afb7..74c6d8071 100644 --- a/platformio.ini +++ b/platformio.ini @@ -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 \ No newline at end of file + https://github.com/meshtastic/DFRobot_LarkWeatherStation#dee914270dc7cb3e43fbf034edd85a63a16a12ee + https://github.com/meshtastic/i2c-sensor#8e97122268960593c8c279df1a84a29970136a8f \ No newline at end of file diff --git a/src/detect/ScanI2C.h b/src/detect/ScanI2C.h index 0a5b360de..c2b113f66 100644 --- a/src/detect/ScanI2C.h +++ b/src/detect/ScanI2C.h @@ -52,7 +52,8 @@ class ScanI2C AHT10, BMX160, DFROBOT_LARK, - NAU7802 + NAU7802, + CUSTOM_SENSOR, } DeviceType; // typedef uint8_t DeviceAddress; diff --git a/src/detect/ScanI2CTwoWire.cpp b/src/detect/ScanI2CTwoWire.cpp index 21e7ca8ac..29a720fc7 100644 --- a/src/detect/ScanI2CTwoWire.cpp +++ b/src/detect/ScanI2CTwoWire.cpp @@ -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); diff --git a/src/main.cpp b/src/main.cpp index 83758d5ee..8e5df894f 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -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 diff --git a/src/modules/Telemetry/EnvironmentTelemetry.cpp b/src/modules/Telemetry/EnvironmentTelemetry.cpp index 31cb2f838..12a119bab 100644 --- a/src/modules/Telemetry/EnvironmentTelemetry.cpp +++ b/src/modules/Telemetry/EnvironmentTelemetry.cpp @@ -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; diff --git a/src/modules/Telemetry/Sensor/CustomI2CSensor.cpp b/src/modules/Telemetry/Sensor/CustomI2CSensor.cpp new file mode 100644 index 000000000..d7674d288 --- /dev/null +++ b/src/modules/Telemetry/Sensor/CustomI2CSensor.cpp @@ -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 \ No newline at end of file diff --git a/src/modules/Telemetry/Sensor/CustomI2CSensor.h b/src/modules/Telemetry/Sensor/CustomI2CSensor.h new file mode 100644 index 000000000..c296a87e5 --- /dev/null +++ b/src/modules/Telemetry/Sensor/CustomI2CSensor.h @@ -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 \ No newline at end of file