diff --git a/main/control.c b/main/control.c index 938a1a3..f540b80 100644 --- a/main/control.c +++ b/main/control.c @@ -16,7 +16,7 @@ #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 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; @@ -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,28 @@ 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 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 && !bBurnerFaultDetected) + if (!bHeatingInAction && (eBurnerState != BURNER_FAULT)) { if (getOutdoorTemperature().average60s.fValue >= OUTDOOR_TEMPERATURE_THRESHOLD) { @@ -143,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);