diff --git a/data_svelte/widgets.json b/data_svelte/widgets.json index ba91a71f..366137aa 100644 --- a/data_svelte/widgets.json +++ b/data_svelte/widgets.json @@ -61,6 +61,13 @@ } ] }, + { + "name": "anydatamWtt", + "label": "миллиВатты", + "widget": "anydata", + "after": "mW", + "icon": "speedometer", + }, { "name": "anydataWth", "label": "Энергия", diff --git a/data_svelte_lite/widgets.json b/data_svelte_lite/widgets.json index ba91a71f..366137aa 100644 --- a/data_svelte_lite/widgets.json +++ b/data_svelte_lite/widgets.json @@ -61,6 +61,13 @@ } ] }, + { + "name": "anydatamWtt", + "label": "миллиВатты", + "widget": "anydata", + "after": "mW", + "icon": "speedometer", + }, { "name": "anydataWth", "label": "Энергия", diff --git a/src/modules/sensors/Ina219/Ina219.cpp b/src/modules/sensors/Ina219/Ina219.cpp index 6ab65897..b81843f0 100644 --- a/src/modules/sensors/Ina219/Ina219.cpp +++ b/src/modules/sensors/Ina219/Ina219.cpp @@ -11,126 +11,198 @@ #include #include +#include -Adafruit_INA219 ina219; +// Adafruit_INA219 ina219; +// Структура для хранения данных с датчика +struct Ina219Value +{ + float shuntvoltage = 0; + float busvoltage = 0; +}; +// глобальные списки необходимы для хранения данных, полученных разными датчиками из модуля. Ключ - адрес +std::map ina219ValueArray; - float shuntvoltage = 0; - float busvoltage = 0; - float current_mA = 0; - float loadvoltage = 0; - float power_mW = 0; +// глобальные списки необходимы для хранения объектов используемых разными датчиками из модуля. Ключ - адрес +std::map ina219Array; - // shuntvoltage = ina219.getShuntVoltage_mV(); // Получение напряжение на шунте - // busvoltage = ina219.getBusVoltage_V(); // Получение значение напряжения V - // current_mA = ina219.getCurrent_mA(); // Получение значение тока в мА - // power_mW = ina219.getPower_mW(); // Получение значение мощности - // loadvoltage = busvoltage + (shuntvoltage / 1000); // Расчет напряжение на нагрузки +// Функция инициализации библиотечного класса, возвращает Единстрвенный указать на библиотеку +Adafruit_INA219 *instanceIna219(uint8_t ADDR) +{ + /** default I2C address **/ + if (ADDR == 0) + ADDR = INA219_ADDRESS; // 1000000 (A0+A1=GND) - class Ina219loadvoltage : public IoTItem { - public: - Ina219loadvoltage(String parameters) : IoTItem(parameters) { + // учитываем, что библиотека может работать с несколькими линиями на разных пинах, поэтому инициируем библиотеку, если линия ранее не использовалась + if (ina219Array.find(ADDR) == ina219Array.end()) + { + ina219Array[ADDR] = new Adafruit_INA219((uint8_t)ADDR); + ina219Array[ADDR]->begin(); + ina219ValueArray[ADDR] = new Ina219Value; + } + return ina219Array[ADDR]; +} - // Wire.begin(2,0); // Инициализация шины I2C для модуля E01 +/* +float shuntvoltage = 0; +float busvoltage = 0; +float current_mA = 0; +float loadvoltage = 0; +float power_mW = 0; +*/ +// shuntvoltage = ina219.getShuntVoltage_mV(); // Получение напряжение на шунте +// busvoltage = ina219.getBusVoltage_V(); // Получение значение напряжения V +// current_mA = ina219.getCurrent_mA(); // Получение значение тока в мА +// power_mW = ina219.getPower_mW(); // Получение значение мощности +// loadvoltage = busvoltage + (shuntvoltage / 1000); // Расчет напряжение на нагрузки + +class Ina219loadvoltage : public IoTItem +{ +private: + uint8_t _addr = 0; + +public: + Ina219loadvoltage(String parameters) : IoTItem(parameters) + { + String sAddr; + jsonRead(parameters, "addr", sAddr); + if (sAddr == "") + scanI2C(); + else + _addr = hexStringToUint8(sAddr); } - void doByInterval() { - - loadvoltage = busvoltage + (shuntvoltage / 1000); - value.valD = loadvoltage; - - regEvent(value.valD, "Ina219loadvoltage"); + void doByInterval() + { + value.valD = ina219ValueArray[_addr]->busvoltage + (ina219ValueArray[_addr]->shuntvoltage / 1000); + regEvent(value.valD, "Ina219loadvoltage"); } ~Ina219loadvoltage(){}; }; - class Ina219busvoltage : public IoTItem { - public: - Ina219busvoltage(String parameters) : IoTItem(parameters) { +class Ina219busvoltage : public IoTItem +{ +private: + uint8_t _addr = 0; - // Wire.begin(2,0); // Инициализация шины I2C для модуля E01 +public: + Ina219busvoltage(String parameters) : IoTItem(parameters) + { + String sAddr; + jsonRead(parameters, "addr", sAddr); + if (sAddr == "") + scanI2C(); + else + _addr = hexStringToUint8(sAddr); } - void doByInterval() { - - busvoltage = ina219.getBusVoltage_V(); - value.valD = busvoltage; - - regEvent(value.valD, "Ina219busvoltage"); + void doByInterval() + { + ina219ValueArray[_addr]->busvoltage = instanceIna219(_addr)->getBusVoltage_V(); + value.valD = ina219ValueArray[_addr]->busvoltage; + regEvent(value.valD, "Ina219busvoltage"); } ~Ina219busvoltage(){}; }; +class Ina219shuntvoltage : public IoTItem +{ +private: + uint8_t _addr = 0; -class Ina219curr : public IoTItem { - public: - Ina219curr(String parameters) : IoTItem(parameters) { - - // Wire.begin(2,0); // Инициализация шины I2C для модуля E01 +public: + Ina219shuntvoltage(String parameters) : IoTItem(parameters) + { + String sAddr; + jsonRead(parameters, "addr", sAddr); + if (sAddr == "") + scanI2C(); + else + _addr = hexStringToUint8(sAddr); } - void doByInterval() { - - current_mA = ina219.getCurrent_mA(); - value.valD = current_mA; - - regEvent(value.valD, "Ina219curr"); - } - - ~Ina219curr(){}; -}; - -class Ina219shuntvoltage : public IoTItem { - public: - Ina219shuntvoltage(String parameters) : IoTItem(parameters) { - - // Wire.begin(2,0); // Инициализация шины I2C для модуля E01 - } - void doByInterval() { - - shuntvoltage = ina219.getShuntVoltage_mV(); - value.valD = shuntvoltage; - - regEvent(value.valD, "Ina219shuntvoltage"); + void doByInterval() + { + ina219ValueArray[_addr]->shuntvoltage = instanceIna219(_addr)->getShuntVoltage_mV(); + value.valD = ina219ValueArray[_addr]->shuntvoltage; + regEvent(value.valD, "Ina219shuntvoltage"); } ~Ina219shuntvoltage(){}; }; -class Power_mW : public IoTItem { - public: - Power_mW(String parameters) : IoTItem(parameters) { +class Ina219curr : public IoTItem +{ +private: + uint8_t _addr = 0; - // Wire.begin(2,0); // Инициализация шины I2C для модуля E01 +public: + Ina219curr(String parameters) : IoTItem(parameters) + { + String sAddr; + jsonRead(parameters, "addr", sAddr); + if (sAddr == "") + scanI2C(); + else + _addr = hexStringToUint8(sAddr); } - void doByInterval() { - - power_mW = ina219.getPower_mW(); - value.valD = power_mW; - - regEvent(value.valD, "Ina219power"); // TODO: найти способ понимания ошибки получения данных - + void doByInterval() + { + value.valD = instanceIna219(_addr)->getCurrent_mA(); + regEvent(value.valD, "Ina219curr"); } - ~Power_mW(){}; + ~Ina219curr(){}; }; -void* getAPI_Ina219(String subtype, String param) { - if (subtype == F("Ina219curr")) { - ina219.begin(); + +class Ina219Power_mW : public IoTItem +{ +private: + uint8_t _addr = 0; + +public: + Ina219Power_mW(String parameters) : IoTItem(parameters) + { + String sAddr; + jsonRead(parameters, "addr", sAddr); + if (sAddr == "") + scanI2C(); + else + _addr = hexStringToUint8(sAddr); + } + void doByInterval() + { + value.valD = instanceIna219(_addr)->getPower_mW(); + regEvent(value.valD, "Ina219power"); // TODO: найти способ понимания ошибки получения данных + } + + ~Ina219Power_mW(){}; +}; +void *getAPI_Ina219(String subtype, String param) +{ + if (subtype == F("Ina219curr")) + { return new Ina219curr(param); - } else if (subtype == F("Ina219shuntvoltage")) { - ina219.begin(); + } + else if (subtype == F("Ina219shuntvoltage")) + { return new Ina219shuntvoltage(param); - } else if (subtype == F("power_mW")) { - ina219.begin(); - return new Power_mW(param); - } else if (subtype == F("Ina219busvoltage")) { - ina219.begin(); + } + else if (subtype == F("Ina219power_mW")) + { + return new Ina219Power_mW(param); + } + else if (subtype == F("Ina219busvoltage")) + { return new Ina219busvoltage(param); - } else if (subtype == F("Ina219loadvoltage")) { - ina219.begin(); + } + else if (subtype == F("Ina219loadvoltage")) + { return new Ina219loadvoltage(param); - } else { - return nullptr; + } + else + { + return nullptr; } } diff --git a/src/modules/sensors/Ina219/modinfo.json b/src/modules/sensors/Ina219/modinfo.json index 9bc76dbd..510e768c 100644 --- a/src/modules/sensors/Ina219/modinfo.json +++ b/src/modules/sensors/Ina219/modinfo.json @@ -10,6 +10,7 @@ "widget": "anydatamAmp", "page": "INA 219", "descr": "219 Датчик тока", + "addr": "0x40", "int": 10 }, { @@ -21,17 +22,19 @@ "widget": "anydataVlt", "page": "INA 219", "descr": "219 Датчик напряжения", + "addr": "0x40", "int": 10 }, { "global": 0, "name": "INA219 Мощность", "type": "Reading", - "subtype": "power_mW", + "subtype": "Ina219power_mW", "id": "Ina219power", "widget": "anydatamWtt", "page": "INA 219", "descr": "219 Мощность", + "addr": "0x40", "int": 10 }, { @@ -43,6 +46,7 @@ "widget": "anydataVlt", "page": "INA 219", "descr": "219 Напряжение нагрузки", + "addr": "0x40", "int": 10 }, { @@ -54,6 +58,7 @@ "widget": "anydatamVlt", "page": "INA 219", "descr": "219 Напряжение шунта", + "addr": "0x40", "int": 10 }], @@ -61,9 +66,9 @@ "authorName": "Serghei Crasnicov", "authorContact": "https://t.me/Serghei63", "authorGit": "https://github.com/Serghei63", - "specialThanks": "Дмитрий , Serg", + "specialThanks": "Дмитрий, Serg, v2.0 - Mitchel @Mit4bmw", "moduleName": "Ina219", - "moduleVersion": "1.0", + "moduleVersion": "2.0", "usedRam": { "esp32_4mb": 15, "esp8266_4mb": 15 @@ -71,14 +76,15 @@ "subTypes": [ "Ina219curr", "Ina219busvoltage", - "power_mW", + "Ina219power_mW", "Ina219loadvoltage", "Ina219shuntvoltage" ], "title": "Милливатметр постоянного тока", "moduleDesc": "Измеряет постоянный ток до 3.2 ампера, напряжение до 26 вольт и мощность на нагрузке", "propInfo": { - "int": "Количество секунд между опросами датчика." + "int": "Количество секунд между опросами датчика.", + "addr": "Адрес датчика на шине, обычно 0x40. Если оставить поле пустым, то запуститься сканер I2C и подключение к адресу 0x40" } },