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) {