diff --git a/src/brewHandler.h b/src/brewHandler.h index cd586e0e..aef0151d 100644 --- a/src/brewHandler.h +++ b/src/brewHandler.h @@ -153,7 +153,7 @@ void backflush() { backflushState = kBackflushWaitBrewswitchOff; // Force reset in case backflushOn is reset during backflush! LOG(INFO, "Backflush: Disabled via Webinterface"); } - else if (offlineMode == 1 || currBrewState > kBrewIdle || maxflushCycles <= 0 || backflushOn == 0) { + else if (offlineMode == 1 || currBrewState > kBrewIdle || backflushCycles <= 0 || backflushOn == 0) { return; } @@ -189,7 +189,7 @@ void backflush() { break; case kBackflushFilling: - if (millis() - startingTime > FILLTIME) { + if (millis() - startingTime > (backflushFillTime * 1000)) { startingTime = millis(); backflushState = kBackflushFlushingStart; } @@ -200,17 +200,17 @@ void backflush() { LOG(INFO, "Backflush: Flushing to drip tray..."); valveRelay.off(); pumpRelay.off(); - flushCycles++; + currBackflushCycles++; backflushState = kBackflushFlushing; break; case kBackflushFlushing: - if (millis() - startingTime > flushTime && flushCycles < maxflushCycles) { + if (millis() - startingTime > (backflushFlushTime * 10000) && currBackflushCycles < backflushCycles) { startingTime = millis(); backflushState = kBackflushFillingStart; } - else if (flushCycles >= maxflushCycles) { + else if (currBackflushCycles >= backflushCycles) { backflushState = kBackflushWaitBrewswitchOff; } @@ -221,7 +221,7 @@ void backflush() { LOG(INFO, "Backflush: Finished!"); valveRelay.off(); pumpRelay.off(); - flushCycles = 0; + currBackflushCycles = 0; backflushState = kBackflushWaitBrewswitchOn; } diff --git a/src/defaults.h b/src/defaults.h index 86ef035c..25b0298c 100644 --- a/src/defaults.h +++ b/src/defaults.h @@ -46,48 +46,57 @@ int writeSysParamsToStorage(void); #define WIFI_CREDENTIALS_SAVED 0 // Flag if wifi setup is done. 0: not set up, 1: credentials set up via wifi manager #define STANDBY_MODE_ON 0 // Standby mode off by default #define STANDBY_MODE_TIME 30 // Time in minutes until the heater is turned off +#define BACKFLUSH_CYCLES 5 // number of cycles the backflush should run +#define BACKFLUSH_FILL_TIME 5 // time in seconds the pump is running during backflush +#define BACKFLUSH_FLUSH_TIME 10 // time in seconds the 3-way valve is open during backflush -#define PID_KP_START_MIN 0 -#define PID_KP_START_MAX 999 -#define PID_TN_START_MIN 0 -#define PID_TN_START_MAX 999 -#define PID_KP_REGULAR_MIN 0 -#define PID_KP_REGULAR_MAX 999 -#define PID_TN_REGULAR_MIN 0 -#define PID_TN_REGULAR_MAX 999 -#define PID_TV_REGULAR_MIN 0 -#define PID_TV_REGULAR_MAX 999 -#define PID_I_MAX_REGULAR_MIN 0 -#define PID_I_MAX_REGULAR_MAX 999 -#define PID_KP_BD_MIN 0 -#define PID_KP_BD_MAX 999 -#define PID_TN_BD_MIN 0 -#define PID_TN_BD_MAX 999 -#define PID_TV_BD_MIN 0 -#define PID_TV_BD_MAX 999 -#define BREW_SETPOINT_MIN 20 -#define BREW_SETPOINT_MAX 110 -#define STEAM_SETPOINT_MIN 100 -#define STEAM_SETPOINT_MAX 140 -#define BREW_TEMP_OFFSET_MIN 0 -#define BREW_TEMP_OFFSET_MAX 20 -#define BREW_TEMP_TIME_MIN 1 -#define BREW_TEMP_TIME_MAX 180 -#define BREW_TIME_MIN 0 -#define BREW_TIME_MAX 180 -#define BREW_PID_DELAY_MIN 0 -#define BREW_PID_DELAY_MAX 60 -#define BREW_SW_TIME_MIN 1 -#define BREW_SW_TIME_MAX 180 -#define BD_THRESHOLD_MIN 0 -#define BD_THRESHOLD_MAX 999 -#define PRE_INFUSION_TIME_MIN 0 -#define PRE_INFUSION_TIME_MAX 60 -#define PRE_INFUSION_PAUSE_MIN 0 -#define PRE_INFUSION_PAUSE_MAX 60 -#define WEIGHTSETPOINT_MIN 0 -#define WEIGHTSETPOINT_MAX 500 -#define PID_KP_STEAM_MIN 0 -#define PID_KP_STEAM_MAX 500 -#define STANDBY_MODE_TIME_MIN 30 -#define STANDBY_MODE_TIME_MAX 120 +#define PID_KP_START_MIN 0 +#define PID_KP_START_MAX 999 +#define PID_TN_START_MIN 0 +#define PID_TN_START_MAX 999 +#define PID_KP_REGULAR_MIN 0 +#define PID_KP_REGULAR_MAX 999 +#define PID_TN_REGULAR_MIN 0 +#define PID_TN_REGULAR_MAX 999 +#define PID_TV_REGULAR_MIN 0 +#define PID_TV_REGULAR_MAX 999 +#define PID_I_MAX_REGULAR_MIN 0 +#define PID_I_MAX_REGULAR_MAX 999 +#define PID_KP_BD_MIN 0 +#define PID_KP_BD_MAX 999 +#define PID_TN_BD_MIN 0 +#define PID_TN_BD_MAX 999 +#define PID_TV_BD_MIN 0 +#define PID_TV_BD_MAX 999 +#define BREW_SETPOINT_MIN 20 +#define BREW_SETPOINT_MAX 110 +#define STEAM_SETPOINT_MIN 100 +#define STEAM_SETPOINT_MAX 140 +#define BREW_TEMP_OFFSET_MIN 0 +#define BREW_TEMP_OFFSET_MAX 20 +#define BREW_TEMP_TIME_MIN 1 +#define BREW_TEMP_TIME_MAX 180 +#define BREW_TIME_MIN 0 +#define BREW_TIME_MAX 180 +#define BREW_PID_DELAY_MIN 0 +#define BREW_PID_DELAY_MAX 60 +#define BREW_SW_TIME_MIN 1 +#define BREW_SW_TIME_MAX 180 +#define BD_THRESHOLD_MIN 0 +#define BD_THRESHOLD_MAX 999 +#define PRE_INFUSION_TIME_MIN 0 +#define PRE_INFUSION_TIME_MAX 60 +#define PRE_INFUSION_PAUSE_MIN 0 +#define PRE_INFUSION_PAUSE_MAX 60 +#define WEIGHTSETPOINT_MIN 0 +#define WEIGHTSETPOINT_MAX 500 +#define PID_KP_STEAM_MIN 0 +#define PID_KP_STEAM_MAX 500 +#define STANDBY_MODE_TIME_MIN 30 +#define STANDBY_MODE_TIME_MAX 120 +#define BACKFLUSH_CYCLES_MIN 5 +#define BACKFLUSH_CYCLES_MAX 20 +#define BACKFLUSH_FILL_TIME_MIN 5 +#define BACKFLUSH_FILL_TIME_MAX 20 +#define BACKFLUSH_FLUSH_TIME_MIN 5 +#define BACKFLUSH_FLUSH_TIME_MAX 20 diff --git a/src/display/displayCommon.h b/src/display/displayCommon.h index 73ab97d7..5c28eb35 100644 --- a/src/display/displayCommon.h +++ b/src/display/displayCommon.h @@ -384,9 +384,9 @@ bool displayMachineState() { default: u8g2.setFont(u8g2_font_fub17_tf); u8g2.setCursor(42, 42); - u8g2.print(flushCycles + 1, 0); + u8g2.print(currBackflushCycles + 1, 0); u8g2.print("/"); - u8g2.print(maxflushCycles, 0); + u8g2.print(backflushCycles, 0); break; } diff --git a/src/main.cpp b/src/main.cpp index 6efc0cba..2613073a 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -122,9 +122,12 @@ unsigned int wifiReconnects = 0; // actual number of reconnects const char* OTApass = OTAPASS; // Backflush values -const unsigned long fillTime = FILLTIME; -const unsigned long flushTime = FLUSHTIME; -int maxflushCycles = MAXFLUSHCYCLES; +uint8_t backflushCycles = BACKFLUSH_CYCLES; +double backflushFillTime = BACKFLUSH_FILL_TIME; +double backflushFlushTime = BACKFLUSH_FLUSH_TIME; +int backflushOn = 0; +int backflushState = 10; +int currBackflushCycles = 0; // number of active flush cycles // Optocoupler unsigned long previousMillisOptocouplerReading = millis(); @@ -272,6 +275,9 @@ SysPara sysParaStandbyModeTime(&standbyModeTime, STANDBY_MODE_TIME_MIN, SysPara sysParaScaleCalibration(&scaleCalibration, -100000, 100000, STO_ITEM_SCALE_CALIBRATION_FACTOR); SysPara sysParaScale2Calibration(&scale2Calibration, -100000, 100000, STO_ITEM_SCALE2_CALIBRATION_FACTOR); SysPara sysParaScaleKnownWeight(&scaleKnownWeight, 0, 2000, STO_ITEM_SCALE_KNOWN_WEIGHT); +SysPara sysParaBackflushCycles(&backflushCycles, BACKFLUSH_CYCLES_MIN, BACKFLUSH_CYCLES_MAX, STO_ITEM_BACKFLUSH_CYCLES); +SysPara sysParaBackflushFillTime(&backflushFillTime, BACKFLUSH_FILL_TIME_MIN, BACKFLUSH_FILL_TIME_MAX, STO_ITEM_BACKFLUSH_FILL_TIME); +SysPara sysParaBackflushFlushTime(&backflushFlushTime, BACKFLUSH_FLUSH_TIME_MIN, BACKFLUSH_FLUSH_TIME_MAX, STO_ITEM_BACKFLUSH_FLUSH_TIME); // Other variables boolean emergencyStop = false; // Emergency stop if temperature is too high @@ -279,10 +285,6 @@ const double EmergencyStopTemp = 145; // Temp EmergencyStopTemp float inX = 0, inY = 0, inOld = 0, inSum = 0; // used for filterPressureValue() boolean brewDetected = 0; boolean setupDone = false; -int backflushOn = 0; // 1 = backflush mode active -int flushCycles = 0; // number of active flush cycles - -int backflushState = 10; // Water sensor boolean waterFull = true; @@ -2080,6 +2082,9 @@ int readSysParamsFromStorage(void) { if (sysParaScaleCalibration.getStorage() != 0) return -1; if (sysParaScale2Calibration.getStorage() != 0) return -1; if (sysParaScaleKnownWeight.getStorage() != 0) return -1; + if (sysParaBackflushCycles.getStorage() != 0) return -1; + if (sysParaBackflushFillTime.getStorage() != 0) return -1; + if (sysParaBackflushFlushTime.getStorage() != 0) return -1; return 0; } @@ -2119,6 +2124,9 @@ int writeSysParamsToStorage(void) { if (sysParaScaleCalibration.setStorage() != 0) return -1; if (sysParaScale2Calibration.setStorage() != 0) return -1; if (sysParaScaleKnownWeight.setStorage() != 0) return -1; + if (sysParaBackflushCycles.setStorage() != 0) return -1; + if (sysParaBackflushFillTime.setStorage() != 0) return -1; + if (sysParaBackflushFlushTime.setStorage() != 0) return -1; return storageCommit(); } diff --git a/src/storage.h b/src/storage.h index ee54171c..f5357e44 100644 --- a/src/storage.h +++ b/src/storage.h @@ -43,6 +43,9 @@ typedef enum { STO_ITEM_SCALE_KNOWN_WEIGHT, // Calibration weight for scale STO_ITEM_RESERVED_30, // reserved STO_ITEM_RESERVED_21, // reserved + STO_ITEM_BACKFLUSH_CYCLES, // number of cycles the backflush should run + STO_ITEM_BACKFLUSH_FILL_TIME, // time in ms the pump is running during backflush + STO_ITEM_BACKFLUSH_FLUSH_TIME, // time in ms the 3-way valve is open during backflush /* WHEN ADDING NEW ITEMS, THE FOLLOWING HAS TO BE UPDATED: * - storage structure: sto_data_t @@ -110,6 +113,10 @@ typedef struct __attribute__((packed)) { double steamSetpoint; uint8_t standbyModeOn; double standbyModeTime; + uint8_t backflushCycles; + double backflushFillTimeMs; + double backflushFlushTimeMs; + } sto_data_t; // set item defaults @@ -156,7 +163,10 @@ static const sto_data_t itemDefaults PROGMEM = { STEAMKP, // STO_ITEM_PID_KP_STEAM STEAMSETPOINT, // STO_ITEM_STEAM_SETPOINT STANDBY_MODE_ON, // STO_ITEM_STANDBY_MODE_ON - STANDBY_MODE_TIME // STO_ITEM_STANDBY_MODE_TIME + STANDBY_MODE_TIME, // STO_ITEM_STANDBY_MODE_TIME + BACKFLUSH_CYCLES, // STO_ITEM_BACKFLUSH_CYCLES + BACKFLUSH_FILL_TIME, // STO_ITEM_BACKFLUSH_FILLTIME + BACKFLUSH_FLUSH_TIME, // STO_ITEM_BACKFLUSH_FLUSHTIME }; /** @@ -334,6 +344,21 @@ static inline int32_t getItemAddr(sto_item_id_t itemId, uint16_t* maxItemSize = size = STRUCT_MEMBER_SIZE(sto_data_t, scaleKnownWeight); break; + case STO_ITEM_BACKFLUSH_CYCLES: + addr = offsetof(sto_data_t, backflushCycles); + size = STRUCT_MEMBER_SIZE(sto_data_t, backflushCycles); + break; + + case STO_ITEM_BACKFLUSH_FILL_TIME: + addr = offsetof(sto_data_t, backflushFillTimeMs); + size = STRUCT_MEMBER_SIZE(sto_data_t, backflushFillTimeMs); + break; + + case STO_ITEM_BACKFLUSH_FLUSH_TIME: + addr = offsetof(sto_data_t, backflushFlushTimeMs); + size = STRUCT_MEMBER_SIZE(sto_data_t, backflushFlushTimeMs); + break; + default: LOGF(ERROR, "invalid item ID %i!", itemId); addr = -1;