2022-11-13 21:32:30 +05:00
|
|
|
|
/******************************************************************
|
2023-08-09 23:36:49 +03:00
|
|
|
|
Used GyverINA Current Sensor
|
|
|
|
|
|
Support for INA219 INA226
|
|
|
|
|
|
https://github.com/GyverLibs/GyverINA
|
2022-11-13 21:32:30 +05:00
|
|
|
|
|
2023-08-09 23:36:49 +03:00
|
|
|
|
adapted for version 4dev @Mit4bmw
|
2022-11-13 21:32:30 +05:00
|
|
|
|
******************************************************************/
|
|
|
|
|
|
|
|
|
|
|
|
#include "Global.h"
|
|
|
|
|
|
#include "classes/IoTItem.h"
|
|
|
|
|
|
|
|
|
|
|
|
#include <Wire.h>
|
2023-08-09 23:36:49 +03:00
|
|
|
|
#include <GyverINA.h>
|
2023-06-21 23:58:18 +03:00
|
|
|
|
#include <map>
|
|
|
|
|
|
|
2023-08-09 23:36:49 +03:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Структура для хранения настроек датчика
|
2023-06-21 23:58:18 +03:00
|
|
|
|
struct Ina219Value
|
|
|
|
|
|
{
|
2023-08-09 23:36:49 +03:00
|
|
|
|
float shunt = 0;
|
|
|
|
|
|
float maxV = 0;
|
2023-06-21 23:58:18 +03:00
|
|
|
|
};
|
2023-08-09 23:36:49 +03:00
|
|
|
|
|
|
|
|
|
|
// глобальные списки необходимы для хранения Модуля Настроек. Ключ - адрес
|
|
|
|
|
|
std::map<uint8_t, Ina219Value *> ina219SettingArray;
|
2023-06-21 23:58:18 +03:00
|
|
|
|
|
|
|
|
|
|
// глобальные списки необходимы для хранения объектов используемых разными датчиками из модуля. Ключ - адрес
|
2023-08-09 23:36:49 +03:00
|
|
|
|
std::map<uint8_t, INA219 *> ina219Array;
|
2023-06-21 23:58:18 +03:00
|
|
|
|
|
|
|
|
|
|
// Функция инициализации библиотечного класса, возвращает Единстрвенный указать на библиотеку
|
2023-08-09 23:36:49 +03:00
|
|
|
|
INA219 *instanceIna219(uint8_t ADDR)
|
2023-06-21 23:58:18 +03:00
|
|
|
|
{
|
|
|
|
|
|
/** default I2C address **/
|
|
|
|
|
|
if (ADDR == 0)
|
2023-08-09 23:36:49 +03:00
|
|
|
|
ADDR = 0x40; // 1000000 (A0+A1=GND)
|
2023-06-21 23:58:18 +03:00
|
|
|
|
|
|
|
|
|
|
// учитываем, что библиотека может работать с несколькими линиями на разных пинах, поэтому инициируем библиотеку, если линия ранее не использовалась
|
|
|
|
|
|
if (ina219Array.find(ADDR) == ina219Array.end())
|
|
|
|
|
|
{
|
2023-08-09 23:36:49 +03:00
|
|
|
|
if (ina219SettingArray.find(ADDR) == ina219SettingArray.end())
|
|
|
|
|
|
ina219Array[ADDR] = new INA219(ina219SettingArray[ADDR]->shunt, ina219SettingArray[ADDR]->maxV, (uint8_t)ADDR);
|
|
|
|
|
|
else
|
|
|
|
|
|
ina219Array[ADDR] = new INA219(0.1f, 3.2f, (uint8_t)ADDR); // Стандартные значения для модуля INA219 (0.1 Ом, 3.2А, адрес 0x40)
|
2023-06-21 23:58:18 +03:00
|
|
|
|
ina219Array[ADDR]->begin();
|
2023-08-09 23:36:49 +03:00
|
|
|
|
// ina219ValueArray[ADDR] = new Ina219Value;
|
2022-11-13 21:32:30 +05:00
|
|
|
|
}
|
2023-06-21 23:58:18 +03:00
|
|
|
|
return ina219Array[ADDR];
|
|
|
|
|
|
}
|
2022-11-13 21:32:30 +05:00
|
|
|
|
|
2023-08-09 23:36:49 +03:00
|
|
|
|
class Ina219voltage : public IoTItem
|
2023-06-21 23:58:18 +03:00
|
|
|
|
{
|
|
|
|
|
|
private:
|
|
|
|
|
|
uint8_t _addr = 0;
|
|
|
|
|
|
|
|
|
|
|
|
public:
|
2023-08-09 23:36:49 +03:00
|
|
|
|
Ina219voltage(String parameters) : IoTItem(parameters)
|
2023-06-21 23:58:18 +03:00
|
|
|
|
{
|
|
|
|
|
|
String sAddr;
|
|
|
|
|
|
jsonRead(parameters, "addr", sAddr);
|
|
|
|
|
|
if (sAddr == "")
|
|
|
|
|
|
scanI2C();
|
|
|
|
|
|
else
|
|
|
|
|
|
_addr = hexStringToUint8(sAddr);
|
|
|
|
|
|
}
|
2022-11-13 21:32:30 +05:00
|
|
|
|
|
2023-06-21 23:58:18 +03:00
|
|
|
|
void doByInterval()
|
|
|
|
|
|
{
|
2023-08-09 23:36:49 +03:00
|
|
|
|
value.valD = instanceIna219(_addr)->getVoltage();
|
|
|
|
|
|
regEvent(value.valD, "Ina219voltage");
|
2022-11-13 21:32:30 +05:00
|
|
|
|
}
|
|
|
|
|
|
|
2023-08-09 23:36:49 +03:00
|
|
|
|
~Ina219voltage(){};
|
2022-11-13 21:32:30 +05:00
|
|
|
|
};
|
|
|
|
|
|
|
2023-08-09 23:36:49 +03:00
|
|
|
|
class Ina219shuntvoltage : public IoTItem
|
2023-06-21 23:58:18 +03:00
|
|
|
|
{
|
|
|
|
|
|
private:
|
|
|
|
|
|
uint8_t _addr = 0;
|
|
|
|
|
|
|
|
|
|
|
|
public:
|
2023-08-09 23:36:49 +03:00
|
|
|
|
Ina219shuntvoltage(String parameters) : IoTItem(parameters)
|
2023-06-21 23:58:18 +03:00
|
|
|
|
{
|
|
|
|
|
|
String sAddr;
|
|
|
|
|
|
jsonRead(parameters, "addr", sAddr);
|
|
|
|
|
|
if (sAddr == "")
|
|
|
|
|
|
scanI2C();
|
|
|
|
|
|
else
|
|
|
|
|
|
_addr = hexStringToUint8(sAddr);
|
2022-11-13 21:32:30 +05:00
|
|
|
|
}
|
2023-06-21 23:58:18 +03:00
|
|
|
|
void doByInterval()
|
|
|
|
|
|
{
|
2023-08-09 23:36:49 +03:00
|
|
|
|
value.valD = instanceIna219(_addr)->getShuntVoltage();
|
|
|
|
|
|
regEvent(value.valD, "Ina219shuntvoltage");
|
2022-11-13 21:32:30 +05:00
|
|
|
|
}
|
|
|
|
|
|
|
2023-08-09 23:36:49 +03:00
|
|
|
|
~Ina219shuntvoltage(){};
|
2022-11-13 21:32:30 +05:00
|
|
|
|
};
|
|
|
|
|
|
|
2023-08-09 23:36:49 +03:00
|
|
|
|
class Ina219curr : public IoTItem
|
2023-06-21 23:58:18 +03:00
|
|
|
|
{
|
|
|
|
|
|
private:
|
|
|
|
|
|
uint8_t _addr = 0;
|
|
|
|
|
|
|
|
|
|
|
|
public:
|
2023-08-09 23:36:49 +03:00
|
|
|
|
Ina219curr(String parameters) : IoTItem(parameters)
|
2023-06-21 23:58:18 +03:00
|
|
|
|
{
|
|
|
|
|
|
String sAddr;
|
|
|
|
|
|
jsonRead(parameters, "addr", sAddr);
|
|
|
|
|
|
if (sAddr == "")
|
|
|
|
|
|
scanI2C();
|
|
|
|
|
|
else
|
|
|
|
|
|
_addr = hexStringToUint8(sAddr);
|
2022-11-13 21:32:30 +05:00
|
|
|
|
}
|
2023-06-21 23:58:18 +03:00
|
|
|
|
void doByInterval()
|
|
|
|
|
|
{
|
2023-08-09 23:36:49 +03:00
|
|
|
|
value.valD = instanceIna219(_addr)->getCurrent();
|
|
|
|
|
|
regEvent(value.valD, "Ina219curr");
|
2022-11-13 21:32:30 +05:00
|
|
|
|
}
|
|
|
|
|
|
|
2023-08-09 23:36:49 +03:00
|
|
|
|
~Ina219curr(){};
|
2022-11-13 21:32:30 +05:00
|
|
|
|
};
|
|
|
|
|
|
|
2023-08-09 23:36:49 +03:00
|
|
|
|
class Ina219Power : public IoTItem
|
2023-06-21 23:58:18 +03:00
|
|
|
|
{
|
|
|
|
|
|
private:
|
|
|
|
|
|
uint8_t _addr = 0;
|
|
|
|
|
|
|
|
|
|
|
|
public:
|
2023-08-09 23:36:49 +03:00
|
|
|
|
Ina219Power(String parameters) : IoTItem(parameters)
|
2023-06-21 23:58:18 +03:00
|
|
|
|
{
|
|
|
|
|
|
String sAddr;
|
|
|
|
|
|
jsonRead(parameters, "addr", sAddr);
|
|
|
|
|
|
if (sAddr == "")
|
|
|
|
|
|
scanI2C();
|
|
|
|
|
|
else
|
|
|
|
|
|
_addr = hexStringToUint8(sAddr);
|
2022-11-13 21:32:30 +05:00
|
|
|
|
}
|
2023-06-21 23:58:18 +03:00
|
|
|
|
void doByInterval()
|
|
|
|
|
|
{
|
2023-08-09 23:36:49 +03:00
|
|
|
|
value.valD = instanceIna219(_addr)->getPower();
|
|
|
|
|
|
regEvent(value.valD, "Ina219power"); // TODO: найти способ понимания ошибки получения данных
|
2022-11-13 21:32:30 +05:00
|
|
|
|
}
|
|
|
|
|
|
|
2023-08-09 23:36:49 +03:00
|
|
|
|
~Ina219Power(){};
|
2022-11-13 21:32:30 +05:00
|
|
|
|
};
|
|
|
|
|
|
|
2023-08-09 23:36:49 +03:00
|
|
|
|
class Ina219Setting : public IoTItem
|
2023-06-21 23:58:18 +03:00
|
|
|
|
{
|
|
|
|
|
|
private:
|
|
|
|
|
|
uint8_t _addr = 0;
|
2023-08-09 23:36:49 +03:00
|
|
|
|
int adjClbr = 0;
|
|
|
|
|
|
int resol = 1;
|
|
|
|
|
|
|
2023-06-21 23:58:18 +03:00
|
|
|
|
|
|
|
|
|
|
public:
|
2023-08-09 23:36:49 +03:00
|
|
|
|
Ina219Setting(String parameters) : IoTItem(parameters)
|
2023-06-21 23:58:18 +03:00
|
|
|
|
{
|
|
|
|
|
|
String sAddr;
|
|
|
|
|
|
jsonRead(parameters, "addr", sAddr);
|
2023-08-09 23:36:49 +03:00
|
|
|
|
jsonRead(parameters, "adjClbr", adjClbr);
|
|
|
|
|
|
jsonRead(parameters, "resol", resol);
|
|
|
|
|
|
|
|
|
|
|
|
|
2023-06-21 23:58:18 +03:00
|
|
|
|
if (sAddr == "")
|
|
|
|
|
|
scanI2C();
|
|
|
|
|
|
else
|
|
|
|
|
|
_addr = hexStringToUint8(sAddr);
|
2023-08-09 23:36:49 +03:00
|
|
|
|
|
|
|
|
|
|
ina219SettingArray[_addr] = new Ina219Value;
|
|
|
|
|
|
jsonRead(parameters, "shunt", ina219SettingArray[_addr]->shunt);
|
|
|
|
|
|
jsonRead(parameters, "maxV", ina219SettingArray[_addr]->maxV);
|
|
|
|
|
|
|
|
|
|
|
|
instanceIna219(_addr)->adjCalibration(adjClbr);
|
|
|
|
|
|
if (resol == 1)
|
|
|
|
|
|
resol = 0b0011;
|
|
|
|
|
|
else
|
|
|
|
|
|
resol += 0b0111;
|
|
|
|
|
|
|
|
|
|
|
|
instanceIna219(_addr)->setResolution(INA219_VBUS, resol); // Напряжение в 12ти битном режиме
|
|
|
|
|
|
instanceIna219(_addr)->setResolution(INA219_VSHUNT, resol); // Ток в 12ти битном режиме
|
2022-11-13 21:32:30 +05:00
|
|
|
|
}
|
2023-08-09 23:36:49 +03:00
|
|
|
|
|
|
|
|
|
|
void onModuleOrder(String &key, String &value)
|
2023-06-21 23:58:18 +03:00
|
|
|
|
{
|
2023-08-09 23:36:49 +03:00
|
|
|
|
if (key == "getClbr")
|
|
|
|
|
|
{
|
|
|
|
|
|
SerialPrint("i", F("Ina219"), "addr: " + String(_addr) + ", Value Calibration:" + instanceIna219(_addr)->getCalibration());
|
|
|
|
|
|
}
|
2022-11-13 21:32:30 +05:00
|
|
|
|
}
|
|
|
|
|
|
|
2023-08-09 23:36:49 +03:00
|
|
|
|
IoTValue execute(String command, std::vector<IoTValue> ¶m)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (command == "sleep")
|
|
|
|
|
|
{
|
|
|
|
|
|
if (param.size() == 1)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (param[0].valD == 0)
|
|
|
|
|
|
instanceIna219(_addr)->sleep(false);
|
|
|
|
|
|
if (param[0].valD == 1)
|
|
|
|
|
|
instanceIna219(_addr)->sleep(true);
|
|
|
|
|
|
return {};
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
/*
|
|
|
|
|
|
else if (command == "getCalibration")
|
|
|
|
|
|
{
|
|
|
|
|
|
SerialPrint("i", F("Ina219"), "addr: " + String(_addr) + ", Value Calibration:" + instanceIna219(_addr)->getCalibration());
|
|
|
|
|
|
return {};
|
|
|
|
|
|
}*/
|
|
|
|
|
|
return {};
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
~Ina219Setting(){};
|
2022-11-13 21:32:30 +05:00
|
|
|
|
};
|
2023-08-09 23:36:49 +03:00
|
|
|
|
|
2023-06-21 23:58:18 +03:00
|
|
|
|
void *getAPI_Ina219(String subtype, String param)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (subtype == F("Ina219curr"))
|
|
|
|
|
|
{
|
2022-11-13 21:32:30 +05:00
|
|
|
|
return new Ina219curr(param);
|
2023-06-21 23:58:18 +03:00
|
|
|
|
}
|
|
|
|
|
|
else if (subtype == F("Ina219shuntvoltage"))
|
|
|
|
|
|
{
|
2022-11-13 21:32:30 +05:00
|
|
|
|
return new Ina219shuntvoltage(param);
|
2023-06-21 23:58:18 +03:00
|
|
|
|
}
|
2023-08-09 23:36:49 +03:00
|
|
|
|
else if (subtype == F("Ina219power"))
|
2023-06-21 23:58:18 +03:00
|
|
|
|
{
|
2023-08-09 23:36:49 +03:00
|
|
|
|
return new Ina219Power(param);
|
2023-06-21 23:58:18 +03:00
|
|
|
|
}
|
2023-08-09 23:36:49 +03:00
|
|
|
|
else if (subtype == F("Ina219voltage"))
|
2023-06-21 23:58:18 +03:00
|
|
|
|
{
|
2023-08-09 23:36:49 +03:00
|
|
|
|
return new Ina219voltage(param);
|
2023-06-21 23:58:18 +03:00
|
|
|
|
}
|
2023-08-09 23:36:49 +03:00
|
|
|
|
else if (subtype == F("Ina219setting"))
|
2023-06-21 23:58:18 +03:00
|
|
|
|
{
|
2023-08-09 23:36:49 +03:00
|
|
|
|
return new Ina219Setting(param);
|
|
|
|
|
|
// Ina219Setting *ptr = new Ina219Setting(param);
|
|
|
|
|
|
// ina219SettingArray[ptr->getAddr()] = ptr;
|
|
|
|
|
|
// return ptr;
|
2023-06-21 23:58:18 +03:00
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
return nullptr;
|
2022-11-13 21:32:30 +05:00
|
|
|
|
}
|
|
|
|
|
|
}
|