upddate BL0937

This commit is contained in:
Mit4el
2024-04-20 21:48:39 +03:00
parent 9c3ad06c6f
commit 4fe14beb6d
4 changed files with 87 additions and 38 deletions

View File

@@ -157,9 +157,12 @@ private:
int BL0937_CF_GPIO = 4; // 8266 12 //Нужна возможность задавать пин из веб, это по умолчанию
int BL0937_CF1_GPIO = 5; // 8266 13 //Нужна возможность задавать пин из веб, это по умолчанию
int BL0937_SEL_GPIO_INV = 12; // 8266 15 // inverted //Нужна возможность задавать пин из веб, это по умолчанию
float _expV = 0;
float _expA = 0;
float _expW = 0;
float _kfV = 0;
float _kfA = 0;
float _kfW = 0;
float expV = 0;
float expA = 0;
float expW = 0;
public:
BL0937cmd(String parameters) : IoTItem(parameters)
@@ -170,24 +173,64 @@ public:
jsonRead(parameters, "CF_GPIO", BL0937_CF_GPIO);
jsonRead(parameters, "CF1_GPIO", BL0937_CF1_GPIO);
jsonRead(parameters, "SEL_GPIO", BL0937_SEL_GPIO_INV);
jsonRead(parameters, "expV", _expV);
jsonRead(parameters, "expA", _expA);
jsonRead(parameters, "expW", _expW);
jsonRead(parameters, "kfV", _kfV);
jsonRead(parameters, "kfA", _kfA);
jsonRead(parameters, "kfW", _kfW);
bl0937 = new BL0937;
bl0937->begin(BL0937_CF_GPIO, BL0937_CF1_GPIO, BL0937_SEL_GPIO_INV, LOW, true);
bl0937->setResistors(CURRENT_RESISTOR, VOLTAGE_RESISTOR_UPSTREAM, VOLTAGE_RESISTOR_DOWNSTREAM);
attachInterrupt(BL0937_CF1_GPIO, bl0937_cf1_interrupt, FALLING);
attachInterrupt(BL0937_CF_GPIO, bl0937_cf_interrupt, FALLING);
if (_expV)
bl0937->expectedVoltage(_expV); // для калибровки вольтаж нужно вводить из веб интерфейса
if (_expV)
bl0937->expectedCurrent(_expA); // для калибровки можно так, а лучше ток вводить из веб интерфейса
if (_expV)
bl0937->expectedActivePower(_expW); // для калибровки потребляемую мощность нужно вводить из веб интерфейса
if (_kfV)
bl0937->setVoltageMultiplier(_kfV);
if (_kfA)
bl0937->setCurrentMultiplier(_kfA);
if (_kfW)
bl0937->setPowerMultiplier(_kfW);
}
void doByInterval()
{
static bool startCalbr = false;
if (expV && expA && expW)
{
startCalbr = true;
SerialPrint("i", "BL0937", "Start calibration ...");
}
if (startCalbr)
{
if (expV && bl0937->getVoltage())
{
bl0937->expectedVoltage(expV); // для калибровки вольтаж нужно вводить из веб интерфейса
_kfV = bl0937->getVoltageMultiplier();
expV = 0;
}
if (expA && bl0937->getCurrent())
{
bl0937->expectedCurrent(expA); // для калибровки можно так, а лучше ток вводить из веб интерфейса
_kfA = bl0937->getCurrentMultiplier();
expA = 0;
}
if (expW && bl0937->getActivePower())
{
bl0937->expectedActivePower(expW); // для калибровки потребляемую мощность нужно вводить из веб интерфейса
_kfW = bl0937->getPowerMultiplier();
expW = 0;
}
if (!expV && !expA && !expW)
{
String str = "Calibration done: kfV=";
str += _kfV;
str += ", kfA=";
str += _kfA;
str += ", kfW=";
str += _kfW;
SerialPrint("i", "BL0937", str);
SerialPrint("i", "BL0937", "Enter multiplier to configuration!");
startCalbr = false;
}
}
}
void onModuleOrder(String &key, String &value)
@@ -201,7 +244,7 @@ public:
}
}
}
/*
IoTValue execute(String command, std::vector<IoTValue> &param)
{
if (!bl0937)
@@ -210,18 +253,15 @@ public:
{
if (param.size() == 3)
{
float v = param[0].valD;
float a = param[1].valD;
float p = param[2].valD;
bl0937->expectedVoltage(v); // для калибровки вольтаж нужно вводить из веб интерфейса
bl0937->expectedCurrent(a); // для калибровки можно так, а лучше ток вводить из веб интерфейса
bl0937->expectedActivePower(p); // для калибровки потребляемую мощность нужно вводить из веб интерфейса
expV = param[0].valD;
expA = param[1].valD;
expW = param[2].valD;
return {};
}
}
return {};
}
*/
~BL0937cmd()
{
if (bl0937)

View File

@@ -74,6 +74,7 @@ double BL0937::getCurrent() {
// so we first check if power is 0 to set _current to 0 too
if (_power == 0) {
_current_pulse_width = 0;
getActivePower();
} else if (_use_interrupts) {
_checkCF1Signal();

View File

@@ -42,7 +42,7 @@
"name": "BL0937 Реакт.Мощность",
"type": "Reading",
"subtype": "BL0937reactw",
"id": "bl_w",
"id": "bl_reactw",
"widget": "anydataWt",
"page": "BL0937",
"descr": "Реакт.Мощность",
@@ -83,6 +83,7 @@
"page": "",
"descr": "",
"btn-reset": "",
"int": "5",
"R_current": 0.001,
"R_upstream": 1000000,
"R_downstream": 1000,
@@ -108,7 +109,7 @@
"title": "Счетчик электроэнергии BL0937",
"moduleDesc": "Считает потраченную электроэнергию, измеряет напряжение, силу тока и прочие параметры.",
"propInfo": {
"int": "Количество секунд между опросами датчика.",
"int": "Количество секунд между опросами датчика. В bl_set интервал между попытками калибровки (т.к. нужны сначала данные от датчика)",
"btn-reset": "Энергия BL0937 будет сброшена к нулю.",
"R_current": "Резистор подключенный последовательно к основной линии",
"R_upstream": "это 5 резисторов по 470 Ком в делителе напряжения, который питает вывод V2P",
@@ -116,10 +117,17 @@
"CF_GPIO": "пин CF",
"CF1_GPIO": "пин CF1",
"SEL_GPIO": "пин SEL",
"expV": "реальное напряжение, указать для калибровки",
"expA": "реальный ток, указать для калибровки",
"expW": "реальная мощность, указать для калибровки"
"kfV": "Коэффициент корректировки напряжение, указать после калибровки",
"kfA": "Коэффициент корректировки тока, указать после калибровки",
"kfW": "Коэффициент корректировки мощности, указать после калибровки"
},
"funcInfo": [
{
"name": "calibration",
"descr": "Расчет коэффициентов калибровки. Вызывать от имени BL0937 настройка. bl_set.calibration(220, 16, 3.5). Полученный коэффициенты искать в логе и ввести в конфигурацию kfV, kfA и kfW",
"params": ["Напряжение, Ток, Мощность"]
}
]
},
"defActive": true,
"usedLibs": {