new version Ina219

This commit is contained in:
Mit4el
2023-06-21 23:58:18 +03:00
parent 7c2631800a
commit d4b601d206
4 changed files with 182 additions and 90 deletions

View File

@@ -61,6 +61,13 @@
} }
] ]
}, },
{
"name": "anydatamWtt",
"label": "миллиВатты",
"widget": "anydata",
"after": "mW",
"icon": "speedometer",
},
{ {
"name": "anydataWth", "name": "anydataWth",
"label": "Энергия", "label": "Энергия",

View File

@@ -61,6 +61,13 @@
} }
] ]
}, },
{
"name": "anydatamWtt",
"label": "миллиВатты",
"widget": "anydata",
"after": "mW",
"icon": "speedometer",
},
{ {
"name": "anydataWth", "name": "anydataWth",
"label": "Энергия", "label": "Энергия",

View File

@@ -11,126 +11,198 @@
#include <Wire.h> #include <Wire.h>
#include <Adafruit_INA219.h> #include <Adafruit_INA219.h>
#include <map>
Adafruit_INA219 ina219; // Adafruit_INA219 ina219;
// Структура для хранения данных с датчика
struct Ina219Value
{
float shuntvoltage = 0;
float busvoltage = 0;
};
// глобальные списки необходимы для хранения данных, полученных разными датчиками из модуля. Ключ - адрес
std::map<uint8_t, Ina219Value *> ina219ValueArray;
float shuntvoltage = 0; // глобальные списки необходимы для хранения объектов используемых разными датчиками из модуля. Ключ - адрес
float busvoltage = 0; std::map<uint8_t, Adafruit_INA219 *> ina219Array;
float current_mA = 0;
float loadvoltage = 0;
float power_mW = 0;
// shuntvoltage = ina219.getShuntVoltage_mV(); // Получение напряжение на шунте // Функция инициализации библиотечного класса, возвращает Единстрвенный указать на библиотеку
// busvoltage = ina219.getBusVoltage_V(); // Получение значение напряжения V Adafruit_INA219 *instanceIna219(uint8_t ADDR)
// current_mA = ina219.getCurrent_mA(); // Получение значение тока в мА {
// power_mW = ina219.getPower_mW(); // Получение значение мощности /** default I2C address **/
// loadvoltage = busvoltage + (shuntvoltage / 1000); // Расчет напряжение на нагрузки if (ADDR == 0)
ADDR = INA219_ADDRESS; // 1000000 (A0+A1=GND)
class Ina219loadvoltage : public IoTItem { // учитываем, что библиотека может работать с несколькими линиями на разных пинах, поэтому инициируем библиотеку, если линия ранее не использовалась
public: if (ina219Array.find(ADDR) == ina219Array.end())
Ina219loadvoltage(String parameters) : IoTItem(parameters) { {
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() { void doByInterval()
{
loadvoltage = busvoltage + (shuntvoltage / 1000); value.valD = ina219ValueArray[_addr]->busvoltage + (ina219ValueArray[_addr]->shuntvoltage / 1000);
value.valD = loadvoltage; regEvent(value.valD, "Ina219loadvoltage");
regEvent(value.valD, "Ina219loadvoltage");
} }
~Ina219loadvoltage(){}; ~Ina219loadvoltage(){};
}; };
class Ina219busvoltage : public IoTItem { class Ina219busvoltage : public IoTItem
public: {
Ina219busvoltage(String parameters) : IoTItem(parameters) { 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() { void doByInterval()
{
busvoltage = ina219.getBusVoltage_V(); ina219ValueArray[_addr]->busvoltage = instanceIna219(_addr)->getBusVoltage_V();
value.valD = busvoltage; value.valD = ina219ValueArray[_addr]->busvoltage;
regEvent(value.valD, "Ina219busvoltage");
regEvent(value.valD, "Ina219busvoltage");
} }
~Ina219busvoltage(){}; ~Ina219busvoltage(){};
}; };
class Ina219shuntvoltage : public IoTItem
{
private:
uint8_t _addr = 0;
class Ina219curr : public IoTItem { public:
public: Ina219shuntvoltage(String parameters) : IoTItem(parameters)
Ina219curr(String parameters) : IoTItem(parameters) { {
String sAddr;
// Wire.begin(2,0); // Инициализация шины I2C для модуля E01 jsonRead(parameters, "addr", sAddr);
if (sAddr == "")
scanI2C();
else
_addr = hexStringToUint8(sAddr);
} }
void doByInterval() { void doByInterval()
{
current_mA = ina219.getCurrent_mA(); ina219ValueArray[_addr]->shuntvoltage = instanceIna219(_addr)->getShuntVoltage_mV();
value.valD = current_mA; value.valD = ina219ValueArray[_addr]->shuntvoltage;
regEvent(value.valD, "Ina219shuntvoltage");
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");
} }
~Ina219shuntvoltage(){}; ~Ina219shuntvoltage(){};
}; };
class Power_mW : public IoTItem { class Ina219curr : public IoTItem
public: {
Power_mW(String parameters) : IoTItem(parameters) { 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() { void doByInterval()
{
power_mW = ina219.getPower_mW(); value.valD = instanceIna219(_addr)->getCurrent_mA();
value.valD = power_mW; regEvent(value.valD, "Ina219curr");
regEvent(value.valD, "Ina219power"); // TODO: найти способ понимания ошибки получения данных
} }
~Power_mW(){}; ~Ina219curr(){};
}; };
void* getAPI_Ina219(String subtype, String param) {
if (subtype == F("Ina219curr")) { class Ina219Power_mW : public IoTItem
ina219.begin(); {
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); return new Ina219curr(param);
} else if (subtype == F("Ina219shuntvoltage")) { }
ina219.begin(); else if (subtype == F("Ina219shuntvoltage"))
{
return new Ina219shuntvoltage(param); return new Ina219shuntvoltage(param);
} else if (subtype == F("power_mW")) { }
ina219.begin(); else if (subtype == F("Ina219power_mW"))
return new Power_mW(param); {
} else if (subtype == F("Ina219busvoltage")) { return new Ina219Power_mW(param);
ina219.begin(); }
else if (subtype == F("Ina219busvoltage"))
{
return new Ina219busvoltage(param); return new Ina219busvoltage(param);
} else if (subtype == F("Ina219loadvoltage")) { }
ina219.begin(); else if (subtype == F("Ina219loadvoltage"))
{
return new Ina219loadvoltage(param); return new Ina219loadvoltage(param);
} else { }
return nullptr; else
{
return nullptr;
} }
} }

View File

@@ -10,6 +10,7 @@
"widget": "anydatamAmp", "widget": "anydatamAmp",
"page": "INA 219", "page": "INA 219",
"descr": "219 Датчик тока", "descr": "219 Датчик тока",
"addr": "0x40",
"int": 10 "int": 10
}, },
{ {
@@ -21,17 +22,19 @@
"widget": "anydataVlt", "widget": "anydataVlt",
"page": "INA 219", "page": "INA 219",
"descr": "219 Датчик напряжения", "descr": "219 Датчик напряжения",
"addr": "0x40",
"int": 10 "int": 10
}, },
{ {
"global": 0, "global": 0,
"name": "INA219 Мощность", "name": "INA219 Мощность",
"type": "Reading", "type": "Reading",
"subtype": "power_mW", "subtype": "Ina219power_mW",
"id": "Ina219power", "id": "Ina219power",
"widget": "anydatamWtt", "widget": "anydatamWtt",
"page": "INA 219", "page": "INA 219",
"descr": "219 Мощность", "descr": "219 Мощность",
"addr": "0x40",
"int": 10 "int": 10
}, },
{ {
@@ -43,6 +46,7 @@
"widget": "anydataVlt", "widget": "anydataVlt",
"page": "INA 219", "page": "INA 219",
"descr": "219 Напряжение нагрузки", "descr": "219 Напряжение нагрузки",
"addr": "0x40",
"int": 10 "int": 10
}, },
{ {
@@ -54,6 +58,7 @@
"widget": "anydatamVlt", "widget": "anydatamVlt",
"page": "INA 219", "page": "INA 219",
"descr": "219 Напряжение шунта", "descr": "219 Напряжение шунта",
"addr": "0x40",
"int": 10 "int": 10
}], }],
@@ -61,9 +66,9 @@
"authorName": "Serghei Crasnicov", "authorName": "Serghei Crasnicov",
"authorContact": "https://t.me/Serghei63", "authorContact": "https://t.me/Serghei63",
"authorGit": "https://github.com/Serghei63", "authorGit": "https://github.com/Serghei63",
"specialThanks": "Дмитрий , Serg", "specialThanks": "Дмитрий, Serg, v2.0 - Mitchel @Mit4bmw",
"moduleName": "Ina219", "moduleName": "Ina219",
"moduleVersion": "1.0", "moduleVersion": "2.0",
"usedRam": { "usedRam": {
"esp32_4mb": 15, "esp32_4mb": 15,
"esp8266_4mb": 15 "esp8266_4mb": 15
@@ -71,14 +76,15 @@
"subTypes": [ "subTypes": [
"Ina219curr", "Ina219curr",
"Ina219busvoltage", "Ina219busvoltage",
"power_mW", "Ina219power_mW",
"Ina219loadvoltage", "Ina219loadvoltage",
"Ina219shuntvoltage" "Ina219shuntvoltage"
], ],
"title": "Милливатметр постоянного тока", "title": "Милливатметр постоянного тока",
"moduleDesc": "Измеряет постоянный ток до 3.2 ампера, напряжение до 26 вольт и мощность на нагрузке", "moduleDesc": "Измеряет постоянный ток до 3.2 ампера, напряжение до 26 вольт и мощность на нагрузке",
"propInfo": { "propInfo": {
"int": "Количество секунд между опросами датчика." "int": "Количество секунд между опросами датчика.",
"addr": "Адрес датчика на шине, обычно 0x40. Если оставить поле пустым, то запуститься сканер I2C и подключение к адресу 0x40"
} }
}, },