From 32bb85f897556b335bec8c14e71489924ac49ebc Mon Sep 17 00:00:00 2001 From: Manuel Weiser Date: Sun, 30 Mar 2025 16:01:17 +0200 Subject: [PATCH] feat: add auto-tare functionality and update scale handling based on touch sensor connection --- html/waage.html | 10 ++++++++++ scripts/gzip_files.py | 2 +- src/main.cpp | 30 ++++++++++++++++++++---------- src/scale.cpp | 33 ++++++++++++++++++++++++++++++++- src/scale.h | 6 ++++-- src/website.cpp | 16 ++++++++++++---- 6 files changed, 79 insertions(+), 18 deletions(-) diff --git a/html/waage.html b/html/waage.html index 7f28ca4..40ffa5c 100644 --- a/html/waage.html +++ b/html/waage.html @@ -55,6 +55,7 @@
Sacle Calibration
+    Enable Auto-TARE
@@ -140,6 +141,15 @@ })); }); + // Add auto-tare function + function setAutoTare(enabled) { + ws.send(JSON.stringify({ + type: 'scale', + payload: 'setAutoTare', + enabled: enabled + })); + } + // WebSocket-Verbindung beim Laden der Seite initiieren connectWebSocket(); diff --git a/scripts/gzip_files.py b/scripts/gzip_files.py index c863edb..b67c70a 100644 --- a/scripts/gzip_files.py +++ b/scripts/gzip_files.py @@ -14,7 +14,7 @@ def copy_file(input_file, output_file): def should_compress(file): # Skip compression for spoolman.html - if file == 'spoolman.html': + if file == 'spoolman.html' or file == 'waage.html': return False # Komprimiere nur bestimmte Dateitypen return file.endswith(('.js', '.png', '.css', '.html')) diff --git a/src/main.cpp b/src/main.cpp index 24da9f0..3135fcc 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -48,16 +48,6 @@ void setup() { // NFC Reader startNfc(); - // Scale - 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); - - // Aktuellen Task (loopTask) zum Watchdog hinzufügen - esp_task_wdt_add(NULL); - // Touch Sensor pinMode(TTP223_PIN, INPUT_PULLUP); if (digitalRead(TTP223_PIN) == LOW) @@ -65,6 +55,16 @@ void setup() { Serial.println("Touch Sensor is connected"); touchSensorConnected = true; } + + // Scale + start_scale(touchSensorConnected); + + // 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); + + // Aktuellen Task (loopTask) zum Watchdog hinzufügen + esp_task_wdt_add(NULL); } @@ -179,6 +179,16 @@ void loop() { { lastWeightReadTime = currentMillis; + // Prüfen ob die Waage korrekt genullt ist + if (autoTare && (weight > 0 && weight < 5) || weight < 0) + { + scale_tare_counter++; + } + else + { + scale_tare_counter = 0; + } + // Prüfen ob das Gewicht gleich bleibt und dann senden if (weight == lastWeight && weight > 5) { diff --git a/src/scale.cpp b/src/scale.cpp index 92476f4..5808829 100644 --- a/src/scale.cpp +++ b/src/scale.cpp @@ -14,6 +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; @@ -21,8 +22,23 @@ uint8_t scaleCalibrated = 1; Preferences preferences; const char* NVS_NAMESPACE = "scale"; const char* NVS_KEY_CALIBRATION = "cal_value"; +const char* NVS_KEY_AUTOTARE = "auto_tare"; +bool autoTare = true; // ##### Funktionen für Waage ##### +uint8_t setAutoTare(bool autoTareValue) { + Serial.print("Set AutoTare to "); + Serial.println(autoTareValue); + autoTare = autoTareValue; + + // Speichern mit NVS + preferences.begin(NVS_NAMESPACE, false); // false = readwrite + preferences.putBool(NVS_KEY_AUTOTARE, autoTare); + preferences.end(); + + return 1; +} + uint8_t tareScale() { Serial.println("Tare scale"); scale.tare(); @@ -38,6 +54,14 @@ void scale_loop(void * parameter) { for(;;) { if (scale.is_ready()) { + // Waage automatisch Taren, wenn zu lange Abweichung + if (autoTare && scale_tare_counter >= 5) + { + Serial.println("Auto Tare scale"); + scale.tare(); + scale_tare_counter = 0; + } + // Waage manuell Taren if (scaleTareRequest == true) { @@ -57,13 +81,20 @@ void scale_loop(void * parameter) { } } -void start_scale() { +void start_scale(bool touchSensorConnected) { Serial.println("Prüfe Calibration Value"); float calibrationValue; // NVS lesen preferences.begin(NVS_NAMESPACE, true); // true = readonly calibrationValue = preferences.getFloat(NVS_KEY_CALIBRATION, defaultScaleCalibrationValue); + + // auto Tare + // Wenn Touch Sensor verbunden, dann autoTare auf false setzen + // Danach prüfen was in NVS gespeichert ist + autoTare = (touchSensorConnected) ? false : true; + autoTare = preferences.getBool(NVS_KEY_AUTOTARE, autoTare); + preferences.end(); Serial.print("Read Scale Calibration Value "); diff --git a/src/scale.h b/src/scale.h index 4f99b7c..96f59a4 100644 --- a/src/scale.h +++ b/src/scale.h @@ -4,17 +4,19 @@ #include #include "HX711.h" - -uint8_t start_scale(); +uint8_t setAutoTare(bool autoTareValue); +uint8_t start_scale(bool touchSensorConnected); uint8_t calibrate_scale(); 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; +extern bool autoTare; extern TaskHandle_t ScaleTask; diff --git a/src/website.cpp b/src/website.cpp index bf9e0fb..0ff02db 100644 --- a/src/website.cpp +++ b/src/website.cpp @@ -75,6 +75,10 @@ void onWsEvent(AsyncWebSocket *server, AsyncWebSocketClient *client, AwsEventTyp success = calibrate_scale(); } + if (doc["payload"] == "setAutoTare") { + success = setAutoTare(doc["enabled"].as()); + } + if (success) { ws.textAll("{\"type\":\"scale\",\"payload\":\"success\"}"); } else { @@ -203,10 +207,14 @@ void setupWebserver(AsyncWebServer &server) { // Route für Waage server.on("/waage", HTTP_GET, [](AsyncWebServerRequest *request){ Serial.println("Anfrage für /waage erhalten"); - AsyncWebServerResponse *response = request->beginResponse(LittleFS, "/waage.html.gz", "text/html"); - response->addHeader("Content-Encoding", "gzip"); - response->addHeader("Cache-Control", CACHE_CONTROL); - request->send(response); + //AsyncWebServerResponse *response = request->beginResponse(LittleFS, "/waage.html.gz", "text/html"); + //response->addHeader("Content-Encoding", "gzip"); + //response->addHeader("Cache-Control", CACHE_CONTROL); + + String html = loadHtmlWithHeader("/waage.html"); + html.replace("{{autoTare}}", (autoTare) ? "checked" : ""); + + request->send(200, "text/html", html); }); // Route für RFID