From f66b8316669f52e22ec3f5f98c333cac7d53a02e2fed9e4f263f8442466e13e4 Mon Sep 17 00:00:00 2001 From: localhorst Date: Sat, 19 Apr 2025 08:36:19 +0200 Subject: [PATCH 1/2] rework burner fault detection --- main/control.c | 40 +++++++++++++++++++++++++++------------- 1 file changed, 27 insertions(+), 13 deletions(-) diff --git a/main/control.c b/main/control.c index 938a1a3..f8c9eb0 100644 --- a/main/control.c +++ b/main/control.c @@ -13,9 +13,9 @@ // Temperature thresholds #define RETURN_FLOW_TEMPERATURE_LOWER_LIMIT_DAY 30.0f #define RETURN_FLOW_TEMPERATURE_LOWER_LIMIT_NIGHT 25.0f -#define CHAMBER_TEMPERATURE_TARGET 80.0f // Max cutoff temperature -#define CHAMBER_TEMPERATURE_THRESHOLD 45.0f // Min threshold for burner enable -#define OUTDOOR_TEMPERATURE_THRESHOLD 15.0f // Min threshold for burner enable +#define CHAMBER_TEMPERATURE_TARGET 80.0f // Max cutoff temperature +#define CHAMBER_TEMPERATURE_THRESHOLD 45.0f // Min threshold for burner enable +#define OUTDOOR_TEMPERATURE_THRESHOLD 15.0f // Min threshold for burner enable #define BURNER_FAULT_DETECTION_THRESHOLD (60U * 15U) // Burner fault detection after 15 minutes static const char *TAG = "smart-oil-heater-control-system-control"; @@ -58,10 +58,17 @@ void initControl(void) } } +typedef enum _BurnerState +{ + BURNER_UNKNOWN, + BURNER_FIRED, + BURNER_FAULT +} eBurnerState; + void taskControl(void *pvParameters) { bool bHeatingInAction = false; - bool bBurnerFaultDetected = false; + eBurnerState eBurnerState = BURNER_UNKNOWN; int64_t i64BurnerEnableTimestamp = esp_timer_get_time(); while (1) @@ -116,20 +123,27 @@ void taskControl(void *pvParameters) } else if (esp_timer_get_time() - i64BurnerEnableTimestamp >= BURNER_FAULT_DETECTION_THRESHOLD * 1000000U) { - if (getBurnerError() == FAULT) + if (eBurnerState == BURNER_UNKNOWN) { - ESP_LOGW(TAG, "Burner fault detected after timeout!"); - bHeatingInAction = false; - bBurnerFaultDetected = true; - sControlState = CONTROL_FAULT_BURNER; - setCirculationPumpState(ENABLED); - setBurnerState(DISABLED); - setSafetyControlState(ENABLED); + if (getBurnerError() == FAULT) + { + ESP_LOGW(TAG, "Burner fault detected after timeout!"); + bHeatingInAction = false; + eBurnerState = BURNER_FAULT; + sControlState = CONTROL_FAULT_BURNER; + setCirculationPumpState(ENABLED); + setBurnerState(DISABLED); + setSafetyControlState(ENABLED); + } + else + { + eBurnerState = BURNER_FIRED; + } } } } - if (!bHeatingInAction && !bBurnerFaultDetected) + if (!bHeatingInAction && (eBurnerState != BURNER_FAULT)) { if (getOutdoorTemperature().average60s.fValue >= OUTDOOR_TEMPERATURE_THRESHOLD) { From 2477ccb42a70f1c65dd3897e7c79797a92d682453f0edd91b1c37c701162d30d Mon Sep 17 00:00:00 2001 From: localhorst Date: Sat, 19 Apr 2025 08:48:57 +0200 Subject: [PATCH 2/2] increase threshold --- main/control.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/main/control.c b/main/control.c index f8c9eb0..f540b80 100644 --- a/main/control.c +++ b/main/control.c @@ -13,10 +13,10 @@ // Temperature thresholds #define RETURN_FLOW_TEMPERATURE_LOWER_LIMIT_DAY 30.0f #define RETURN_FLOW_TEMPERATURE_LOWER_LIMIT_NIGHT 25.0f -#define CHAMBER_TEMPERATURE_TARGET 80.0f // Max cutoff temperature -#define CHAMBER_TEMPERATURE_THRESHOLD 45.0f // Min threshold for burner enable -#define OUTDOOR_TEMPERATURE_THRESHOLD 15.0f // Min threshold for burner enable -#define BURNER_FAULT_DETECTION_THRESHOLD (60U * 15U) // Burner fault detection after 15 minutes +#define CHAMBER_TEMPERATURE_TARGET 80.0f // Max cutoff temperature +#define CHAMBER_TEMPERATURE_THRESHOLD 45.0f // Min threshold for burner enable +#define OUTDOOR_TEMPERATURE_THRESHOLD 15.0f // Min threshold for burner enable +#define BURNER_FAULT_DETECTION_THRESHOLD (60U * 4U) // Burner fault detection after 4 minutes static const char *TAG = "smart-oil-heater-control-system-control"; static eControlState sControlState = CONTROL_STARTING; @@ -127,7 +127,7 @@ void taskControl(void *pvParameters) { if (getBurnerError() == FAULT) { - ESP_LOGW(TAG, "Burner fault detected after timeout!"); + ESP_LOGW(TAG, "Burner fault detected after threshold!"); bHeatingInAction = false; eBurnerState = BURNER_FAULT; sControlState = CONTROL_FAULT_BURNER; @@ -137,6 +137,7 @@ void taskControl(void *pvParameters) } else { + ESP_LOGW(TAG, "No Burner fault detected after threshold!"); eBurnerState = BURNER_FIRED; } } @@ -157,6 +158,7 @@ void taskControl(void *pvParameters) (getChamberTemperature().fCurrentValue <= CHAMBER_TEMPERATURE_THRESHOLD)) { ESP_LOGI(TAG, "Enabling burner: Return flow temperature target reached"); + eBurnerState = BURNER_UNKNOWN; bHeatingInAction = true; setCirculationPumpState(ENABLED); setBurnerState(ENABLED);