rework circulation pump

This commit is contained in:
Hendrik Schutter 2025-04-25 21:45:59 +02:00
parent da7a1be183
commit dcace073d9
2 changed files with 56 additions and 46 deletions

View File

@ -58,13 +58,6 @@ void initControl(void)
} }
} }
typedef enum _BurnerState
{
BURNER_UNKNOWN,
BURNER_FIRED,
BURNER_FAULT
} eBurnerState;
void taskControl(void *pvParameters) void taskControl(void *pvParameters)
{ {
bool bHeatingInAction = false; bool bHeatingInAction = false;
@ -84,7 +77,6 @@ void taskControl(void *pvParameters)
{ {
ESP_LOGW(TAG, "Disabling burner due to safety fault"); ESP_LOGW(TAG, "Disabling burner due to safety fault");
bHeatingInAction = false; bHeatingInAction = false;
setCirculationPumpState(ENABLED);
setBurnerState(DISABLED); setBurnerState(DISABLED);
setSafetyControlState(ENABLED); setSafetyControlState(ENABLED);
} }
@ -100,7 +92,6 @@ void taskControl(void *pvParameters)
{ {
ESP_LOGW(TAG, "Disabling burner due to SNTP fault"); ESP_LOGW(TAG, "Disabling burner due to SNTP fault");
bHeatingInAction = false; bHeatingInAction = false;
setCirculationPumpState(ENABLED);
setBurnerState(DISABLED); setBurnerState(DISABLED);
setSafetyControlState(ENABLED); setSafetyControlState(ENABLED);
} }
@ -110,46 +101,12 @@ void taskControl(void *pvParameters)
// Get current temperature entry // Get current temperature entry
sControlTemperatureEntry currentControlEntry = getCurrentTemperatureEntry(); sControlTemperatureEntry currentControlEntry = getCurrentTemperatureEntry();
if (bHeatingInAction) // Enable burner if outdoor temperature is low and return flow temperature is cooled down
{
if ((getChamberTemperature().fCurrentValue >= currentControlEntry.fChamberTemperature) ||
(getChamberTemperature().predict60s.fValue >= currentControlEntry.fChamberTemperature))
{
ESP_LOGI(TAG, "Chamber target temperature reached: Disabling burner");
bHeatingInAction = false;
setCirculationPumpState(ENABLED);
setBurnerState(DISABLED);
setSafetyControlState(ENABLED);
}
else if (esp_timer_get_time() - i64BurnerEnableTimestamp >= BURNER_FAULT_DETECTION_THRESHOLD * 1000000U)
{
if (eBurnerState == BURNER_UNKNOWN)
{
if (getBurnerError() == FAULT)
{
ESP_LOGW(TAG, "Burner fault detected after threshold!");
bHeatingInAction = false;
eBurnerState = BURNER_FAULT;
sControlState = CONTROL_FAULT_BURNER;
setCirculationPumpState(ENABLED);
setBurnerState(DISABLED);
setSafetyControlState(ENABLED);
}
else
{
ESP_LOGW(TAG, "No Burner fault detected after threshold!");
eBurnerState = BURNER_FIRED;
}
}
}
}
if (!bHeatingInAction && (eBurnerState != BURNER_FAULT)) if (!bHeatingInAction && (eBurnerState != BURNER_FAULT))
{ {
if (getOutdoorTemperature().average60s.fValue >= OUTDOOR_TEMPERATURE_THRESHOLD) if (getOutdoorTemperature().average60s.fValue >= OUTDOOR_TEMPERATURE_THRESHOLD)
{ {
// ESP_LOGI(TAG, "Outdoor temperature too warm: Disabling heating"); // ESP_LOGI(TAG, "Outdoor temperature too warm: Disabling heating");
setCirculationPumpState(DISABLED);
setBurnerState(DISABLED); setBurnerState(DISABLED);
setSafetyControlState(DISABLED); setSafetyControlState(DISABLED);
sControlState = CONTROL_OUTDOOR_TOO_WARM; sControlState = CONTROL_OUTDOOR_TOO_WARM;
@ -160,7 +117,6 @@ void taskControl(void *pvParameters)
ESP_LOGI(TAG, "Enabling burner: Return flow temperature target reached"); ESP_LOGI(TAG, "Enabling burner: Return flow temperature target reached");
eBurnerState = BURNER_UNKNOWN; eBurnerState = BURNER_UNKNOWN;
bHeatingInAction = true; bHeatingInAction = true;
setCirculationPumpState(ENABLED);
setBurnerState(ENABLED); setBurnerState(ENABLED);
setSafetyControlState(ENABLED); setSafetyControlState(ENABLED);
i64BurnerEnableTimestamp = esp_timer_get_time(); i64BurnerEnableTimestamp = esp_timer_get_time();
@ -168,10 +124,57 @@ void taskControl(void *pvParameters)
} }
else else
{ {
// ESP_LOGI(TAG, "Return flow temperature is still to warm: Disabling heating");
sControlState = CONTROL_RETURN_FLOW_TOO_WARM; sControlState = CONTROL_RETURN_FLOW_TOO_WARM;
} }
} }
}
// Disable burner if target temperature is reached or a fault occurred
if (bHeatingInAction)
{
if ((getChamberTemperature().fCurrentValue >= currentControlEntry.fChamberTemperature) ||
(getChamberTemperature().predict60s.fValue >= currentControlEntry.fChamberTemperature))
{
ESP_LOGI(TAG, "Chamber target temperature reached: Disabling burner");
bHeatingInAction = false;
setBurnerState(DISABLED);
setSafetyControlState(ENABLED);
}
else if (esp_timer_get_time() - i64BurnerEnableTimestamp >= BURNER_FAULT_DETECTION_THRESHOLD * 1000000U)
{
if (eBurnerState == BURNER_UNKNOWN)
{
if (getBurnerError() == FAULT)
{
// ESP_LOGI(TAG, "Burner fault detected after threshold!");
bHeatingInAction = false;
eBurnerState = BURNER_FAULT;
sControlState = CONTROL_FAULT_BURNER;
setBurnerState(DISABLED);
setSafetyControlState(ENABLED);
}
else
{
// ESP_LOGI(TAG, "No Burner fault detected after threshold!");
eBurnerState = BURNER_FIRED;
}
}
}
}
// Handle circulation pump state
if ((getReturnFlowTemperature().average60s.fValue <= currentControlEntry.fReturnFlowTemperature) &&
(getChamberTemperature().fCurrentValue <= CHAMBER_TEMPERATURE_THRESHOLD))
{
// ESP_LOGI(TAG, "Burner is cooled down: Disable circulation pump");
setCirculationPumpState(DISABLED);
}
else
{
// ESP_LOGI(TAG, "Burner is heated: Enable circulation pump");
setCirculationPumpState(ENABLED);
}
} // End of while(1)
} }
eControlState getControlState(void) eControlState getControlState(void)

View File

@ -14,6 +14,13 @@ typedef enum _ControlState
CONTROL_FAULT_SNTP, CONTROL_FAULT_SNTP,
} eControlState; } eControlState;
typedef enum _BurnerState
{
BURNER_UNKNOWN, // Burner is disabled or state after enabling is still unkown
BURNER_FIRED, // Burner fired successfully
BURNER_FAULT // Burner was unable to fire successfully
} eBurnerState;
typedef enum _ControlWeekday typedef enum _ControlWeekday
{ {
MONDAY, MONDAY,