From d434fde92ea98b7400223a84ab723f61cecf6a92 Mon Sep 17 00:00:00 2001 From: Jan Philipp Ecker Date: Mon, 3 Mar 2025 16:37:03 +0100 Subject: [PATCH] Reworks the scale calibration handling Fixes some issues in the scale handling. Prevents a wdg reset after after scale calibration. Also makes sure that after calibration all tasks are started again that have been suspsended before. --- src/main.cpp | 55 ++++++++++++++++++++-------------------- src/scale.cpp | 70 ++++++++++++++++++++++++++++++--------------------- src/scale.h | 2 +- 3 files changed, 71 insertions(+), 56 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 94a007f..84e45f1 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -13,6 +13,9 @@ #include "esp_task_wdt.h" #include "commonFS.h" +bool mainTaskWasPaused = 0; +uint8_t scaleTareCounter = 0; + // ##### SETUP ##### void setup() { Serial.begin(115200); @@ -45,32 +48,14 @@ void setup() { // NFC Reader startNfc(); - uint8_t scaleCalibrated = start_scale(); - if (scaleCalibrated == 3) { - oledShowMessage("Scale not calibrated!"); - for (uint16_t i = 0; i < 50000; i++) { - yield(); - vTaskDelay(pdMS_TO_TICKS(1)); - esp_task_wdt_reset(); - } - } else if (scaleCalibrated == 0) { - oledShowMessage("HX711 not found"); - for (uint16_t i = 0; i < 50000; i++) { - yield(); - vTaskDelay(pdMS_TO_TICKS(1)); - esp_task_wdt_reset(); - } - } - + start_scale(); + // WDT initialisieren mit 10 Sekunden Timeout bool panic = true; // Wenn true, löst ein WDT-Timeout einen System-Panik aus - esp_task_wdt_init(10, panic); + esp_task_wdt_init(10, panic); // Aktuellen Task (loopTask) zum Watchdog hinzufügen esp_task_wdt_add(NULL); - - // Optional: Andere Tasks zum Watchdog hinzufügen, falls nötig - // esp_task_wdt_add(task_handle); } @@ -147,9 +132,17 @@ void loop() { } // Ausgabe der Waage auf Display - if (pauseMainTask == 0 && weight != lastWeight && hasReadRfidTag == 0 && (!autoSendToBambu || autoSetToBambuSpoolId == 0)) + if(pauseMainTask == 0) { - (weight < 2) ? ((weight < -2) ? oledShowMessage("!! -0") : oledShowWeight(0)) : oledShowWeight(weight); + if (mainTaskWasPaused || (weight != lastWeight && hasReadRfidTag == 0 && (!autoSendToBambu || autoSetToBambuSpoolId == 0))) + { + (weight < 2) ? ((weight < -2) ? oledShowMessage("!! -0") : oledShowWeight(0)) : oledShowWeight(weight); + } + mainTaskWasPaused = false; + } + else + { + mainTaskWasPaused = true; } @@ -161,11 +154,20 @@ void loop() { // Prüfen ob die Waage korrekt genullt ist if ((weight > 0 && weight < 5) || weight < 0) { - scale_tare_counter++; + if(scaleTareCounter < 5) + { + scaleTareCounter++; + } + else + { + scaleTareRequest = true; + scaleTareCounter = 0; + } + } else { - scale_tare_counter = 0; + scaleTareCounter = 0; } // Prüfen ob das Gewicht gleich bleibt und dann senden @@ -209,7 +211,6 @@ void loop() { vTaskDelay(2000 / portTICK_PERIOD_MS); } } - - yield(); + esp_task_wdt_reset(); } diff --git a/src/scale.cpp b/src/scale.cpp index d2c6716..62db4d1 100644 --- a/src/scale.cpp +++ b/src/scale.cpp @@ -14,7 +14,7 @@ TaskHandle_t ScaleTask; int16_t weight = 0; uint8_t weigthCouterToApi = 0; -uint8_t scale_tare_counter = 0; +bool scaleTareRequest = false; uint8_t pauseMainTask = 0; uint8_t scaleCalibrated = 1; @@ -34,14 +34,16 @@ void scale_loop(void * parameter) { Serial.println("++++++++++++++++++++++++++++++"); Serial.println("Scale Loop started"); Serial.println("++++++++++++++++++++++++++++++"); + for(;;) { if (scale.is_ready()) { // Waage nochmal Taren, wenn zu lange Abweichung - if (scale_tare_counter >= 5) + if (scaleTareRequest == true) { + Serial.println("Re-Tare scale"); scale.tare(); - scale_tare_counter = 0; + scaleTareRequest = false; } weight = round(scale.get_units()); @@ -51,13 +53,13 @@ void scale_loop(void * parameter) { } } -uint8_t start_scale() { +void start_scale() { Serial.println("Prüfe Calibration Value"); - long calibrationValue; + float calibrationValue; // NVS lesen preferences.begin(NVS_NAMESPACE, true); // true = readonly - calibrationValue = preferences.getLong(NVS_KEY_CALIBRATION, defaultScaleCalibrationValue); + calibrationValue = preferences.getFloat(NVS_KEY_CALIBRATION, defaultScaleCalibrationValue); preferences.end(); Serial.print("Read Scale Calibration Value "); @@ -68,6 +70,13 @@ uint8_t start_scale() { if (isnan(calibrationValue) || calibrationValue < 1) { calibrationValue = defaultScaleCalibrationValue; scaleCalibrated = 0; + + oledShowMessage("Scale not calibrated!"); + for (uint16_t i = 0; i < 50000; i++) { + yield(); + vTaskDelay(pdMS_TO_TICKS(1)); + esp_task_wdt_reset(); + } } oledShowMessage("Scale Tare Please remove all"); @@ -101,21 +110,21 @@ uint8_t start_scale() { } else { Serial.println("ScaleLoop-Task erfolgreich erstellt"); } - - return (scaleCalibrated == 1) ? 1 : 3; } uint8_t calibrate_scale() { - long newCalibrationValue; + uint8_t returnState = 0; + float newCalibrationValue; + + vTaskSuspend(RfidReaderTask); + vTaskSuspend(ScaleTask); - //vTaskSuspend(RfidReaderTask); - vTaskDelete(RfidReaderTask); - vTaskDelete(ScaleTask); pauseBambuMqttTask = true; pauseMainTask = 1; - + if (scale.wait_ready_timeout(1000)) { + scale.set_scale(); oledShowMessage("Step 1 empty Scale"); @@ -137,7 +146,7 @@ uint8_t calibrate_scale() { esp_task_wdt_reset(); } - long newCalibrationValue = scale.get_units(10); + float newCalibrationValue = scale.get_units(10); Serial.print("Result: "); Serial.println(newCalibrationValue); @@ -150,35 +159,43 @@ uint8_t calibrate_scale() { // Speichern mit NVS preferences.begin(NVS_NAMESPACE, false); // false = readwrite - preferences.putLong(NVS_KEY_CALIBRATION, newCalibrationValue); + preferences.putFloat(NVS_KEY_CALIBRATION, newCalibrationValue); preferences.end(); // Verifizieren preferences.begin(NVS_NAMESPACE, true); - long verifyValue = preferences.getLong(NVS_KEY_CALIBRATION, 0); + float verifyValue = preferences.getFloat(NVS_KEY_CALIBRATION, 0); preferences.end(); Serial.print("Verified stored value: "); Serial.println(verifyValue); - Serial.println("End calibration, revome weight"); + Serial.println("End calibration, remove weight"); oledShowMessage("Remove weight"); + scale.set_scale(newCalibrationValue); for (uint16_t i = 0; i < 2000; i++) { yield(); vTaskDelay(pdMS_TO_TICKS(1)); esp_task_wdt_reset(); } + + oledShowMessage("Scale calibrated"); - oledShowMessage("Calibration done"); + // For some reason it is not possible to re-tare the scale here, it will result in a wdt timeout. Instead let the scale loop do the taring + //scale.tare(); + scaleTareRequest = true; for (uint16_t i = 0; i < 2000; i++) { yield(); vTaskDelay(pdMS_TO_TICKS(1)); esp_task_wdt_reset(); } + + returnState = 1; } + else { { @@ -191,10 +208,10 @@ uint8_t calibrate_scale() { vTaskDelay(pdMS_TO_TICKS(1)); esp_task_wdt_reset(); } - return 0; + returnState = 0; } - } - } + } + } else { Serial.println("HX711 not found."); @@ -206,16 +223,13 @@ uint8_t calibrate_scale() { vTaskDelay(pdMS_TO_TICKS(1)); esp_task_wdt_reset(); } - return 0; + returnState = 0; } - oledShowMessage("Scale Ready"); - - Serial.println("restart Scale Task"); - start_scale(); - + vTaskResume(RfidReaderTask); + vTaskResume(ScaleTask); pauseBambuMqttTask = false; pauseMainTask = 0; - return 1; + return returnState; } diff --git a/src/scale.h b/src/scale.h index e721571..4f99b7c 100644 --- a/src/scale.h +++ b/src/scale.h @@ -12,7 +12,7 @@ uint8_t tareScale(); extern HX711 scale; extern int16_t weight; extern uint8_t weigthCouterToApi; -extern uint8_t scale_tare_counter; +extern uint8_t scaleTareRequest; extern uint8_t pauseMainTask; extern uint8_t scaleCalibrated;