From 1143e8b9a3b18736ea8ef9ea4708f389ba706f10 Mon Sep 17 00:00:00 2001 From: Jens B Date: Sun, 30 Jul 2023 21:12:04 +0200 Subject: [PATCH] =?UTF-8?q?improved=20reliablity=20of=20setting=20desired?= =?UTF-8?q?=20water=20temperatur=20-=20PureSpaIO::setDesiredWaterTempCelsi?= =?UTF-8?q?us:=20repeat=20intial=20change=20on=20failure=20(more=20robust)?= =?UTF-8?q?=20-=20PureSpaIO::setDesiredWaterTempCelsius:=20skip=20getting?= =?UTF-8?q?=20acutal=20setpoint=20when=20change=20has=20failed=20(speedup)?= =?UTF-8?q?=20-=20PureSpaIO::setDesiredWaterTempCelsius:=20increase=20init?= =?UTF-8?q?al=20wait=20after=20change=20to=20catch=20double=20trigger=20(m?= =?UTF-8?q?ore=20robust)=20-=20PureSpaIO::setDesiredWaterTempCelsius:=20in?= =?UTF-8?q?crease=20changeTries=20by=20one=20fore=20ever=2010=20degrees=20?= =?UTF-8?q?(more=20robust)=20-=20PureSpaIO::decodeButton:=20incease=20repl?= =?UTF-8?q?y=20pulse=20length=20to=203=20=C2=B5s=20(more=20robust)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- PureSpaIO.cpp | 59 +++++++++++++++++++++++++++++++++------------------ PureSpaIO.h | 2 +- common.h | 2 +- 3 files changed, 40 insertions(+), 23 deletions(-) diff --git a/PureSpaIO.cpp b/PureSpaIO.cpp index a8d04fb..6031c9d 100644 --- a/PureSpaIO.cpp +++ b/PureSpaIO.cpp @@ -481,23 +481,38 @@ void PureSpaIO::setDesiredWaterTempCelsius(int temp) delay(1); #else // trigger temp modification - changeWaterTemp(-1); + if (!changeWaterTemp(-1)) + { + changeWaterTemp(+1); + } - int sleep = 100; // ms + int sleep = 5*CYCLE::PERIOD; // ms int changeTries = 3; int setTemp = UNDEF::INT; + bool getActualSetpoint = true; do { - // wait for temp readback (will take 2-3 blink durations) - int readTries = 5*BLINK::PERIOD/sleep; - int newSetTemp = UNDEF::INT; + // get actual temperature setpoint (will take 2-3 blink durations, especially inital) but skip when change has failed + int readTries = 4*BLINK::PERIOD/sleep; + int newSetTemp = getActualSetpoint? UNDEF::INT : setTemp; ESP.wdtFeed(); - do + if (getActualSetpoint) + { + // always wait after change, especially to catch double trigger + waitBuzzerOff(); + delay(BLINK::PERIOD); + } + while (getActualSetpoint) { - delay(sleep); newSetTemp = getDesiredWaterTempCelsius(); readTries--; - } while (newSetTemp == setTemp && readTries); + getActualSetpoint = newSetTemp == setTemp && readTries; + if (getActualSetpoint) + { + // only wait when not done + delay(sleep); + } + } DEBUG_MSG("\nst:%d (rt:%d)", newSetTemp, readTries); // check success @@ -513,18 +528,19 @@ void PureSpaIO::setDesiredWaterTempCelsius(int temp) if (setTemp == UNDEF::INT) { changeTries += abs(newSetTemp - temp); + changeTries += changeTries/10; } // change temperature by 1 degree setTemp = newSetTemp; if (temp > setTemp) { - changeWaterTemp(+1); + getActualSetpoint = changeWaterTemp(+1); changeTries--; } else if (temp < setTemp) { - changeWaterTemp(-1); + getActualSetpoint = changeWaterTemp(-1); changeTries--; } } @@ -599,18 +615,19 @@ void PureSpaIO::setDisinfectionTime(int hours) */ bool PureSpaIO::pressButton(volatile unsigned int& buttonPressCount) { - WiFi.setSleepMode(WIFI_LIGHT_SLEEP); waitBuzzerOff(); unsigned int tries = BUTTON::ACK_TIMEOUT/BUTTON::ACK_CHECK_PERIOD; + WiFi.setSleepMode(WIFI_LIGHT_SLEEP); buttonPressCount = BUTTON::PRESS_COUNT; while (buttonPressCount && tries) { delay(BUTTON::ACK_CHECK_PERIOD); tries--; } + bool success = state.buzzer; WiFi.setSleepMode(WIFI_NONE_SLEEP); - return tries; + return success; } void PureSpaIO::setBubbleOn(bool on) @@ -693,10 +710,12 @@ bool PureSpaIO::waitBuzzerOff() const */ bool PureSpaIO::changeWaterTemp(int up) { + bool success = false; + if (isPowerOn() && state.error == ERROR_NONE) { - waitBuzzerOff(); //DEBUG_MSG("\nP "); + waitBuzzerOff(); #ifndef FORCE_WIFI_SLEEP WiFi.setSleepMode(WIFI_LIGHT_SLEEP); @@ -725,7 +744,7 @@ bool PureSpaIO::changeWaterTemp(int up) buttons.toggleTempDown = 0; } - // wait for buzzer + // wait for buzzer on tries = (BUTTON::PRESS_COUNT - BUTTON::PRESS_SHORT_COUNT)*CYCLE::PERIOD/BUTTON::ACK_CHECK_PERIOD; while (!state.buzzer && tries) { @@ -733,21 +752,19 @@ bool PureSpaIO::changeWaterTemp(int up) tries--; } + success = state.buzzer; + #ifndef FORCE_WIFI_SLEEP WiFi.setSleepMode(WIFI_NONE_SLEEP); #endif - if (state.buzzer) - { - return true; - } - else + if (!success) { DEBUG_MSG("\ncWT fail"); } } - return false; + return success; } int PureSpaIO::convertDisplayToCelsius(uint32 value) const @@ -1210,7 +1227,7 @@ ICACHE_RAM_ATTR inline void PureSpaIO::decodeButton() #if F_CPU == 160000000L delayMicroseconds(1); pinMode(PIN::DATA, OUTPUT); - delayMicroseconds(2); + delayMicroseconds(3); pinMode(PIN::DATA, INPUT); #else #error 160 MHz CPU frequency required! Pulse timing not possible at 80 MHz, because the code above takes too long to reach this point. diff --git a/PureSpaIO.h b/PureSpaIO.h index e9ffed6..82f8b6c 100644 --- a/PureSpaIO.h +++ b/PureSpaIO.h @@ -234,7 +234,7 @@ class PureSpaIO { public: static const unsigned int PRESS_COUNT = BLINK::PERIOD/CYCLE::PERIOD; // cycles, must be long enough to activate buzzer - static const unsigned int PRESS_SHORT_COUNT = 340/CYCLE::PERIOD; // cycles, must be long enough to trigger, but short enough to avoid double trigger + static const unsigned int PRESS_SHORT_COUNT = 380/CYCLE::PERIOD; // cycles, must be long enough to trigger, but short enough to avoid double trigger static const unsigned int ACK_CHECK_PERIOD = 10; // ms static const unsigned int ACK_TIMEOUT = 2*PRESS_COUNT*CYCLE::PERIOD; // ms }; diff --git a/common.h b/common.h index 635e6db..7ac4a88 100644 --- a/common.h +++ b/common.h @@ -51,7 +51,7 @@ namespace CONFIG { - const char WIFI_VERSION[] = "1.0.6.1"; // 24.07.2023 + const char WIFI_VERSION[] = "1.0.6.2"; // 30.07.2023 // WiFi parameters const unsigned long WIFI_MAX_DISCONNECT_DURATION = 900000; // [ms] 5 min until reboot