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

View File

@ -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,