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,
BMM150,
ADS1X15,
ADS1X15_ALT,
} DeviceType;
// 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
registerValue = getRegisterValue(ScanI2CTwoWire::RegisterLocation(addr, 0x01), 2);
if (registerValue == 0x8583) {
type = ADS1X15;
type = ADS1X15_ALT;
logFoundDevice("ADS1X15", (uint8_t)addr.address);
break;
}

View File

@ -704,7 +704,7 @@ void setup()
scannerToSensorsMap(i2cScanner, ScanI2C::DeviceType::PCT2075, meshtastic_TelemetrySensorType_PCT2075);
scannerToSensorsMap(i2cScanner, ScanI2C::DeviceType::SCD4X, meshtastic_TelemetrySensorType_SCD4X);
scannerToSensorsMap(i2cScanner, ScanI2C::DeviceType::ADS1X15, meshtastic_TelemetrySensorType_ADS1X15);
scannerToSensorsMap(i2cScanner, ScanI2C::DeviceType::ADS1X15_ALT, meshtastic_TelemetrySensorType_ADS1X15_ALT);
i2cScanner.reset();
#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>)
#include "Sensor/ADS1X15Sensor.h"
ADS1X15Sensor ads1x15Sensor;
ADS1X15Sensor ads1x15Sensor_alt(meshtastic_TelemetrySensorType_ADS1X15_ALT);
#else
NullSensor ads1x15Sensor;
NullSensor ads1x15Sensor_alt;
#endif
namespace graphics
@ -57,8 +59,8 @@ int32_t PowerTelemetryModule::runOnce()
without having to configure it from the PythonAPI or WebUI.
*/
moduleConfig.telemetry.power_measurement_enabled = 1;
moduleConfig.telemetry.power_screen_enabled = 1;
// moduleConfig.telemetry.power_measurement_enabled = 1;
// moduleConfig.telemetry.power_screen_enabled = 1;
// moduleConfig.telemetry.power_update_interval = 45;
if (!(moduleConfig.telemetry.power_measurement_enabled)) {
@ -91,9 +93,8 @@ int32_t PowerTelemetryModule::runOnce()
result = max17048Sensor.isInitialized() ? 0 : max17048Sensor.runOnce();
if (ads1x15Sensor.hasSensor())
result = ads1x15Sensor.isInitialized() ? 0 : ads1x15Sensor.runOnce();
if (!ads1x15Sensor.hasSensor()) {
LOG_INFO("ADS1X15 not found");
}
if (ads1x15Sensor_alt.hasSensor())
result = ads1x15Sensor_alt.isInitialized() ? 0 : ads1x15Sensor_alt.runOnce();
}
// 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())
valid = max17048Sensor.getMetrics(m);
if (ads1x15Sensor.hasSensor())
LOG_INFO("Getting ADS1X15 sensor");
valid = ads1x15Sensor.getMetrics(m);
if (ads1x15Sensor_alt.hasSensor())
valid = ads1x15Sensor_alt.getMetrics(m);
#endif
return valid;
@ -268,6 +270,7 @@ bool PowerTelemetryModule::sendTelemetry(NodeNum dest, bool phoneOnly)
m.which_variant = meshtastic_Telemetry_power_metrics_tag;
m.time = getTime();
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, "
"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,

View File

@ -7,7 +7,7 @@
#include "TelemetrySensor.h"
#include <Adafruit_ADS1X15.h>
ADS1X15Sensor::ADS1X15Sensor() : TelemetrySensor(meshtastic_TelemetrySensorType_ADS1X15, "ADS1X15") {}
ADS1X15Sensor::ADS1X15Sensor(meshtastic_TelemetrySensorType sensorType) : TelemetrySensor(sensorType, "ADS1X15") {}
int32_t ADS1X15Sensor::runOnce()
{
@ -94,16 +94,48 @@ bool ADS1X15Sensor::getMetrics(meshtastic_Telemetry *measurement)
struct _ADS1X15Measurements m = getMeasurements();
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;
switch (sensorType)
{
case meshtastic_TelemetrySensorType_ADS1X15:
{
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;
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;
}
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;
}

View File

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