feat: new equitherm algorithm and chart for it (#144)

This commit is contained in:
P43YM
2025-02-28 23:21:55 +03:00
committed by GitHub
parent 4457e16a8f
commit e5f4281d4c
10 changed files with 263 additions and 19 deletions

View File

@@ -16,14 +16,16 @@ public:
float Kn = 0.0;
float Kk = 0.0;
float Kt = 0.0;
float Ke = 1.3;
Equitherm() = default;
// kn, kk, kt
Equitherm(float new_kn, float new_kk, float new_kt) {
// kn, kk, kt, Ke
Equitherm(float new_kn, float new_kk, float new_kt, float new_ke) {
Kn = new_kn;
Kk = new_kk;
Kt = new_kt;
Ke = new_ke;
}
// лимит выходной величины
@@ -34,7 +36,7 @@ public:
// возвращает новое значение при вызове
datatype getResult() {
datatype output = getResultN() + getResultK() + getResultT();
datatype output = getResultN() + Kk + getResultT();
output = constrain(output, _minOut, _maxOut); // ограничиваем выход
return output;
}
@@ -42,22 +44,17 @@ public:
private:
unsigned short _minOut = 20, _maxOut = 90;
// температура контура отопления в зависимости от наружной температуры
datatype getResultN() {
float a = (-0.21 * Kn) - 0.06; // a = -0,21k — 0,06
float b = (6.04 * Kn) + 1.98; // b = 6,04k + 1,98
float c = (-5.06 * Kn) + 18.06; // с = -5,06k + 18,06
float x = (-0.2 * outdoorTemp) + 5; // x = -0.2*t1 + 5
return (a * x * x) + (b * x) + c; // Tn = ax2 + bx + c
datatype getResultN()
{
float tempDelta = targetTemp - outdoorTemp,
maxPoint = targetTemp - (_maxOut - targetTemp) / Kn,
sf = (_maxOut - targetTemp) / pow(targetTemp - maxPoint, 1.0 / Ke),
T_rad = targetTemp + sf * (tempDelta >= 0 ? pow(tempDelta, 1.0 / Ke) : -pow(-tempDelta, 1.0 / Ke));
return T_rad > _maxOut ? _maxOut : T_rad;
}
// поправка на желаемую комнатную температуру
datatype getResultK() {
return (targetTemp - 20) * Kk;
}
// Расчет поправки (ошибки) термостата
// Реакция на разницу с целевой температурой
datatype getResultT() {
return constrain((targetTemp - indoorTemp), -3, 3) * Kt;
}
};
};