Compare commits
No commits in common. "main" and "v1.4.12" have entirely different histories.
21
CHANGELOG.md
21
CHANGELOG.md
@ -1,26 +1,5 @@
|
|||||||
# Changelog
|
# 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
|
## [1.4.12] - 2025-03-30
|
||||||
### Added
|
### Added
|
||||||
- add touch sensor connection check and update logic
|
- add touch sensor connection check and update logic
|
||||||
|
@ -55,7 +55,6 @@
|
|||||||
<h5 class="card-title">Sacle Calibration</h5>
|
<h5 class="card-title">Sacle Calibration</h5>
|
||||||
<button id="calibrateBtn" class="btn btn-primary">Calibrate Scale</button>
|
<button id="calibrateBtn" class="btn btn-primary">Calibrate Scale</button>
|
||||||
<button id="tareBtn" class="btn btn-secondary">Tare 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 id="statusMessage" class="mt-3"></div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -141,15 +140,6 @@
|
|||||||
}));
|
}));
|
||||||
});
|
});
|
||||||
|
|
||||||
// Add auto-tare function
|
|
||||||
function setAutoTare(enabled) {
|
|
||||||
ws.send(JSON.stringify({
|
|
||||||
type: 'scale',
|
|
||||||
payload: 'setAutoTare',
|
|
||||||
enabled: enabled
|
|
||||||
}));
|
|
||||||
}
|
|
||||||
|
|
||||||
// WebSocket-Verbindung beim Laden der Seite initiieren
|
// WebSocket-Verbindung beim Laden der Seite initiieren
|
||||||
connectWebSocket();
|
connectWebSocket();
|
||||||
</script>
|
</script>
|
||||||
|
@ -9,8 +9,8 @@
|
|||||||
; https://docs.platformio.org/page/projectconf.html
|
; https://docs.platformio.org/page/projectconf.html
|
||||||
|
|
||||||
[common]
|
[common]
|
||||||
version = "1.5.1"
|
version = "1.4.12"
|
||||||
to_old_version = "1.5.0"
|
to_old_version = "1.4.0"
|
||||||
|
|
||||||
##
|
##
|
||||||
[env:esp32dev]
|
[env:esp32dev]
|
||||||
|
@ -14,7 +14,7 @@ def copy_file(input_file, output_file):
|
|||||||
|
|
||||||
def should_compress(file):
|
def should_compress(file):
|
||||||
# Skip compression for spoolman.html
|
# Skip compression for spoolman.html
|
||||||
if file == 'spoolman.html' or file == 'waage.html':
|
if file == 'spoolman.html':
|
||||||
return False
|
return False
|
||||||
# Komprimiere nur bestimmte Dateitypen
|
# Komprimiere nur bestimmte Dateitypen
|
||||||
return file.endswith(('.js', '.png', '.css', '.html'))
|
return file.endswith(('.js', '.png', '.css', '.html'))
|
||||||
|
@ -166,7 +166,7 @@ bool updateSpoolTagId(String uidString, const char* payload) {
|
|||||||
BaseType_t result = xTaskCreate(
|
BaseType_t result = xTaskCreate(
|
||||||
sendToApi, // Task-Funktion
|
sendToApi, // Task-Funktion
|
||||||
"SendToApiTask", // Task-Name
|
"SendToApiTask", // Task-Name
|
||||||
6144, // Stackgröße in Bytes
|
4096, // Stackgröße in Bytes
|
||||||
(void*)params, // Parameter
|
(void*)params, // Parameter
|
||||||
0, // Priorität
|
0, // Priorität
|
||||||
NULL // Task-Handle (nicht benötigt)
|
NULL // Task-Handle (nicht benötigt)
|
||||||
@ -204,7 +204,7 @@ uint8_t updateSpoolWeight(String spoolId, uint16_t weight) {
|
|||||||
BaseType_t result = xTaskCreate(
|
BaseType_t result = xTaskCreate(
|
||||||
sendToApi, // Task-Funktion
|
sendToApi, // Task-Funktion
|
||||||
"SendToApiTask", // Task-Name
|
"SendToApiTask", // Task-Name
|
||||||
6144, // Stackgröße in Bytes
|
4096, // Stackgröße in Bytes
|
||||||
(void*)params, // Parameter
|
(void*)params, // Parameter
|
||||||
0, // Priorität
|
0, // Priorität
|
||||||
NULL // Task-Handle (nicht benötigt)
|
NULL // Task-Handle (nicht benötigt)
|
||||||
@ -243,7 +243,7 @@ bool updateSpoolOcto(int spoolId) {
|
|||||||
BaseType_t result = xTaskCreate(
|
BaseType_t result = xTaskCreate(
|
||||||
sendToApi, // Task-Funktion
|
sendToApi, // Task-Funktion
|
||||||
"SendToApiTask", // Task-Name
|
"SendToApiTask", // Task-Name
|
||||||
6144, // Stackgröße in Bytes
|
4096, // Stackgröße in Bytes
|
||||||
(void*)params, // Parameter
|
(void*)params, // Parameter
|
||||||
0, // Priorität
|
0, // Priorität
|
||||||
NULL // Task-Handle (nicht benötigt)
|
NULL // Task-Handle (nicht benötigt)
|
||||||
@ -291,7 +291,7 @@ bool updateSpoolBambuData(String payload) {
|
|||||||
BaseType_t result = xTaskCreate(
|
BaseType_t result = xTaskCreate(
|
||||||
sendToApi, // Task-Funktion
|
sendToApi, // Task-Funktion
|
||||||
"SendToApiTask", // Task-Name
|
"SendToApiTask", // Task-Name
|
||||||
6144, // Stackgröße in Bytes
|
4096, // Stackgröße in Bytes
|
||||||
(void*)params, // Parameter
|
(void*)params, // Parameter
|
||||||
0, // Priorität
|
0, // Priorität
|
||||||
NULL // Task-Handle (nicht benötigt)
|
NULL // Task-Handle (nicht benötigt)
|
||||||
|
36
src/main.cpp
36
src/main.cpp
@ -48,16 +48,8 @@ void setup() {
|
|||||||
// NFC Reader
|
// NFC Reader
|
||||||
startNfc();
|
startNfc();
|
||||||
|
|
||||||
// Touch Sensor
|
|
||||||
pinMode(TTP223_PIN, INPUT_PULLUP);
|
|
||||||
if (digitalRead(TTP223_PIN) == LOW)
|
|
||||||
{
|
|
||||||
Serial.println("Touch Sensor is connected");
|
|
||||||
touchSensorConnected = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Scale
|
// Scale
|
||||||
start_scale(touchSensorConnected);
|
start_scale();
|
||||||
|
|
||||||
// WDT initialisieren mit 10 Sekunden Timeout
|
// WDT initialisieren mit 10 Sekunden Timeout
|
||||||
bool panic = true; // Wenn true, löst ein WDT-Timeout einen System-Panik aus
|
bool panic = true; // Wenn true, löst ein WDT-Timeout einen System-Panik aus
|
||||||
@ -65,6 +57,19 @@ void setup() {
|
|||||||
|
|
||||||
// Aktuellen Task (loopTask) zum Watchdog hinzufügen
|
// Aktuellen Task (loopTask) zum Watchdog hinzufügen
|
||||||
esp_task_wdt_add(NULL);
|
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
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -179,19 +184,8 @@ void loop() {
|
|||||||
{
|
{
|
||||||
lastWeightReadTime = currentMillis;
|
lastWeightReadTime = currentMillis;
|
||||||
|
|
||||||
// Prüfen ob die Waage korrekt genullt ist
|
|
||||||
// Abweichung von 2g ignorieren
|
|
||||||
if (autoTare && (weight > 2 && weight < 7) || weight < -2)
|
|
||||||
{
|
|
||||||
scale_tare_counter++;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
scale_tare_counter = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Prüfen ob das Gewicht gleich bleibt und dann senden
|
// Prüfen ob das Gewicht gleich bleibt und dann senden
|
||||||
if (abs(weight - lastWeight) <= 2 && weight > 5)
|
if (weight == lastWeight && weight > 5)
|
||||||
{
|
{
|
||||||
weigthCouterToApi++;
|
weigthCouterToApi++;
|
||||||
}
|
}
|
||||||
|
33
src/ota.cpp
33
src/ota.cpp
@ -1,10 +1,6 @@
|
|||||||
#include <Arduino.h>
|
#include <Arduino.h>
|
||||||
#include <website.h>
|
#include <website.h>
|
||||||
#include <commonFS.h>
|
#include <commonFS.h>
|
||||||
#include "scale.h"
|
|
||||||
#include "bambu.h"
|
|
||||||
#include "nfc.h"
|
|
||||||
|
|
||||||
|
|
||||||
// Globale Variablen für Config Backups hinzufügen
|
// Globale Variablen für Config Backups hinzufügen
|
||||||
String bambuCredentialsBackup;
|
String bambuCredentialsBackup;
|
||||||
@ -155,25 +151,6 @@ void handleUpdate(AsyncWebServer &server) {
|
|||||||
|
|
||||||
updateHandler->onUpload([](AsyncWebServerRequest *request, String filename,
|
updateHandler->onUpload([](AsyncWebServerRequest *request, String filename,
|
||||||
size_t index, uint8_t *data, size_t len, bool final) {
|
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) {
|
if (!index) {
|
||||||
updateTotalSize = request->contentLength();
|
updateTotalSize = request->contentLength();
|
||||||
updateWritten = 0;
|
updateWritten = 0;
|
||||||
@ -182,9 +159,9 @@ void handleUpdate(AsyncWebServer &server) {
|
|||||||
if (isSpiffsUpdate) {
|
if (isSpiffsUpdate) {
|
||||||
// Backup vor dem Update
|
// Backup vor dem Update
|
||||||
sendUpdateProgress(0, "backup", "Backing up configurations...");
|
sendUpdateProgress(0, "backup", "Backing up configurations...");
|
||||||
vTaskDelay(200 / portTICK_PERIOD_MS);
|
delay(200);
|
||||||
backupJsonConfigs();
|
backupJsonConfigs();
|
||||||
vTaskDelay(200 / portTICK_PERIOD_MS);
|
delay(200);
|
||||||
|
|
||||||
const esp_partition_t *partition = esp_partition_find_first(ESP_PARTITION_TYPE_DATA, ESP_PARTITION_SUBTYPE_DATA_SPIFFS, NULL);
|
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)) {
|
if (!partition || !Update.begin(partition->size, U_SPIFFS)) {
|
||||||
@ -192,14 +169,14 @@ void handleUpdate(AsyncWebServer &server) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
sendUpdateProgress(5, "starting", "Starting SPIFFS update...");
|
sendUpdateProgress(5, "starting", "Starting SPIFFS update...");
|
||||||
vTaskDelay(200 / portTICK_PERIOD_MS);
|
delay(200);
|
||||||
} else {
|
} else {
|
||||||
if (!Update.begin(updateTotalSize)) {
|
if (!Update.begin(updateTotalSize)) {
|
||||||
request->send(400, "application/json", "{\"success\":false,\"message\":\"Update initialization failed\"}");
|
request->send(400, "application/json", "{\"success\":false,\"message\":\"Update initialization failed\"}");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
sendUpdateProgress(0, "starting", "Starting firmware update...");
|
sendUpdateProgress(0, "starting", "Starting firmware update...");
|
||||||
vTaskDelay(200 / portTICK_PERIOD_MS);
|
delay(200);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -225,7 +202,7 @@ void handleUpdate(AsyncWebServer &server) {
|
|||||||
if (currentProgress != lastProgress && (currentProgress % 10 == 0 || final)) {
|
if (currentProgress != lastProgress && (currentProgress % 10 == 0 || final)) {
|
||||||
sendUpdateProgress(currentProgress, "uploading");
|
sendUpdateProgress(currentProgress, "uploading");
|
||||||
oledShowMessage("Update: " + String(currentProgress) + "%");
|
oledShowMessage("Update: " + String(currentProgress) + "%");
|
||||||
vTaskDelay(50 / portTICK_PERIOD_MS);
|
delay(50);
|
||||||
lastProgress = currentProgress;
|
lastProgress = currentProgress;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -14,7 +14,6 @@ TaskHandle_t ScaleTask;
|
|||||||
int16_t weight = 0;
|
int16_t weight = 0;
|
||||||
|
|
||||||
uint8_t weigthCouterToApi = 0;
|
uint8_t weigthCouterToApi = 0;
|
||||||
uint8_t scale_tare_counter = 0;
|
|
||||||
bool scaleTareRequest = false;
|
bool scaleTareRequest = false;
|
||||||
uint8_t pauseMainTask = 0;
|
uint8_t pauseMainTask = 0;
|
||||||
uint8_t scaleCalibrated = 1;
|
uint8_t scaleCalibrated = 1;
|
||||||
@ -22,23 +21,8 @@ uint8_t scaleCalibrated = 1;
|
|||||||
Preferences preferences;
|
Preferences preferences;
|
||||||
const char* NVS_NAMESPACE = "scale";
|
const char* NVS_NAMESPACE = "scale";
|
||||||
const char* NVS_KEY_CALIBRATION = "cal_value";
|
const char* NVS_KEY_CALIBRATION = "cal_value";
|
||||||
const char* NVS_KEY_AUTOTARE = "auto_tare";
|
|
||||||
bool autoTare = true;
|
|
||||||
|
|
||||||
// ##### Funktionen für Waage #####
|
// ##### 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() {
|
uint8_t tareScale() {
|
||||||
Serial.println("Tare scale");
|
Serial.println("Tare scale");
|
||||||
scale.tare();
|
scale.tare();
|
||||||
@ -54,14 +38,6 @@ void scale_loop(void * parameter) {
|
|||||||
for(;;) {
|
for(;;) {
|
||||||
if (scale.is_ready())
|
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
|
// Waage manuell Taren
|
||||||
if (scaleTareRequest == true)
|
if (scaleTareRequest == true)
|
||||||
{
|
{
|
||||||
@ -81,20 +57,13 @@ void scale_loop(void * parameter) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void start_scale(bool touchSensorConnected) {
|
void start_scale() {
|
||||||
Serial.println("Prüfe Calibration Value");
|
Serial.println("Prüfe Calibration Value");
|
||||||
float calibrationValue;
|
float calibrationValue;
|
||||||
|
|
||||||
// NVS lesen
|
// NVS lesen
|
||||||
preferences.begin(NVS_NAMESPACE, true); // true = readonly
|
preferences.begin(NVS_NAMESPACE, true); // true = readonly
|
||||||
calibrationValue = preferences.getFloat(NVS_KEY_CALIBRATION, defaultScaleCalibrationValue);
|
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();
|
preferences.end();
|
||||||
|
|
||||||
Serial.print("Read Scale Calibration Value ");
|
Serial.print("Read Scale Calibration Value ");
|
||||||
|
@ -4,19 +4,17 @@
|
|||||||
#include <Arduino.h>
|
#include <Arduino.h>
|
||||||
#include "HX711.h"
|
#include "HX711.h"
|
||||||
|
|
||||||
uint8_t setAutoTare(bool autoTareValue);
|
|
||||||
uint8_t start_scale(bool touchSensorConnected);
|
uint8_t start_scale();
|
||||||
uint8_t calibrate_scale();
|
uint8_t calibrate_scale();
|
||||||
uint8_t tareScale();
|
uint8_t tareScale();
|
||||||
|
|
||||||
extern HX711 scale;
|
extern HX711 scale;
|
||||||
extern int16_t weight;
|
extern int16_t weight;
|
||||||
extern uint8_t weigthCouterToApi;
|
extern uint8_t weigthCouterToApi;
|
||||||
extern uint8_t scale_tare_counter;
|
|
||||||
extern uint8_t scaleTareRequest;
|
extern uint8_t scaleTareRequest;
|
||||||
extern uint8_t pauseMainTask;
|
extern uint8_t pauseMainTask;
|
||||||
extern uint8_t scaleCalibrated;
|
extern uint8_t scaleCalibrated;
|
||||||
extern bool autoTare;
|
|
||||||
|
|
||||||
extern TaskHandle_t ScaleTask;
|
extern TaskHandle_t ScaleTask;
|
||||||
|
|
||||||
|
@ -75,10 +75,6 @@ void onWsEvent(AsyncWebSocket *server, AsyncWebSocketClient *client, AwsEventTyp
|
|||||||
success = calibrate_scale();
|
success = calibrate_scale();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (doc["payload"] == "setAutoTare") {
|
|
||||||
success = setAutoTare(doc["enabled"].as<bool>());
|
|
||||||
}
|
|
||||||
|
|
||||||
if (success) {
|
if (success) {
|
||||||
ws.textAll("{\"type\":\"scale\",\"payload\":\"success\"}");
|
ws.textAll("{\"type\":\"scale\",\"payload\":\"success\"}");
|
||||||
} else {
|
} else {
|
||||||
@ -207,14 +203,10 @@ void setupWebserver(AsyncWebServer &server) {
|
|||||||
// Route für Waage
|
// Route für Waage
|
||||||
server.on("/waage", HTTP_GET, [](AsyncWebServerRequest *request){
|
server.on("/waage", HTTP_GET, [](AsyncWebServerRequest *request){
|
||||||
Serial.println("Anfrage für /waage erhalten");
|
Serial.println("Anfrage für /waage erhalten");
|
||||||
//AsyncWebServerResponse *response = request->beginResponse(LittleFS, "/waage.html.gz", "text/html");
|
AsyncWebServerResponse *response = request->beginResponse(LittleFS, "/waage.html.gz", "text/html");
|
||||||
//response->addHeader("Content-Encoding", "gzip");
|
response->addHeader("Content-Encoding", "gzip");
|
||||||
//response->addHeader("Cache-Control", CACHE_CONTROL);
|
response->addHeader("Cache-Control", CACHE_CONTROL);
|
||||||
|
request->send(response);
|
||||||
String html = loadHtmlWithHeader("/waage.html");
|
|
||||||
html.replace("{{autoTare}}", (autoTare) ? "checked" : "");
|
|
||||||
|
|
||||||
request->send(200, "text/html", html);
|
|
||||||
});
|
});
|
||||||
|
|
||||||
// Route für RFID
|
// Route für RFID
|
||||||
|
Loading…
x
Reference in New Issue
Block a user