Compare commits

..

4 Commits

Author SHA1 Message Date
693ee839e5 docs: update changelog and header for version v2.0.0-beta11
All checks were successful
Release Workflow / detect-provider (push) Successful in 4s
Release Workflow / github-release (push) Has been skipped
Release Workflow / gitea-release (push) Successful in 3m21s
2025-08-30 14:56:09 +02:00
0bf383ecd9 docs: update changelog and header for version v2.0.0-beta11 2025-08-30 14:55:54 +02:00
6451d91c59 docs: update platformio.ini for beta version v2.0.0-beta11 2025-08-30 14:55:53 +02:00
8d82e221b5 feat: implement weight stabilization functions and improve tare handling 2025-08-30 14:55:42 +02:00
4 changed files with 259 additions and 25 deletions

View File

@@ -1,5 +1,118 @@
# Changelog
## [2.0.0-beta11] - 2025-08-30
### Breaking Changes
- enhance commit categorization for breaking changes
- Handling of Spools with Tags from Vendors. fix: improve get_last_tag function to handle non-beta tags and fallback to newest tag
### Added
- implement weight stabilization functions and improve tare handling
- add fast-path JSON reading for web interface display
- add handling for successful NFC tag writes to send weight to Spoolman without auto-sending to Bambu
- implement robust page reading with error recovery for NFC tags
- enhance NFC tag reading with robust error recovery and JSON optimization for fast-path detection
- implement robust page reading and safe tag detection with error recovery
- add Manufacturer Tags support documentation in German and English
- add display delay for vendor, filament, and spool creation processes
- add progress bar updates for vendor and filament creation processes
- update vendor and filament ID handling to use NULL and add delays for stability
- add delay to ensure proper setting of vendor and filament IDs after API state changes
- enhance NDEF decoding with detailed validation and debugging output
- enhance NDEF decoding to validate structure and extract JSON payload
- add logging for decoded JSON data in NFC processing
- implement filament and spool creation in Spoolman API
- Add JSON structure comments for filament and spool creation
- Add vendor and filament management to API; implement recycling factory handling in NFC
### Changed
- update changelog and header for version v2.0.0-beta11
- update platformio.ini for beta version v2.0.0-beta11
- update changelog and header for version v2.0.0-beta10
- update platformio.ini for beta version v2.0.0-beta10
- update changelog and header for version v2.0.0-beta9
- update platformio.ini for beta version v2.0.0-beta9
- update changelog and header for version v2.0.0-beta8
- update platformio.ini for beta version v2.0.0-beta8
- update changelog and header for version v2.0.0-beta7
- update platformio.ini for beta version v2.0.0-beta7
- update changelog and header for version v2.0.0-beta6
- update changelog and header for version v2.0.0-beta6
- update platformio.ini for beta version v2.0.0-beta6
- update changelog and header for version v2.0.0-beta5
- update platformio.ini for beta version v2.0.0-beta5
- update changelog and header for version v2.0.0-beta4
- update platformio.ini for beta version v2.0.0-beta4
- update changelog and header for version v2.0.0-beta3
- update platformio.ini for beta version v2.0.0-beta3
- update createVendor and checkVendor functions to accept JsonDocument payload
- update changelog and header for version v2.0.0-beta2
- update platformio.ini for beta version v2.0.0-beta2
- clarify product URL description for Manufacturer Tags in German and English documentation
- update changelog and header for version v2.0.0-beta1
- update platformio.ini for beta version v2.0.0-beta1
- update version to 2.0.0 in platformio.ini
- update changelog and header for version v1.5.12-beta18
- update platformio.ini for beta version v1.5.12-beta18
- update changelog and header for version v1.5.12-beta17
- update platformio.ini for beta version v1.5.12-beta17
- optimize page limit detection and remove redundant verification code
- update changelog and header for version v1.5.12-beta16
- update platformio.ini for beta version v1.5.12-beta16
- Refactor NFC interface handling and improve error diagnostics
- update changelog and header for version v1.5.12-beta15
- update platformio.ini for beta version v1.5.12-beta15
- enhance NFC write operation diagnostics and improve error handling
- enhance NFC write operation handling and prevent tag operations during write
- update changelog and header for version v1.5.12-beta14
- update platformio.ini for beta version v1.5.12-beta14
- optimize JSON payload structure and enhance NFC tag validation process
- update changelog and header for version v1.5.12-beta13
- update platformio.ini for beta version v1.5.12-beta13
- reorganize clearUserDataArea function for improved clarity and safety
- update changelog and header for version v1.5.12-beta12
- update platformio.ini for beta version v1.5.12-beta12
- update changelog and header for version v1.5.12-beta11
- update platformio.ini for beta version v1.5.12-beta11
- update changelog and header for version v1.5.12-beta10
- update platformio.ini for beta version v1.5.12-beta10
- streamline task creation in checkVendor and checkFilament functions
- update changelog and header for version v1.5.12-beta9
- update platformio.ini for beta version v1.5.12-beta9
- update changelog and header for version v1.5.12-beta8
- update platformio.ini for beta version v1.5.12-beta8
- update changelog and header for version v1.5.12-beta7
- update platformio.ini for beta version v1.5.12-beta7
- update changelog and header for version v1.5.12-beta6
- update platformio.ini for beta version v1.5.12-beta6
- improve task synchronization in vendor, filament, and spool creation functions
- update changelog and header for version v1.5.12-beta5
- update platformio.ini for beta version v1.5.12-beta5
- update changelog and header for version v1.5.12-beta4
- update platformio.ini for beta version v1.5.12-beta4
- update changelog and header for version v1.5.12-beta3
- update platformio.ini for beta version v1.5.12-beta3
- update changelog and header for version v1.5.12-beta2
- update platformio.ini for beta version v1.5.12-beta2
- update changelog and header for version v1.5.12-beta1
- update platformio.ini for beta version v1.5.12-beta1
- Merge branch 'main' into recyclingfabrik
- Merge branch 'main' into recyclingfabrik
### Fixed
- call scale.tare() in setup after starting scale
- update createVendor function to use external_id as comment instead of static text
- update to_old_version in platformio.ini to reflect correct previous version
- increase delay in start_scale function for improved stability
- replace progress bar with message display for remaining weight in sendToApi function
- update vendor check to use shorthand key in payload
- reset NFC state on API send failure to allow retry
- update createdFilamentId reset value to 65535 for better task handling
- update createdVendorId reset value to 65535 for improved API handling
- update spoolman ID reset values to 65535 for better API response detection
- correct color_hex key usage and comment out unused date fields in spool creation
- improve API state handling and vendor name formatting
- enhance filament creation logic to include dynamic comments based on payload
## [2.0.0-beta10] - 2025-08-30
### Breaking Changes
- enhance commit categorization for breaking changes

View File

@@ -9,7 +9,7 @@
; https://docs.platformio.org/page/projectconf.html
[common]
version = "2.0.0-beta10"
version = "2.0.0-beta11"
to_old_version = "1.5.10"
##

View File

@@ -13,6 +13,19 @@ TaskHandle_t ScaleTask;
int16_t weight = 0;
// Weight stabilization variables
#define MOVING_AVERAGE_SIZE 20 // Number of samples for moving average
#define LOW_PASS_ALPHA 0.15f // Low-pass filter coefficient (0.1-0.2 works well)
#define DISPLAY_THRESHOLD 0.5f // Only update display if change > 0.5g
#define MEASUREMENT_INTERVAL_MS 50 // Measurement interval in milliseconds
float weightBuffer[MOVING_AVERAGE_SIZE];
uint8_t bufferIndex = 0;
bool bufferFilled = false;
float filteredWeight = 0.0f;
int16_t lastDisplayedWeight = 0;
unsigned long lastMeasurementTime = 0;
uint8_t weigthCouterToApi = 0;
uint8_t scale_tare_counter = 0;
bool scaleTareRequest = false;
@@ -21,6 +34,77 @@ bool scaleCalibrated;
bool autoTare = true;
bool scaleCalibrationActive = false;
// ##### Weight stabilization functions #####
/**
* Reset weight filter buffer - call after tare or calibration
*/
void resetWeightFilter() {
bufferIndex = 0;
bufferFilled = false;
filteredWeight = 0.0f;
lastDisplayedWeight = 0;
// Initialize buffer with zeros
for (int i = 0; i < MOVING_AVERAGE_SIZE; i++) {
weightBuffer[i] = 0.0f;
}
}
/**
* Calculate moving average from weight buffer
*/
float calculateMovingAverage() {
float sum = 0.0f;
int count = bufferFilled ? MOVING_AVERAGE_SIZE : bufferIndex;
for (int i = 0; i < count; i++) {
sum += weightBuffer[i];
}
return (count > 0) ? sum / count : 0.0f;
}
/**
* Apply low-pass filter to smooth weight readings
* Uses exponential smoothing: y_new = alpha * x_new + (1-alpha) * y_old
*/
float applyLowPassFilter(float newValue) {
filteredWeight = LOW_PASS_ALPHA * newValue + (1.0f - LOW_PASS_ALPHA) * filteredWeight;
return filteredWeight;
}
/**
* Process new weight reading with stabilization
* Returns stabilized weight value
*/
int16_t processWeightReading(float rawWeight) {
// Add to moving average buffer
weightBuffer[bufferIndex] = rawWeight;
bufferIndex = (bufferIndex + 1) % MOVING_AVERAGE_SIZE;
if (bufferIndex == 0) {
bufferFilled = true;
}
// Calculate moving average
float avgWeight = calculateMovingAverage();
// Apply low-pass filter
float smoothedWeight = applyLowPassFilter(avgWeight);
// Round to nearest gram
int16_t newWeight = round(smoothedWeight);
// Only update displayed weight if change is significant
if (abs(newWeight - lastDisplayedWeight) >= DISPLAY_THRESHOLD) {
lastDisplayedWeight = newWeight;
return newWeight;
}
return weight; // Return current weight if change is too small
}
// ##### Funktionen für Waage #####
uint8_t setAutoTare(bool autoTareValue) {
Serial.print("Set AutoTare to ");
@@ -39,6 +123,7 @@ uint8_t setAutoTare(bool autoTareValue) {
uint8_t tareScale() {
Serial.println("Tare scale");
scale.tare();
resetWeightFilter(); // Reset stabilization filter after tare
return 1;
}
@@ -48,37 +133,63 @@ void scale_loop(void * parameter) {
Serial.println("Scale Loop started");
Serial.println("++++++++++++++++++++++++++++++");
// Initialize weight filter
resetWeightFilter();
lastMeasurementTime = millis();
for(;;) {
if (scale.is_ready())
{
// Waage automatisch Taren, wenn zu lange Abweichung
if (autoTare && scale_tare_counter >= 5)
unsigned long currentTime = millis();
// Only measure at defined intervals to reduce noise
if (currentTime - lastMeasurementTime >= MEASUREMENT_INTERVAL_MS) {
if (scale.is_ready())
{
Serial.println("Auto Tare scale");
scale.tare();
scale_tare_counter = 0;
}
// Waage automatisch Taren, wenn zu lange Abweichung
if (autoTare && scale_tare_counter >= 5)
{
Serial.println("Auto Tare scale");
scale.tare();
resetWeightFilter(); // Reset filter after auto tare
scale_tare_counter = 0;
}
// Waage manuell Taren
if (scaleTareRequest == true)
{
Serial.println("Re-Tare scale");
oledShowMessage("TARE Scale");
vTaskDelay(pdMS_TO_TICKS(1000));
scale.tare();
vTaskDelay(pdMS_TO_TICKS(1000));
oledShowWeight(0);
scaleTareRequest = false;
}
// Waage manuell Taren
if (scaleTareRequest == true)
{
Serial.println("Re-Tare scale");
oledShowMessage("TARE Scale");
vTaskDelay(pdMS_TO_TICKS(1000));
scale.tare();
resetWeightFilter(); // Reset filter after manual tare
vTaskDelay(pdMS_TO_TICKS(1000));
oledShowWeight(0);
scaleTareRequest = false;
}
// Only update weight if median changed more than 1
int16_t newWeight = round(scale.get_units());
if(abs(weight-newWeight) > 1){
weight = newWeight;
// Get raw weight reading
float rawWeight = scale.get_units();
// Process weight with stabilization
int16_t stabilizedWeight = processWeightReading(rawWeight);
// Update global weight variable only if it changed
if (stabilizedWeight != weight) {
weight = stabilizedWeight;
// Debug output for monitoring (can be removed in production)
static unsigned long lastDebugTime = 0;
if (currentTime - lastDebugTime > 1000) { // Print every second
Serial.printf("Raw: %.2f, Filtered: %.2f, Final: %d\n",
rawWeight, filteredWeight, weight);
lastDebugTime = currentTime;
}
}
lastMeasurementTime = currentTime;
}
}
vTaskDelay(pdMS_TO_TICKS(100));
vTaskDelay(pdMS_TO_TICKS(10)); // Shorter delay for more responsive loop
}
}
@@ -125,6 +236,9 @@ void start_scale(bool touchSensorConnected) {
//vTaskDelay(pdMS_TO_TICKS(5000));
//scale.tare();
// Initialize weight stabilization filter
resetWeightFilter();
// Display Gewicht
oledShowWeight(0);
@@ -209,6 +323,7 @@ uint8_t calibrate_scale() {
oledShowProgressBar(2, 3, "Scale Cal.", "Remove weight");
scale.set_scale(newCalibrationValue);
resetWeightFilter(); // Reset filter after calibration
for (uint16_t i = 0; i < 2000; i++) {
yield();
vTaskDelay(pdMS_TO_TICKS(1));

View File

@@ -9,6 +9,12 @@ uint8_t start_scale(bool touchSensorConnected);
uint8_t calibrate_scale();
uint8_t tareScale();
// Weight stabilization functions
void resetWeightFilter();
float calculateMovingAverage();
float applyLowPassFilter(float newValue);
int16_t processWeightReading(float rawWeight);
extern HX711 scale;
extern int16_t weight;
extern uint8_t weigthCouterToApi;