From f626539c1845175eef43e36ae18de238f31da1df Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Mon, 24 Jul 2023 12:29:43 +0200 Subject: [PATCH] Refactor MAX17043 driver --- tasmota/my_user_config.h | 3 +- .../tasmota_xsns_sensor/xsns_110_max17043.ino | 94 +++++++------------ 2 files changed, 36 insertions(+), 61 deletions(-) diff --git a/tasmota/my_user_config.h b/tasmota/my_user_config.h index a29158ccf..625368941 100644 --- a/tasmota/my_user_config.h +++ b/tasmota/my_user_config.h @@ -711,9 +711,8 @@ // #define TC74_MAX_SENSORS 8 // Support non-default/multiple I2C addresses // #define TC74_I2C_PROBE_ADDRESSES { 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F } // Addresses to probe/support // #define TC74_MAX_FAILCOUNT 8 // Maximum failed polls before it's marked inactive until reprobing later -// #define USE_MAX17043 // [I2cDriver110] Enable MAX17043 sensor (I2C address 0x36) (+0k9 code) - // #define USE_PCA9557 // [I2cDriver81] Enable PCA9557 8-bit I/O Expander (I2C addresses 0x18 - 0x1F) (+2k5 code) +// #define USE_MAX17043 // [I2cDriver83] Enable MAX17043 fuel-gauge systems Lipo batteries sensor (I2C address 0x36) (+0k9 code) // #define USE_RTC_CHIPS // Enable RTC chip support and NTP server - Select only one // #define USE_DS3231 // [I2cDriver26] Enable DS3231 RTC (I2C address 0x68) (+1k2 code) diff --git a/tasmota/tasmota_xsns_sensor/xsns_110_max17043.ino b/tasmota/tasmota_xsns_sensor/xsns_110_max17043.ino index 28c736465..9a4e235bd 100644 --- a/tasmota/tasmota_xsns_sensor/xsns_110_max17043.ino +++ b/tasmota/tasmota_xsns_sensor/xsns_110_max17043.ino @@ -19,13 +19,6 @@ #ifdef USE_I2C #ifdef USE_MAX17043 - -#define XI2C_83 83 // See I2CDEVICES.md - -#define SENSOR_NAME "MAX17043" - -#include "DFRobot_MAX17043.h" - /*********************************************************************************************\ * MAX17043 fuel-gauge for 3.7 Volt Lipo batteries * @@ -34,7 +27,7 @@ * The alert flag and alert threshold are not required for MQTT, the alert pin is not used * by this sensor driver. * - * Wirering and other information: + * Wiring and other information: * * \lib\lib_i2c\DFRobot_MAX17043\resources * @@ -46,83 +39,66 @@ * * https://www.aliexpress.us/item/2251832479401925.html * - \*********************************************************************************************/ +\*********************************************************************************************/ -#define XSNS_110 110 +#define XSNS_110 110 +#define XI2C_83 83 // See I2CDEVICES.md -const char *mqttId = "MAX17043"; +#include "DFRobot_MAX17043.h" -DFRobot_MAX17043 gauge; // Class to read from MAX17043 +DFRobot_MAX17043 max17043_gauge; // Class to read from MAX17043 +bool max17043 = false; -struct MAX17043 -{ - float voltage = 0.0; // Battery voltage in Volt - float percentage = 0.0; // Battery remaining charge in percent -} *max17043 = nullptr; - - /*********************************************************************************************/ +/*********************************************************************************************/ void Max17043Init(void) { - if (I2cSetDevice(MAX17043_ADDRESS)) { - I2cSetActiveFound(MAX17043_ADDRESS, "MAX17043"); - if (gauge.begin() == 0) { - max17043 = (MAX17043 *)calloc(1, sizeof(struct MAX17043)); + if (max17043_gauge.begin() == 0) { + max17043 = true; + I2cSetActiveFound(MAX17043_ADDRESS, "MAX17043"); } } } -void Max17043Read(void) { +void Max17043Show(bool json) { + float voltage = max17043_gauge.readVoltage() / 1000.0; // Battery voltage in Volt - float percentage = 0.0; - - max17043->voltage = gauge.readVoltage()/1000.0; - - // During charging the percentage might be (slightly) above 100%. To avoid stange numbers - // in the statistics we the percentage provided by this driver will not go above 100% - percentage = gauge.readPercentage(); - if (percentage > 100.0) { - max17043->percentage = 100.0; - } - else { - max17043->percentage = percentage; - } -} - -void Max17043Json(void) { - ResponseAppend_P(PSTR(",\"%s\":{\"" D_JSON_VOLTAGE "\":%3_f,\"" D_JSON_BATTPERCENT "\":%2_f}"), mqttId, &max17043->voltage, &max17043->percentage ); -} + // During charging the percentage might be (slightly) above 100%. To avoid strange numbers + // in the statistics the percentage provided by this driver will not go above 100% + float percentage = max17043_gauge.readPercentage(); // Battery remaining charge in percent + if (percentage > 100.0) { percentage = 100.0; } + if (json) { + ResponseAppend_P(PSTR(",\"MAX17043\":{\"" D_JSON_VOLTAGE "\":%3_f,\"" D_JSON_BATTPERCENT "\":%2_f}"), &voltage, &percentage ); #ifdef USE_WEBSERVER -void Max17043Show(void) { - WSContentSend_PD(PSTR("{s}%s " D_VOLTAGE "{m}%1_f" D_UNIT_VOLT "{e}"), SENSOR_NAME, &max17043->voltage); - WSContentSend_PD(PSTR("{s}%s " D_BATTERY_CHARGE "{m}%1_f %% {e}"), SENSOR_NAME, &max17043->percentage); -} -#endif // USE_WEBSERVER + } else { +// WSContentSend_Voltage("MAX17043", voltage); + WSContentSend_PD(PSTR("{s}MAX17043 " D_VOLTAGE "{m}%1_f" D_UNIT_VOLT "{e}"), &voltage); + WSContentSend_PD(PSTR("{s}MAX17043 " D_BATTERY_CHARGE "{m}%1_f %% {e}"), &percentage); +#endif + } +} /*********************************************************************************************\ * Interface \*********************************************************************************************/ bool Xsns110(uint32_t function) { -if (!I2cEnabled(MAX17043_ADDRESS)) { return false; } + if (!I2cEnabled(MAX17043_ADDRESS)) { return false; } if (FUNC_INIT == function) { Max17043Init(); } - else if (max17043 != nullptr) { + else if (max17043) { switch (function) { - case FUNC_EVERY_SECOND: - Max17043Read(); - break; - case FUNC_JSON_APPEND: - Max17043Json(); - break; - #ifdef USE_WEBSERVER - case FUNC_WEB_SENSOR: - Max17043Show(); + case FUNC_JSON_APPEND: + Max17043Show(1); break; - #endif // USE_WEBSERVER +#ifdef USE_WEBSERVER + case FUNC_WEB_SENSOR: + Max17043Show(0); + break; +#endif // USE_WEBSERVER } } return false;