mirror of
https://github.com/Laxilef/OTGateway.git
synced 2025-12-11 18:54:28 +05:00
feat: improved turbo mode
- added turbo factor parameter - implemented turbo mode for PID
This commit is contained in:
@@ -29,31 +29,9 @@ protected:
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
void loop() {
|
void loop() {
|
||||||
bool pidIntergralResetted = false;
|
|
||||||
if (fabs(pidRegulator.Kp - settings.pid.p_factor) >= 0.0001f) {
|
|
||||||
pidRegulator.Kp = settings.pid.p_factor;
|
|
||||||
pidRegulator.integral = 0;
|
|
||||||
pidIntergralResetted = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (fabs(pidRegulator.Ki - settings.pid.i_factor) >= 0.0001f) {
|
|
||||||
pidRegulator.Ki = settings.pid.i_factor;
|
|
||||||
pidRegulator.integral = 0;
|
|
||||||
pidIntergralResetted = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (fabs(pidRegulator.Kd - settings.pid.d_factor) >= 0.0001f) {
|
|
||||||
pidRegulator.Kd = settings.pid.d_factor;
|
|
||||||
pidRegulator.integral = 0;
|
|
||||||
pidIntergralResetted = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!settings.pid.enable && fabs(pidRegulator.integral) > 0.01f) {
|
if (!settings.pid.enable && fabs(pidRegulator.integral) > 0.01f) {
|
||||||
pidRegulator.integral = 0.0f;
|
pidRegulator.integral = 0.0f;
|
||||||
pidIntergralResetted = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pidIntergralResetted) {
|
|
||||||
Log.sinfoln(FPSTR(L_REGULATOR_PID), F("Integral sum has been reset"));
|
Log.sinfoln(FPSTR(L_REGULATOR_PID), F("Integral sum has been reset"));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -61,10 +39,10 @@ protected:
|
|||||||
if (!settings.heating.enable || vars.states.emergency) {
|
if (!settings.heating.enable || vars.states.emergency) {
|
||||||
settings.heating.turbo = false;
|
settings.heating.turbo = false;
|
||||||
|
|
||||||
} else if (settings.pid.enable) {
|
} else if (!settings.pid.enable && !settings.equitherm.enable) {
|
||||||
settings.heating.turbo = false; // not implemented
|
settings.heating.turbo = false;
|
||||||
|
|
||||||
} else if (fabs(settings.heating.target - vars.temperatures.indoor) < 1.0f) {
|
} else if (fabs(settings.heating.target - vars.temperatures.indoor) <= 1.0f) {
|
||||||
settings.heating.turbo = false;
|
settings.heating.turbo = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -125,7 +103,9 @@ protected:
|
|||||||
etRegulator.indoorTemp = 0;
|
etRegulator.indoorTemp = 0;
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
etRegulator.Kt = settings.heating.turbo ? 10.0f : settings.equitherm.t_factor;
|
etRegulator.Kt = settings.heating.turbo
|
||||||
|
? settings.equitherm.t_factor * settings.heating.turboFactor
|
||||||
|
: settings.equitherm.t_factor;
|
||||||
etRegulator.indoorTemp = indoorTemp;
|
etRegulator.indoorTemp = indoorTemp;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -155,11 +135,24 @@ protected:
|
|||||||
if (settings.pid.enable) {
|
if (settings.pid.enable) {
|
||||||
//if (vars.parameters.heatingEnabled) {
|
//if (vars.parameters.heatingEnabled) {
|
||||||
if (settings.heating.enable && vars.sensors.indoor.connected) {
|
if (settings.heating.enable && vars.sensors.indoor.connected) {
|
||||||
|
pidRegulator.Kp = settings.heating.turbo
|
||||||
|
? settings.pid.p_factor * settings.heating.turboFactor
|
||||||
|
: settings.pid.p_factor;
|
||||||
|
pidRegulator.Kd = settings.pid.d_factor;
|
||||||
|
|
||||||
pidRegulator.setLimits(settings.pid.minTemp, settings.pid.maxTemp);
|
pidRegulator.setLimits(settings.pid.minTemp, settings.pid.maxTemp);
|
||||||
pidRegulator.setDt(settings.pid.dt * 1000u);
|
pidRegulator.setDt(settings.pid.dt * 1000u);
|
||||||
pidRegulator.input = vars.temperatures.indoor;
|
pidRegulator.input = vars.temperatures.indoor;
|
||||||
pidRegulator.setpoint = settings.heating.target;
|
pidRegulator.setpoint = settings.heating.target;
|
||||||
|
|
||||||
|
if (fabs(pidRegulator.Ki - settings.pid.i_factor) >= 0.0001f) {
|
||||||
|
pidRegulator.Ki = settings.pid.i_factor;
|
||||||
|
pidRegulator.integral = 0;
|
||||||
|
pidRegulator.getResultNow();
|
||||||
|
|
||||||
|
Log.sinfoln(FPSTR(L_REGULATOR_PID), F("Integral sum has been reset"));
|
||||||
|
}
|
||||||
|
|
||||||
float pidResult = pidRegulator.getResultTimer();
|
float pidResult = pidRegulator.getResultTimer();
|
||||||
if (fabs(prevPidResult - pidResult) > 0.09f) {
|
if (fabs(prevPidResult - pidResult) > 0.09f) {
|
||||||
prevPidResult = pidResult;
|
prevPidResult = pidResult;
|
||||||
|
|||||||
@@ -95,6 +95,7 @@ struct Settings {
|
|||||||
bool turbo = false;
|
bool turbo = false;
|
||||||
float target = DEFAULT_HEATING_TARGET_TEMP;
|
float target = DEFAULT_HEATING_TARGET_TEMP;
|
||||||
float hysteresis = 0.5f;
|
float hysteresis = 0.5f;
|
||||||
|
float turboFactor = 3.0f;
|
||||||
byte minTemp = DEFAULT_HEATING_MIN_TEMP;
|
byte minTemp = DEFAULT_HEATING_MIN_TEMP;
|
||||||
byte maxTemp = DEFAULT_HEATING_MAX_TEMP;
|
byte maxTemp = DEFAULT_HEATING_MAX_TEMP;
|
||||||
} heating;
|
} heating;
|
||||||
@@ -108,9 +109,9 @@ struct Settings {
|
|||||||
|
|
||||||
struct {
|
struct {
|
||||||
bool enable = false;
|
bool enable = false;
|
||||||
float p_factor = 2;
|
float p_factor = 2.0f;
|
||||||
float i_factor = 0.0055f;
|
float i_factor = 0.0055f;
|
||||||
float d_factor = 0;
|
float d_factor = 0.0f;
|
||||||
unsigned short dt = 180;
|
unsigned short dt = 180;
|
||||||
short minTemp = 0;
|
short minTemp = 0;
|
||||||
short maxTemp = DEFAULT_HEATING_MAX_TEMP;
|
short maxTemp = DEFAULT_HEATING_MAX_TEMP;
|
||||||
|
|||||||
10
src/utils.h
10
src/utils.h
@@ -394,6 +394,7 @@ void settingsToJson(const Settings& src, JsonVariant dst, bool safe = false) {
|
|||||||
dst["heating"]["turbo"] = src.heating.turbo;
|
dst["heating"]["turbo"] = src.heating.turbo;
|
||||||
dst["heating"]["target"] = roundd(src.heating.target, 2);
|
dst["heating"]["target"] = roundd(src.heating.target, 2);
|
||||||
dst["heating"]["hysteresis"] = roundd(src.heating.hysteresis, 2);
|
dst["heating"]["hysteresis"] = roundd(src.heating.hysteresis, 2);
|
||||||
|
dst["heating"]["turboFactor"] = roundd(src.heating.turboFactor, 2);
|
||||||
dst["heating"]["minTemp"] = src.heating.minTemp;
|
dst["heating"]["minTemp"] = src.heating.minTemp;
|
||||||
dst["heating"]["maxTemp"] = src.heating.maxTemp;
|
dst["heating"]["maxTemp"] = src.heating.maxTemp;
|
||||||
|
|
||||||
@@ -1106,6 +1107,15 @@ bool jsonToSettings(const JsonVariantConst src, Settings& dst, bool safe = false
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!src["heating"]["turboFactor"].isNull()) {
|
||||||
|
float value = src["heating"]["turboFactor"].as<float>();
|
||||||
|
|
||||||
|
if (value >= 1.5f && value <= 10.0f && fabs(value - dst.heating.turboFactor) > 0.0001f) {
|
||||||
|
dst.heating.turboFactor = roundd(value, 2);
|
||||||
|
changed = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (!src["heating"]["minTemp"].isNull()) {
|
if (!src["heating"]["minTemp"].isNull()) {
|
||||||
unsigned char value = src["heating"]["minTemp"].as<unsigned char>();
|
unsigned char value = src["heating"]["minTemp"].as<unsigned char>();
|
||||||
|
|
||||||
|
|||||||
@@ -220,7 +220,8 @@
|
|||||||
},
|
},
|
||||||
|
|
||||||
"heating": {
|
"heating": {
|
||||||
"hyst": "Hysteresis <small>(in degrees)</small>"
|
"hyst": "Hysteresis <small>(in degrees)</small>",
|
||||||
|
"turboFactor": "Turbo mode coeff."
|
||||||
},
|
},
|
||||||
|
|
||||||
"emergency": {
|
"emergency": {
|
||||||
|
|||||||
@@ -220,11 +220,12 @@
|
|||||||
},
|
},
|
||||||
|
|
||||||
"heating": {
|
"heating": {
|
||||||
"hyst": "Гистерезис <small>(в градусах)</small>"
|
"hyst": "Гистерезис <small>(в градусах)</small>",
|
||||||
|
"turboFactor": "Коэфф. турбо режима"
|
||||||
},
|
},
|
||||||
|
|
||||||
"emergency": {
|
"emergency": {
|
||||||
"desc": "Аварийный режим активируется автоматически, если «ПИД» или «ПЗА» не могут рассчитать уставку теплоносителя:<br />- если «ПЗА» включен и датчик наружной температуры отключен;<br />- если включен «ПИД» или OT опция <i>«Передать управление отоплением котлу»</i> и датчик температуры в помещении отключен.<br /><b>Примечание:</b> При сбое сети или MQTT датчики с типом <i>«Вручную через MQTT/API»</i> будут находиться в состоянии ОТКЛЮЧЕН.",
|
"desc": "Аварийный режим активируется автоматически, если «ПИД» или «ПЗА» не могут рассчитать уставку теплоносителя:<br />- если «ПЗА» включен и датчик наружной температуры отключен;<br />- если включен «ПИД» или OT опция <i>«Передать управление отоплением котлу»</i> и датчик внутренней температуры отключен.<br /><b>Примечание:</b> При сбое сети или MQTT датчики с типом <i>«Вручную через MQTT/API»</i> будут находиться в состоянии ОТКЛЮЧЕН.",
|
||||||
|
|
||||||
"target": {
|
"target": {
|
||||||
"title": "Целевая температура",
|
"title": "Целевая температура",
|
||||||
|
|||||||
@@ -166,10 +166,17 @@
|
|||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<label for="heating-hysteresis">
|
<div class="grid">
|
||||||
<span data-i18n>settings.heating.hyst</span>
|
<label for="heating-hysteresis">
|
||||||
<input type="number" inputmode="numeric" id="heating-hysteresis" name="heating[hysteresis]" min="0" max="5" step="0.05" required>
|
<span data-i18n>settings.heating.hyst</span>
|
||||||
</label>
|
<input type="number" inputmode="numeric" id="heating-hysteresis" name="heating[hysteresis]" min="0" max="5" step="0.05" required>
|
||||||
|
</label>
|
||||||
|
|
||||||
|
<label for="heating-turbo-factor">
|
||||||
|
<span data-i18n>settings.heating.turboFactor</span>
|
||||||
|
<input type="number" inputmode="numeric" id="heating-turbo-factor" name="heating[turboFactor]" min="1.5" max="10" step="0.1" required>
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
|
||||||
<button type="submit" data-i18n>button.save</button>
|
<button type="submit" data-i18n>button.save</button>
|
||||||
</form>
|
</form>
|
||||||
@@ -283,7 +290,7 @@
|
|||||||
<div class="grid">
|
<div class="grid">
|
||||||
<label for="pid-p-factor">
|
<label for="pid-p-factor">
|
||||||
<span data-i18n>settings.pid.p</span>
|
<span data-i18n>settings.pid.p</span>
|
||||||
<input type="number" inputmode="numeric" id="pid-p-factor" name="pid[p_factor]" min="0.1" max="1000" step="0.1" required>
|
<input type="number" inputmode="numeric" id="pid-p-factor" name="pid[p_factor]" min="0.1" max="1000" step="0.01" required>
|
||||||
</label>
|
</label>
|
||||||
|
|
||||||
<label for="pid-i-factor">
|
<label for="pid-i-factor">
|
||||||
@@ -293,7 +300,7 @@
|
|||||||
|
|
||||||
<label for="pid-d-factor">
|
<label for="pid-d-factor">
|
||||||
<span data-i18n>settings.pid.d</span>
|
<span data-i18n>settings.pid.d</span>
|
||||||
<input type="number" inputmode="numeric" id="pid-d-factor" name="pid[d_factor]" min="0" max="100000" step="1" required>
|
<input type="number" inputmode="numeric" id="pid-d-factor" name="pid[d_factor]" min="0" max="100000" step="0.1" required>
|
||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -904,6 +911,7 @@
|
|||||||
"max": data.system.unitSystem == 0 ? 100 : 212
|
"max": data.system.unitSystem == 0 ? 100 : 212
|
||||||
});
|
});
|
||||||
setInputValue('#heating-hysteresis', data.heating.hysteresis);
|
setInputValue('#heating-hysteresis', data.heating.hysteresis);
|
||||||
|
setInputValue('#heating-turbo-factor', data.heating.turboFactor);
|
||||||
setBusy('#heating-settings-busy', '#heating-settings', false);
|
setBusy('#heating-settings-busy', '#heating-settings', false);
|
||||||
|
|
||||||
// DHW
|
// DHW
|
||||||
|
|||||||
Reference in New Issue
Block a user