From dcace073d9c0d61a0e380f7658937b133bc093ccbe0e0309fa79c31977a68a92 Mon Sep 17 00:00:00 2001 From: localhorst Date: Fri, 25 Apr 2025 21:45:59 +0200 Subject: [PATCH] rework circulation pump --- main/control.c | 95 ++++++++++++++++++++++++++------------------------ main/control.h | 7 ++++ 2 files changed, 56 insertions(+), 46 deletions(-) diff --git a/main/control.c b/main/control.c index f540b80..f140917 100644 --- a/main/control.c +++ b/main/control.c @@ -58,13 +58,6 @@ void initControl(void) } } -typedef enum _BurnerState -{ - BURNER_UNKNOWN, - BURNER_FIRED, - BURNER_FAULT -} eBurnerState; - void taskControl(void *pvParameters) { bool bHeatingInAction = false; @@ -84,7 +77,6 @@ void taskControl(void *pvParameters) { ESP_LOGW(TAG, "Disabling burner due to safety fault"); bHeatingInAction = false; - setCirculationPumpState(ENABLED); setBurnerState(DISABLED); setSafetyControlState(ENABLED); } @@ -100,7 +92,6 @@ void taskControl(void *pvParameters) { ESP_LOGW(TAG, "Disabling burner due to SNTP fault"); bHeatingInAction = false; - setCirculationPumpState(ENABLED); setBurnerState(DISABLED); setSafetyControlState(ENABLED); } @@ -110,46 +101,12 @@ void taskControl(void *pvParameters) // Get current temperature entry sControlTemperatureEntry currentControlEntry = getCurrentTemperatureEntry(); - if (bHeatingInAction) - { - 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; - } - } - } - } - + // Enable burner if outdoor temperature is low and return flow temperature is cooled down if (!bHeatingInAction && (eBurnerState != BURNER_FAULT)) { if (getOutdoorTemperature().average60s.fValue >= OUTDOOR_TEMPERATURE_THRESHOLD) { // ESP_LOGI(TAG, "Outdoor temperature too warm: Disabling heating"); - setCirculationPumpState(DISABLED); setBurnerState(DISABLED); setSafetyControlState(DISABLED); sControlState = CONTROL_OUTDOOR_TOO_WARM; @@ -160,7 +117,6 @@ void taskControl(void *pvParameters) ESP_LOGI(TAG, "Enabling burner: Return flow temperature target reached"); eBurnerState = BURNER_UNKNOWN; bHeatingInAction = true; - setCirculationPumpState(ENABLED); setBurnerState(ENABLED); setSafetyControlState(ENABLED); i64BurnerEnableTimestamp = esp_timer_get_time(); @@ -168,10 +124,57 @@ void taskControl(void *pvParameters) } else { + // ESP_LOGI(TAG, "Return flow temperature is still to warm: Disabling heating"); 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) diff --git a/main/control.h b/main/control.h index ba60d4c..fe7f3ad 100644 --- a/main/control.h +++ b/main/control.h @@ -14,6 +14,13 @@ typedef enum _ControlState CONTROL_FAULT_SNTP, } 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 { MONDAY,