Compare commits
	
		
			9 Commits
		
	
	
		
			v1.4.12
			...
			9ed3c70c01
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 9ed3c70c01 | |||
| e23f3a2151 | |||
| f73306f0b9 | |||
| a450d4bd1a | |||
| d48d994c00 | |||
| 32bb85f897 | |||
| e9d32ee060 | |||
| aba28422bd | |||
| 4a55620d39 | 
							
								
								
									
										21
									
								
								CHANGELOG.md
									
									
									
									
									
								
							
							
						
						
									
										21
									
								
								CHANGELOG.md
									
									
									
									
									
								
							@@ -1,5 +1,26 @@
 | 
			
		||||
# Changelog
 | 
			
		||||
 | 
			
		||||
## [1.5.1] - 2025-03-30
 | 
			
		||||
### Changed
 | 
			
		||||
- update version to 1.5.1 and improve OTA update handling with task management
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
## [1.4.14] - 2025-03-30
 | 
			
		||||
### Added
 | 
			
		||||
- add auto-tare functionality and update scale handling based on touch sensor connection
 | 
			
		||||
 | 
			
		||||
### Changed
 | 
			
		||||
- update platformio.ini for version v1.4.14
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
## [1.4.13] - 2025-03-30
 | 
			
		||||
### Changed
 | 
			
		||||
- update platformio.ini for version v1.4.13
 | 
			
		||||
 | 
			
		||||
### Fixed
 | 
			
		||||
- update touch sensor connection logic to correctly identify connection status
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
## [1.4.12] - 2025-03-30
 | 
			
		||||
### Added
 | 
			
		||||
- add touch sensor connection check and update logic
 | 
			
		||||
 
 | 
			
		||||
@@ -55,6 +55,7 @@
 | 
			
		||||
                <h5 class="card-title">Sacle Calibration</h5>
 | 
			
		||||
                <button id="calibrateBtn" class="btn btn-primary">Calibrate Scale</button>
 | 
			
		||||
                <button id="tareBtn" class="btn btn-secondary">Tare Scale</button>
 | 
			
		||||
                   Enable Auto-TARE <input type="checkbox" id="autoTareCheckbox" onchange="setAutoTare(this.checked);" {{autoTare}}>
 | 
			
		||||
                <div id="statusMessage" class="mt-3"></div>
 | 
			
		||||
            </div>
 | 
			
		||||
        </div>
 | 
			
		||||
@@ -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();
 | 
			
		||||
    </script>
 | 
			
		||||
 
 | 
			
		||||
@@ -9,8 +9,8 @@
 | 
			
		||||
; https://docs.platformio.org/page/projectconf.html
 | 
			
		||||
 | 
			
		||||
[common]
 | 
			
		||||
version = "1.4.12"
 | 
			
		||||
to_old_version = "1.4.0"
 | 
			
		||||
version = "1.5.1"
 | 
			
		||||
to_old_version = "1.5.0"
 | 
			
		||||
 | 
			
		||||
##
 | 
			
		||||
[env:esp32dev]
 | 
			
		||||
 
 | 
			
		||||
@@ -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'))
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										35
									
								
								src/main.cpp
									
									
									
									
									
								
							
							
						
						
									
										35
									
								
								src/main.cpp
									
									
									
									
									
								
							@@ -48,8 +48,16 @@ void setup() {
 | 
			
		||||
  // NFC Reader
 | 
			
		||||
  startNfc();
 | 
			
		||||
 | 
			
		||||
  // Touch Sensor
 | 
			
		||||
  pinMode(TTP223_PIN, INPUT_PULLUP);
 | 
			
		||||
  if (digitalRead(TTP223_PIN) == LOW) 
 | 
			
		||||
  {
 | 
			
		||||
    Serial.println("Touch Sensor is connected");
 | 
			
		||||
    touchSensorConnected = true;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // Scale
 | 
			
		||||
  start_scale();
 | 
			
		||||
  start_scale(touchSensorConnected);
 | 
			
		||||
 | 
			
		||||
  // WDT initialisieren mit 10 Sekunden Timeout
 | 
			
		||||
  bool panic = true; // Wenn true, löst ein WDT-Timeout einen System-Panik aus
 | 
			
		||||
@@ -57,19 +65,6 @@ void setup() {
 | 
			
		||||
 | 
			
		||||
  // Aktuellen Task (loopTask) zum Watchdog hinzufügen
 | 
			
		||||
  esp_task_wdt_add(NULL);
 | 
			
		||||
 | 
			
		||||
  // Touch Sensor
 | 
			
		||||
  pinMode(TTP223_PIN, INPUT_PULLUP);
 | 
			
		||||
  if (digitalRead(TTP223_PIN) == HIGH) 
 | 
			
		||||
  {
 | 
			
		||||
    Serial.println("Touch Sensor is not connected");
 | 
			
		||||
    touchSensorConnected = false;
 | 
			
		||||
  } 
 | 
			
		||||
  else 
 | 
			
		||||
  {
 | 
			
		||||
    Serial.println("Touch Sensor is connected");
 | 
			
		||||
    touchSensorConnected
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -184,8 +179,18 @@ 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)
 | 
			
		||||
    if (abs(weight - lastWeight) <= 2 && weight > 5)
 | 
			
		||||
    {
 | 
			
		||||
      weigthCouterToApi++;
 | 
			
		||||
    } 
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										33
									
								
								src/ota.cpp
									
									
									
									
									
								
							
							
						
						
									
										33
									
								
								src/ota.cpp
									
									
									
									
									
								
							@@ -1,6 +1,10 @@
 | 
			
		||||
#include <Arduino.h>
 | 
			
		||||
#include <website.h>
 | 
			
		||||
#include <commonFS.h>
 | 
			
		||||
#include "scale.h"
 | 
			
		||||
#include "bambu.h"
 | 
			
		||||
#include "nfc.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
// Globale Variablen für Config Backups hinzufügen
 | 
			
		||||
String bambuCredentialsBackup;
 | 
			
		||||
@@ -151,6 +155,25 @@ void handleUpdate(AsyncWebServer &server) {
 | 
			
		||||
 | 
			
		||||
    updateHandler->onUpload([](AsyncWebServerRequest *request, String filename,
 | 
			
		||||
                             size_t index, uint8_t *data, size_t len, bool final) {
 | 
			
		||||
 | 
			
		||||
        // Disable all Tasks
 | 
			
		||||
        if (BambuMqttTask != NULL) 
 | 
			
		||||
        {
 | 
			
		||||
            Serial.println("Delete BambuMqttTask");
 | 
			
		||||
            vTaskDelete(BambuMqttTask);
 | 
			
		||||
            BambuMqttTask = NULL;
 | 
			
		||||
        }
 | 
			
		||||
        if (ScaleTask) {
 | 
			
		||||
            Serial.println("Delete ScaleTask");
 | 
			
		||||
            vTaskDelete(ScaleTask);
 | 
			
		||||
            ScaleTask = NULL;
 | 
			
		||||
        }
 | 
			
		||||
        if (RfidReaderTask) {
 | 
			
		||||
            Serial.println("Delete RfidReaderTask");
 | 
			
		||||
            vTaskDelete(RfidReaderTask);
 | 
			
		||||
            RfidReaderTask = NULL;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (!index) {
 | 
			
		||||
            updateTotalSize = request->contentLength();
 | 
			
		||||
            updateWritten = 0;
 | 
			
		||||
@@ -159,9 +182,9 @@ void handleUpdate(AsyncWebServer &server) {
 | 
			
		||||
            if (isSpiffsUpdate) {
 | 
			
		||||
                // Backup vor dem Update
 | 
			
		||||
                sendUpdateProgress(0, "backup", "Backing up configurations...");
 | 
			
		||||
                delay(200);
 | 
			
		||||
                vTaskDelay(200 / portTICK_PERIOD_MS);
 | 
			
		||||
                backupJsonConfigs();
 | 
			
		||||
                delay(200);
 | 
			
		||||
                vTaskDelay(200 / portTICK_PERIOD_MS);
 | 
			
		||||
                
 | 
			
		||||
                const esp_partition_t *partition = esp_partition_find_first(ESP_PARTITION_TYPE_DATA, ESP_PARTITION_SUBTYPE_DATA_SPIFFS, NULL);
 | 
			
		||||
                if (!partition || !Update.begin(partition->size, U_SPIFFS)) {
 | 
			
		||||
@@ -169,14 +192,14 @@ void handleUpdate(AsyncWebServer &server) {
 | 
			
		||||
                    return;
 | 
			
		||||
                }
 | 
			
		||||
                sendUpdateProgress(5, "starting", "Starting SPIFFS update...");
 | 
			
		||||
                delay(200);
 | 
			
		||||
                vTaskDelay(200 / portTICK_PERIOD_MS);
 | 
			
		||||
            } else {
 | 
			
		||||
                if (!Update.begin(updateTotalSize)) {
 | 
			
		||||
                    request->send(400, "application/json", "{\"success\":false,\"message\":\"Update initialization failed\"}");
 | 
			
		||||
                    return;
 | 
			
		||||
                }
 | 
			
		||||
                sendUpdateProgress(0, "starting", "Starting firmware update...");
 | 
			
		||||
                delay(200);
 | 
			
		||||
                vTaskDelay(200 / portTICK_PERIOD_MS);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@@ -202,7 +225,7 @@ void handleUpdate(AsyncWebServer &server) {
 | 
			
		||||
            if (currentProgress != lastProgress && (currentProgress % 10 == 0 || final)) {
 | 
			
		||||
                sendUpdateProgress(currentProgress, "uploading");
 | 
			
		||||
                oledShowMessage("Update: " + String(currentProgress) + "%");
 | 
			
		||||
                delay(50);
 | 
			
		||||
                vTaskDelay(50 / portTICK_PERIOD_MS);
 | 
			
		||||
                lastProgress = currentProgress;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 
 | 
			
		||||
@@ -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 ");
 | 
			
		||||
 
 | 
			
		||||
@@ -4,17 +4,19 @@
 | 
			
		||||
#include <Arduino.h>
 | 
			
		||||
#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;
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -75,6 +75,10 @@ void onWsEvent(AsyncWebSocket *server, AsyncWebSocketClient *client, AwsEventTyp
 | 
			
		||||
                success = calibrate_scale();
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if (doc["payload"] == "setAutoTare") {
 | 
			
		||||
                success = setAutoTare(doc["enabled"].as<bool>());
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            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
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user