Compare commits
	
		
			16 Commits
		
	
	
		
			v1.4.10
			...
			a450d4bd1a
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| a450d4bd1a | |||
| d48d994c00 | |||
| 32bb85f897 | |||
| e9d32ee060 | |||
| aba28422bd | |||
| 4a55620d39 | |||
| 7b18266534 | |||
| d81acb2b61 | |||
| 8c7fc159d3 | |||
| 476d3e82e2 | |||
| 3c294a135f | |||
| bb751b6289 | |||
| 7fd01bd1b9 | |||
| 458cc4eaf2 | |||
| 
						 | 
					ac8adca84d | ||
| 
						 | 
					c701149c64 | 
							
								
								
									
										36
									
								
								CHANGELOG.md
									
									
									
									
									
								
							
							
						
						
									
										36
									
								
								CHANGELOG.md
									
									
									
									
									
								
							@@ -1,5 +1,41 @@
 | 
			
		||||
# Changelog
 | 
			
		||||
 | 
			
		||||
## [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
 | 
			
		||||
 | 
			
		||||
### Changed
 | 
			
		||||
- update platformio.ini for version v1.4.12
 | 
			
		||||
- update README files to clarify PN532 DIP switch settings
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
## [1.4.11] - 2025-03-30
 | 
			
		||||
### Added
 | 
			
		||||
- Renamed states of NFC state machine and introduced new state machine for spoolman API
 | 
			
		||||
 | 
			
		||||
### Changed
 | 
			
		||||
- update platformio.ini for version v1.4.11
 | 
			
		||||
- Merge branch 'main' of github.com:ManuelW77/Filaman
 | 
			
		||||
- Merge pull request #31 from janecker/nfc_rework
 | 
			
		||||
- Introducing enum for handling the NFC state to improve code readability
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
## [1.4.10] - 2025-03-30
 | 
			
		||||
### Added
 | 
			
		||||
- add manual tare functionality for scale
 | 
			
		||||
 
 | 
			
		||||
@@ -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,7 +9,7 @@
 | 
			
		||||
; https://docs.platformio.org/page/projectconf.html
 | 
			
		||||
 | 
			
		||||
[common]
 | 
			
		||||
version = "1.4.10"
 | 
			
		||||
version = "1.4.14"
 | 
			
		||||
to_old_version = "1.4.0"
 | 
			
		||||
 | 
			
		||||
##
 | 
			
		||||
 
 | 
			
		||||
@@ -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'))
 | 
			
		||||
 
 | 
			
		||||
@@ -3,7 +3,8 @@
 | 
			
		||||
#include <ArduinoJson.h>
 | 
			
		||||
#include "commonFS.h"
 | 
			
		||||
 | 
			
		||||
bool spoolman_connected = false;
 | 
			
		||||
volatile spoolmanApiStateType spoolmanApiState = API_INIT;
 | 
			
		||||
//bool spoolman_connected = false;
 | 
			
		||||
String spoolmanUrl = "";
 | 
			
		||||
bool octoEnabled = false;
 | 
			
		||||
String octoUrl = "";
 | 
			
		||||
@@ -85,6 +86,7 @@ JsonDocument fetchSingleSpoolInfo(int spoolId) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void sendToApi(void *parameter) {
 | 
			
		||||
    spoolmanApiState = API_TRANSMITTING;
 | 
			
		||||
    SendToApiParams* params = (SendToApiParams*)parameter;
 | 
			
		||||
 | 
			
		||||
    // Extrahiere die Werte
 | 
			
		||||
@@ -119,6 +121,7 @@ void sendToApi(void *parameter) {
 | 
			
		||||
    // Speicher freigeben
 | 
			
		||||
    delete params;
 | 
			
		||||
    vTaskDelete(NULL);
 | 
			
		||||
    spoolmanApiState = API_IDLE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool updateSpoolTagId(String uidString, const char* payload) {
 | 
			
		||||
@@ -479,7 +482,8 @@ bool checkSpoolmanInstance(const String& url) {
 | 
			
		||||
                    return false;
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                spoolman_connected = true;
 | 
			
		||||
                spoolmanApiState = API_IDLE;
 | 
			
		||||
                oledShowTopRow();
 | 
			
		||||
                return strcmp(status, "healthy") == 0;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 
 | 
			
		||||
@@ -6,7 +6,13 @@
 | 
			
		||||
#include "website.h"
 | 
			
		||||
#include "display.h"
 | 
			
		||||
#include <ArduinoJson.h>
 | 
			
		||||
typedef enum {
 | 
			
		||||
    API_INIT,
 | 
			
		||||
    API_IDLE,
 | 
			
		||||
    API_TRANSMITTING
 | 
			
		||||
} spoolmanApiStateType;
 | 
			
		||||
 | 
			
		||||
extern volatile spoolmanApiStateType spoolmanApiState;
 | 
			
		||||
extern bool spoolman_connected;
 | 
			
		||||
extern String spoolmanUrl;
 | 
			
		||||
extern bool octoEnabled;
 | 
			
		||||
 
 | 
			
		||||
@@ -177,7 +177,7 @@ void oledShowTopRow() {
 | 
			
		||||
        display.drawBitmap(50, 0, bitmap_off , 16, 16, WHITE);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (spoolman_connected == 1) {
 | 
			
		||||
    if (spoolmanApiState != API_INIT) {
 | 
			
		||||
        display.drawBitmap(80, 0, bitmap_spoolman_on , 16, 16, WHITE);
 | 
			
		||||
    } else {
 | 
			
		||||
        display.drawBitmap(80, 0, bitmap_off , 16, 16, WHITE);
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										37
									
								
								src/main.cpp
									
									
									
									
									
								
							
							
						
						
									
										37
									
								
								src/main.cpp
									
									
									
									
									
								
							@@ -15,6 +15,7 @@
 | 
			
		||||
 | 
			
		||||
bool mainTaskWasPaused = 0;
 | 
			
		||||
uint8_t scaleTareCounter = 0;
 | 
			
		||||
bool touchSensorConnected = false;
 | 
			
		||||
 | 
			
		||||
// ##### SETUP #####
 | 
			
		||||
void setup() {
 | 
			
		||||
@@ -47,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
 | 
			
		||||
@@ -56,9 +65,6 @@ void setup() {
 | 
			
		||||
 | 
			
		||||
  // Aktuellen Task (loopTask) zum Watchdog hinzufügen
 | 
			
		||||
  esp_task_wdt_add(NULL);
 | 
			
		||||
 | 
			
		||||
  // Touch Sensor
 | 
			
		||||
  pinMode(TTP223_PIN, INPUT_PULLUP);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -100,7 +106,7 @@ void loop() {
 | 
			
		||||
  unsigned long currentMillis = millis();
 | 
			
		||||
 | 
			
		||||
  // Überprüfe den Status des Touch Sensors
 | 
			
		||||
  if (digitalRead(TTP223_PIN) == HIGH && currentMillis - lastButtonPress > debounceDelay) 
 | 
			
		||||
  if (touchSensorConnected && digitalRead(TTP223_PIN) == HIGH && currentMillis - lastButtonPress > debounceDelay) 
 | 
			
		||||
  {
 | 
			
		||||
    lastButtonPress = currentMillis;
 | 
			
		||||
    scaleTareRequest = true;
 | 
			
		||||
@@ -122,7 +128,7 @@ void loop() {
 | 
			
		||||
 | 
			
		||||
    if (intervalElapsed(currentMillis, lastAutoSetBambuAmsTime, autoSetBambuAmsInterval)) 
 | 
			
		||||
    {
 | 
			
		||||
      if (hasReadRfidTag == 0)
 | 
			
		||||
      if (nfcReaderState == NFC_IDLE)
 | 
			
		||||
      {
 | 
			
		||||
        lastAutoSetBambuAmsTime = currentMillis;
 | 
			
		||||
        oledShowMessage("Auto Set         " + String(autoSetBambuAmsCounter - autoAmsCounter) + "s");
 | 
			
		||||
@@ -156,7 +162,7 @@ void loop() {
 | 
			
		||||
  // Ausgabe der Waage auf Display
 | 
			
		||||
  if(pauseMainTask == 0)
 | 
			
		||||
  {
 | 
			
		||||
    if (mainTaskWasPaused || (weight != lastWeight && hasReadRfidTag == 0 && (!autoSendToBambu || autoSetToBambuSpoolId == 0)))
 | 
			
		||||
    if (mainTaskWasPaused || (weight != lastWeight && nfcReaderState == NFC_IDLE && (!autoSendToBambu || autoSetToBambuSpoolId == 0)))
 | 
			
		||||
    {
 | 
			
		||||
      (weight < 2) ? ((weight < -2) ? oledShowMessage("!! -0") : oledShowWeight(0)) : oledShowWeight(weight);
 | 
			
		||||
    }
 | 
			
		||||
@@ -169,10 +175,20 @@ void loop() {
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  // Wenn Timer abgelaufen und nicht gerade ein RFID-Tag geschrieben wird
 | 
			
		||||
  if (currentMillis - lastWeightReadTime >= weightReadInterval && hasReadRfidTag < 3)
 | 
			
		||||
  if (currentMillis - lastWeightReadTime >= weightReadInterval && nfcReaderState < NFC_WRITING)
 | 
			
		||||
  {
 | 
			
		||||
    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)
 | 
			
		||||
    {
 | 
			
		||||
@@ -186,7 +202,8 @@ void loop() {
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // reset weight counter after writing tag
 | 
			
		||||
  if (currentMillis - lastWeightReadTime >= weightReadInterval && hasReadRfidTag > 1)
 | 
			
		||||
  // TBD: what exactly is the logic behind this?
 | 
			
		||||
  if (currentMillis - lastWeightReadTime >= weightReadInterval && nfcReaderState != NFC_IDLE && nfcReaderState != NFC_READ_SUCCESS)
 | 
			
		||||
  {
 | 
			
		||||
    weigthCouterToApi = 0;
 | 
			
		||||
  }
 | 
			
		||||
@@ -194,7 +211,7 @@ void loop() {
 | 
			
		||||
  lastWeight = weight;
 | 
			
		||||
 | 
			
		||||
  // Wenn ein Tag mit SM id erkannte wurde und der Waage Counter anspricht an SM Senden
 | 
			
		||||
  if (spoolId != "" && weigthCouterToApi > 3 && weightSend == 0 && hasReadRfidTag == 1) {
 | 
			
		||||
  if (spoolId != "" && weigthCouterToApi > 3 && weightSend == 0 && nfcReaderState == NFC_READ_SUCCESS) {
 | 
			
		||||
    oledShowIcon("loading");
 | 
			
		||||
    if (updateSpoolWeight(spoolId, weight)) 
 | 
			
		||||
    {
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										28
									
								
								src/nfc.cpp
									
									
									
									
									
								
							
							
						
						
									
										28
									
								
								src/nfc.cpp
									
									
									
									
									
								
							@@ -18,7 +18,7 @@ String spoolId = "";
 | 
			
		||||
String nfcJsonData = "";
 | 
			
		||||
volatile bool pauseBambuMqttTask = false;
 | 
			
		||||
 | 
			
		||||
volatile uint8_t hasReadRfidTag = 0;
 | 
			
		||||
volatile nfcReaderStateType nfcReaderState = NFC_IDLE;
 | 
			
		||||
// 0 = nicht gelesen
 | 
			
		||||
// 1 = erfolgreich gelesen
 | 
			
		||||
// 2 = fehler beim Lesen
 | 
			
		||||
@@ -242,7 +242,7 @@ void writeJsonToTag(void *parameter) {
 | 
			
		||||
  Serial.println("Erstelle NDEF-Message...");
 | 
			
		||||
  Serial.println(payload);
 | 
			
		||||
 | 
			
		||||
  hasReadRfidTag = 3;
 | 
			
		||||
  nfcReaderState = NFC_WRITING;
 | 
			
		||||
  vTaskSuspend(RfidReaderTask);
 | 
			
		||||
  vTaskDelay(50 / portTICK_PERIOD_MS);
 | 
			
		||||
 | 
			
		||||
@@ -288,7 +288,7 @@ void writeJsonToTag(void *parameter) {
 | 
			
		||||
        //oledShowMessage("NFC-Tag written");
 | 
			
		||||
        oledShowIcon("success");
 | 
			
		||||
        vTaskDelay(1000 / portTICK_PERIOD_MS);
 | 
			
		||||
        hasReadRfidTag = 5;
 | 
			
		||||
        nfcReaderState = NFC_WRITE_SUCCESS;
 | 
			
		||||
        // aktualisieren der Website wenn sich der Status ändert
 | 
			
		||||
        sendNfcData(nullptr);
 | 
			
		||||
        pauseBambuMqttTask = false;
 | 
			
		||||
@@ -310,7 +310,7 @@ void writeJsonToTag(void *parameter) {
 | 
			
		||||
        Serial.println("Fehler beim Schreiben der NDEF-Message auf den Tag");
 | 
			
		||||
        oledShowIcon("failed");
 | 
			
		||||
        vTaskDelay(2000 / portTICK_PERIOD_MS);
 | 
			
		||||
        hasReadRfidTag = 4;
 | 
			
		||||
        nfcReaderState = NFC_WRITE_ERROR;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  else
 | 
			
		||||
@@ -318,7 +318,7 @@ void writeJsonToTag(void *parameter) {
 | 
			
		||||
    Serial.println("Fehler: Kein Tag zu schreiben gefunden.");
 | 
			
		||||
    oledShowMessage("No NFC-Tag found");
 | 
			
		||||
    vTaskDelay(2000 / portTICK_PERIOD_MS);
 | 
			
		||||
    hasReadRfidTag = 0;
 | 
			
		||||
    nfcReaderState = NFC_IDLE;
 | 
			
		||||
  }
 | 
			
		||||
  
 | 
			
		||||
  sendWriteResult(nullptr, success);
 | 
			
		||||
@@ -334,7 +334,7 @@ void startWriteJsonToTag(const char* payload) {
 | 
			
		||||
  char* payloadCopy = strdup(payload);
 | 
			
		||||
  
 | 
			
		||||
  // Task nicht mehrfach starten
 | 
			
		||||
  if (hasReadRfidTag != 3) {
 | 
			
		||||
  if (nfcReaderState != NFC_WRITING) {
 | 
			
		||||
    // Erstelle die Task
 | 
			
		||||
    xTaskCreate(
 | 
			
		||||
        writeJsonToTag,        // Task-Funktion
 | 
			
		||||
@@ -351,7 +351,7 @@ void scanRfidTask(void * parameter) {
 | 
			
		||||
  Serial.println("RFID Task gestartet");
 | 
			
		||||
  for(;;) {
 | 
			
		||||
    // Wenn geschrieben wird Schleife aussetzen
 | 
			
		||||
    if (hasReadRfidTag != 3)
 | 
			
		||||
    if (nfcReaderState != NFC_WRITING)
 | 
			
		||||
    {
 | 
			
		||||
      yield();
 | 
			
		||||
 | 
			
		||||
@@ -363,12 +363,12 @@ void scanRfidTask(void * parameter) {
 | 
			
		||||
 | 
			
		||||
      foundNfcTag(nullptr, success);
 | 
			
		||||
      
 | 
			
		||||
      if (success && hasReadRfidTag != 1)
 | 
			
		||||
      if (success && nfcReaderState != NFC_READ_SUCCESS)
 | 
			
		||||
      {
 | 
			
		||||
        // Display some basic information about the card
 | 
			
		||||
        Serial.println("Found an ISO14443A card");
 | 
			
		||||
 | 
			
		||||
        hasReadRfidTag = 6;
 | 
			
		||||
        nfcReaderState = NFC_READING;
 | 
			
		||||
 | 
			
		||||
        oledShowIcon("transfer");
 | 
			
		||||
        vTaskDelay(500 / portTICK_PERIOD_MS);
 | 
			
		||||
@@ -406,11 +406,11 @@ void scanRfidTask(void * parameter) {
 | 
			
		||||
            {
 | 
			
		||||
              oledShowMessage("NFC-Tag unknown");
 | 
			
		||||
              vTaskDelay(2000 / portTICK_PERIOD_MS);
 | 
			
		||||
              hasReadRfidTag = 2;
 | 
			
		||||
              nfcReaderState = NFC_READ_ERROR;
 | 
			
		||||
            }
 | 
			
		||||
            else 
 | 
			
		||||
            {
 | 
			
		||||
              hasReadRfidTag = 1;
 | 
			
		||||
              nfcReaderState = NFC_READ_SUCCESS;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            free(data);
 | 
			
		||||
@@ -418,7 +418,7 @@ void scanRfidTask(void * parameter) {
 | 
			
		||||
          else
 | 
			
		||||
          {
 | 
			
		||||
            oledShowMessage("NFC-Tag read error");
 | 
			
		||||
            hasReadRfidTag = 2;
 | 
			
		||||
            nfcReaderState = NFC_READ_ERROR;
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
        else
 | 
			
		||||
@@ -427,9 +427,9 @@ void scanRfidTask(void * parameter) {
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      if (!success && hasReadRfidTag > 0)
 | 
			
		||||
      if (!success && nfcReaderState != NFC_IDLE)
 | 
			
		||||
      {
 | 
			
		||||
        hasReadRfidTag = 0;
 | 
			
		||||
        nfcReaderState = NFC_IDLE;
 | 
			
		||||
        //uidString = "";
 | 
			
		||||
        nfcJsonData = "";
 | 
			
		||||
        Serial.println("Tag entfernt");
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										14
									
								
								src/nfc.h
									
									
									
									
									
								
							
							
						
						
									
										14
									
								
								src/nfc.h
									
									
									
									
									
								
							@@ -3,6 +3,16 @@
 | 
			
		||||
 | 
			
		||||
#include <Arduino.h>
 | 
			
		||||
 | 
			
		||||
typedef enum{
 | 
			
		||||
    NFC_IDLE,
 | 
			
		||||
    NFC_READING,
 | 
			
		||||
    NFC_READ_SUCCESS,
 | 
			
		||||
    NFC_READ_ERROR,
 | 
			
		||||
    NFC_WRITING,
 | 
			
		||||
    NFC_WRITE_SUCCESS,
 | 
			
		||||
    NFC_WRITE_ERROR
 | 
			
		||||
} nfcReaderStateType;
 | 
			
		||||
 | 
			
		||||
void startNfc();
 | 
			
		||||
void scanRfidTask(void * parameter);
 | 
			
		||||
void startWriteJsonToTag(const char* payload);
 | 
			
		||||
@@ -10,7 +20,9 @@ void startWriteJsonToTag(const char* payload);
 | 
			
		||||
extern TaskHandle_t RfidReaderTask;
 | 
			
		||||
extern String nfcJsonData;
 | 
			
		||||
extern String spoolId;
 | 
			
		||||
extern volatile uint8_t hasReadRfidTag;
 | 
			
		||||
extern volatile nfcReaderStateType nfcReaderState;
 | 
			
		||||
extern volatile bool pauseBambuMqttTask;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
@@ -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;
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -22,7 +22,7 @@ AsyncWebServer server(webserverPort);
 | 
			
		||||
AsyncWebSocket ws("/ws");
 | 
			
		||||
 | 
			
		||||
uint8_t lastSuccess = 0;
 | 
			
		||||
uint8_t lastHasReadRfidTag = 0;
 | 
			
		||||
nfcReaderStateType lastnfcReaderState = NFC_IDLE;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void onWsEvent(AsyncWebSocket *server, AsyncWebSocketClient *client, AwsEventType type, void *arg, uint8_t *data, size_t len) {
 | 
			
		||||
@@ -44,13 +44,15 @@ void onWsEvent(AsyncWebSocket *server, AsyncWebSocketClient *client, AwsEventTyp
 | 
			
		||||
        JsonDocument doc;
 | 
			
		||||
        deserializeJson(doc, message);
 | 
			
		||||
 | 
			
		||||
        bool spoolmanConnected = (spoolmanApiState != API_INIT);
 | 
			
		||||
 | 
			
		||||
        if (doc["type"] == "heartbeat") {
 | 
			
		||||
            // Sende Heartbeat-Antwort
 | 
			
		||||
            ws.text(client->id(), "{"
 | 
			
		||||
                "\"type\":\"heartbeat\","
 | 
			
		||||
                "\"freeHeap\":" + String(ESP.getFreeHeap()/1024) + ","
 | 
			
		||||
                "\"bambu_connected\":" + String(bambu_connected) + ","
 | 
			
		||||
                "\"spoolman_connected\":" + String(spoolman_connected) + ""
 | 
			
		||||
                "\"spoolman_connected\":" + String(spoolmanConnected) + ""
 | 
			
		||||
                "}");
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@@ -73,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 {
 | 
			
		||||
@@ -139,34 +145,31 @@ void foundNfcTag(AsyncWebSocketClient *client, uint8_t success) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void sendNfcData(AsyncWebSocketClient *client) {
 | 
			
		||||
    if (lastHasReadRfidTag == hasReadRfidTag) return;
 | 
			
		||||
    if (hasReadRfidTag == 0) {
 | 
			
		||||
        ws.textAll("{\"type\":\"nfcData\", \"payload\":{}}");
 | 
			
		||||
    if (lastnfcReaderState == nfcReaderState) return;
 | 
			
		||||
    // TBD: Why is there no status for reading the tag?
 | 
			
		||||
    switch(nfcReaderState){
 | 
			
		||||
        case NFC_IDLE:
 | 
			
		||||
            ws.textAll("{\"type\":\"nfcData\", \"payload\":{}}");
 | 
			
		||||
            break;
 | 
			
		||||
        case NFC_READ_SUCCESS:
 | 
			
		||||
            ws.textAll("{\"type\":\"nfcData\", \"payload\":" + nfcJsonData + "}");
 | 
			
		||||
            break;
 | 
			
		||||
        case NFC_READ_ERROR:
 | 
			
		||||
            ws.textAll("{\"type\":\"nfcData\", \"payload\":{\"error\":\"Empty Tag or Data not readable\"}}");
 | 
			
		||||
            break;
 | 
			
		||||
        case NFC_WRITING:
 | 
			
		||||
            ws.textAll("{\"type\":\"nfcData\", \"payload\":{\"info\":\"Schreibe Tag...\"}}");
 | 
			
		||||
            break;
 | 
			
		||||
        case NFC_WRITE_SUCCESS:
 | 
			
		||||
            ws.textAll("{\"type\":\"nfcData\", \"payload\":{\"info\":\"Tag erfolgreich geschrieben\"}}");
 | 
			
		||||
            break;
 | 
			
		||||
        case NFC_WRITE_ERROR:
 | 
			
		||||
            ws.textAll("{\"type\":\"nfcData\", \"payload\":{\"error\":\"Error writing to Tag\"}}");
 | 
			
		||||
            break;
 | 
			
		||||
        case DEFAULT:
 | 
			
		||||
            ws.textAll("{\"type\":\"nfcData\", \"payload\":{\"error\":\"Something went wrong\"}}");
 | 
			
		||||
    }
 | 
			
		||||
    else if (hasReadRfidTag == 1) {
 | 
			
		||||
        ws.textAll("{\"type\":\"nfcData\", \"payload\":" + nfcJsonData + "}");
 | 
			
		||||
    }
 | 
			
		||||
    else if (hasReadRfidTag == 2)
 | 
			
		||||
    {
 | 
			
		||||
        ws.textAll("{\"type\":\"nfcData\", \"payload\":{\"error\":\"Empty Tag or Data not readable\"}}");
 | 
			
		||||
    }
 | 
			
		||||
    else if (hasReadRfidTag == 3)
 | 
			
		||||
    {
 | 
			
		||||
        ws.textAll("{\"type\":\"nfcData\", \"payload\":{\"info\":\"Schreibe Tag...\"}}");
 | 
			
		||||
    }
 | 
			
		||||
    else if (hasReadRfidTag == 4)
 | 
			
		||||
    {
 | 
			
		||||
        ws.textAll("{\"type\":\"nfcData\", \"payload\":{\"error\":\"Error writing to Tag\"}}");
 | 
			
		||||
    }
 | 
			
		||||
    else if (hasReadRfidTag == 5)
 | 
			
		||||
    {
 | 
			
		||||
        ws.textAll("{\"type\":\"nfcData\", \"payload\":{\"info\":\"Tag erfolgreich geschrieben\"}}");
 | 
			
		||||
    }
 | 
			
		||||
    else 
 | 
			
		||||
    {
 | 
			
		||||
        ws.textAll("{\"type\":\"nfcData\", \"payload\":{\"error\":\"Something went wrong\"}}");
 | 
			
		||||
    }
 | 
			
		||||
    lastHasReadRfidTag = hasReadRfidTag;
 | 
			
		||||
    lastnfcReaderState = nfcReaderState;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void sendAmsData(AsyncWebSocketClient *client) {
 | 
			
		||||
@@ -204,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