Add additional ADS1X15 to support daisy chaining

This commit is contained in:
oscgonfer 2025-06-28 16:22:33 +02:00
parent cf39519c83
commit 1f424a7f82
6 changed files with 54 additions and 18 deletions

View File

@ -76,6 +76,7 @@ class ScanI2C
PCT2075, PCT2075,
BMM150, BMM150,
ADS1X15, ADS1X15,
ADS1X15_ALT,
} DeviceType; } DeviceType;
// typedef uint8_t DeviceAddress; // typedef uint8_t DeviceAddress;

View File

@ -599,7 +599,7 @@ void ScanI2CTwoWire::scanPort(I2CPort port, uint8_t *address, uint8_t asize)
// ADS1X15 default config register is 8583h // ADS1X15 default config register is 8583h
registerValue = getRegisterValue(ScanI2CTwoWire::RegisterLocation(addr, 0x01), 2); registerValue = getRegisterValue(ScanI2CTwoWire::RegisterLocation(addr, 0x01), 2);
if (registerValue == 0x8583) { if (registerValue == 0x8583) {
type = ADS1X15; type = ADS1X15_ALT;
logFoundDevice("ADS1X15", (uint8_t)addr.address); logFoundDevice("ADS1X15", (uint8_t)addr.address);
break; break;
} }

View File

@ -704,7 +704,7 @@ void setup()
scannerToSensorsMap(i2cScanner, ScanI2C::DeviceType::PCT2075, meshtastic_TelemetrySensorType_PCT2075); scannerToSensorsMap(i2cScanner, ScanI2C::DeviceType::PCT2075, meshtastic_TelemetrySensorType_PCT2075);
scannerToSensorsMap(i2cScanner, ScanI2C::DeviceType::SCD4X, meshtastic_TelemetrySensorType_SCD4X); scannerToSensorsMap(i2cScanner, ScanI2C::DeviceType::SCD4X, meshtastic_TelemetrySensorType_SCD4X);
scannerToSensorsMap(i2cScanner, ScanI2C::DeviceType::ADS1X15, meshtastic_TelemetrySensorType_ADS1X15); scannerToSensorsMap(i2cScanner, ScanI2C::DeviceType::ADS1X15, meshtastic_TelemetrySensorType_ADS1X15);
scannerToSensorsMap(i2cScanner, ScanI2C::DeviceType::ADS1X15_ALT, meshtastic_TelemetrySensorType_ADS1X15_ALT);
i2cScanner.reset(); i2cScanner.reset();
#endif #endif

View File

@ -33,8 +33,10 @@ extern void drawCommonHeader(OLEDDisplay *display, int16_t x, int16_t y, const c
#if __has_include(<Adafruit_ADS1X15.h>) #if __has_include(<Adafruit_ADS1X15.h>)
#include "Sensor/ADS1X15Sensor.h" #include "Sensor/ADS1X15Sensor.h"
ADS1X15Sensor ads1x15Sensor; ADS1X15Sensor ads1x15Sensor;
ADS1X15Sensor ads1x15Sensor_alt(meshtastic_TelemetrySensorType_ADS1X15_ALT);
#else #else
NullSensor ads1x15Sensor; NullSensor ads1x15Sensor;
NullSensor ads1x15Sensor_alt;
#endif #endif
namespace graphics namespace graphics
@ -57,8 +59,8 @@ int32_t PowerTelemetryModule::runOnce()
without having to configure it from the PythonAPI or WebUI. without having to configure it from the PythonAPI or WebUI.
*/ */
moduleConfig.telemetry.power_measurement_enabled = 1; // moduleConfig.telemetry.power_measurement_enabled = 1;
moduleConfig.telemetry.power_screen_enabled = 1; // moduleConfig.telemetry.power_screen_enabled = 1;
// moduleConfig.telemetry.power_update_interval = 45; // moduleConfig.telemetry.power_update_interval = 45;
if (!(moduleConfig.telemetry.power_measurement_enabled)) { if (!(moduleConfig.telemetry.power_measurement_enabled)) {
@ -91,9 +93,8 @@ int32_t PowerTelemetryModule::runOnce()
result = max17048Sensor.isInitialized() ? 0 : max17048Sensor.runOnce(); result = max17048Sensor.isInitialized() ? 0 : max17048Sensor.runOnce();
if (ads1x15Sensor.hasSensor()) if (ads1x15Sensor.hasSensor())
result = ads1x15Sensor.isInitialized() ? 0 : ads1x15Sensor.runOnce(); result = ads1x15Sensor.isInitialized() ? 0 : ads1x15Sensor.runOnce();
if (!ads1x15Sensor.hasSensor()) { if (ads1x15Sensor_alt.hasSensor())
LOG_INFO("ADS1X15 not found"); result = ads1x15Sensor_alt.isInitialized() ? 0 : ads1x15Sensor_alt.runOnce();
}
} }
// it's possible to have this module enabled, only for displaying values on the screen. // it's possible to have this module enabled, only for displaying values on the screen.
@ -226,8 +227,9 @@ bool PowerTelemetryModule::getPowerTelemetry(meshtastic_Telemetry *m)
if (max17048Sensor.hasSensor()) if (max17048Sensor.hasSensor())
valid = max17048Sensor.getMetrics(m); valid = max17048Sensor.getMetrics(m);
if (ads1x15Sensor.hasSensor()) if (ads1x15Sensor.hasSensor())
LOG_INFO("Getting ADS1X15 sensor");
valid = ads1x15Sensor.getMetrics(m); valid = ads1x15Sensor.getMetrics(m);
if (ads1x15Sensor_alt.hasSensor())
valid = ads1x15Sensor_alt.getMetrics(m);
#endif #endif
return valid; return valid;
@ -268,6 +270,7 @@ bool PowerTelemetryModule::sendTelemetry(NodeNum dest, bool phoneOnly)
m.which_variant = meshtastic_Telemetry_power_metrics_tag; m.which_variant = meshtastic_Telemetry_power_metrics_tag;
m.time = getTime(); m.time = getTime();
if (getPowerTelemetry(&m)) { if (getPowerTelemetry(&m)) {
// TODO - Consider adding all 8 channels here - seems a bit much?
LOG_INFO("Send: ch1_voltage=%f, ch1_current=%f, ch2_voltage=%f, ch2_current=%f, " LOG_INFO("Send: ch1_voltage=%f, ch1_current=%f, ch2_voltage=%f, ch2_current=%f, "
"ch3_voltage=%f, ch3_current=%f, ch4_voltage=%f", "ch3_voltage=%f, ch3_current=%f, ch4_voltage=%f",
m.variant.power_metrics.ch1_voltage, m.variant.power_metrics.ch1_current, m.variant.power_metrics.ch2_voltage, m.variant.power_metrics.ch1_voltage, m.variant.power_metrics.ch1_current, m.variant.power_metrics.ch2_voltage,

View File

@ -7,7 +7,7 @@
#include "TelemetrySensor.h" #include "TelemetrySensor.h"
#include <Adafruit_ADS1X15.h> #include <Adafruit_ADS1X15.h>
ADS1X15Sensor::ADS1X15Sensor() : TelemetrySensor(meshtastic_TelemetrySensorType_ADS1X15, "ADS1X15") {} ADS1X15Sensor::ADS1X15Sensor(meshtastic_TelemetrySensorType sensorType) : TelemetrySensor(sensorType, "ADS1X15") {}
int32_t ADS1X15Sensor::runOnce() int32_t ADS1X15Sensor::runOnce()
{ {
@ -94,16 +94,48 @@ bool ADS1X15Sensor::getMetrics(meshtastic_Telemetry *measurement)
struct _ADS1X15Measurements m = getMeasurements(); struct _ADS1X15Measurements m = getMeasurements();
measurement->variant.power_metrics.has_ch1_voltage = true; switch (sensorType)
measurement->variant.power_metrics.has_ch2_voltage = true; {
measurement->variant.power_metrics.has_ch3_voltage = true; case meshtastic_TelemetrySensorType_ADS1X15:
measurement->variant.power_metrics.has_ch4_voltage = true; {
measurement->variant.power_metrics.has_ch1_voltage = true;
measurement->variant.power_metrics.has_ch2_voltage = true;
measurement->variant.power_metrics.has_ch3_voltage = true;
measurement->variant.power_metrics.has_ch4_voltage = true;
measurement->variant.power_metrics.ch1_voltage = m.measurements[0].voltage; measurement->variant.power_metrics.ch1_voltage = m.measurements[0].voltage;
measurement->variant.power_metrics.ch2_voltage = m.measurements[1].voltage; measurement->variant.power_metrics.ch2_voltage = m.measurements[1].voltage;
measurement->variant.power_metrics.ch3_voltage = m.measurements[2].voltage; measurement->variant.power_metrics.ch3_voltage = m.measurements[2].voltage;
measurement->variant.power_metrics.ch4_voltage = m.measurements[3].voltage; measurement->variant.power_metrics.ch4_voltage = m.measurements[3].voltage;
break;
}
case meshtastic_TelemetrySensorType_ADS1X15_ALT:
{
measurement->variant.power_metrics.has_ch5_voltage = true;
measurement->variant.power_metrics.has_ch6_voltage = true;
measurement->variant.power_metrics.has_ch7_voltage = true;
measurement->variant.power_metrics.has_ch8_voltage = true;
measurement->variant.power_metrics.ch5_voltage = m.measurements[0].voltage;
measurement->variant.power_metrics.ch6_voltage = m.measurements[1].voltage;
measurement->variant.power_metrics.ch7_voltage = m.measurements[2].voltage;
measurement->variant.power_metrics.ch8_voltage = m.measurements[3].voltage;
break;
}
default:
{
measurement->variant.power_metrics.has_ch1_voltage = true;
measurement->variant.power_metrics.has_ch2_voltage = true;
measurement->variant.power_metrics.has_ch3_voltage = true;
measurement->variant.power_metrics.has_ch4_voltage = true;
measurement->variant.power_metrics.ch1_voltage = m.measurements[0].voltage;
measurement->variant.power_metrics.ch2_voltage = m.measurements[1].voltage;
measurement->variant.power_metrics.ch3_voltage = m.measurements[2].voltage;
measurement->variant.power_metrics.ch4_voltage = m.measurements[3].voltage;
break;
}
}
return true; return true;
} }

View File

@ -21,7 +21,7 @@ class ADS1X15Sensor : public TelemetrySensor
virtual void setup() override; virtual void setup() override;
public: public:
ADS1X15Sensor(); ADS1X15Sensor(meshtastic_TelemetrySensorType sensorType = meshtastic_TelemetrySensorType_ADS1X15);
virtual int32_t runOnce() override; virtual int32_t runOnce() override;
virtual bool getMetrics(meshtastic_Telemetry *measurement) override; virtual bool getMetrics(meshtastic_Telemetry *measurement) override;
}; };