Compare commits
	
		
			3 Commits
		
	
	
		
			bf63ecd594
			...
			0bf383ecd9
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 0bf383ecd9 | |||
| 6451d91c59 | |||
| 8d82e221b5 | 
							
								
								
									
										113
									
								
								CHANGELOG.md
									
									
									
									
									
								
							
							
						
						
									
										113
									
								
								CHANGELOG.md
									
									
									
									
									
								
							| @@ -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 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 | ||||
|   | ||||
| @@ -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" | ||||
|  | ||||
| ## | ||||
|   | ||||
							
								
								
									
										163
									
								
								src/scale.cpp
									
									
									
									
									
								
							
							
						
						
									
										163
									
								
								src/scale.cpp
									
									
									
									
									
								
							| @@ -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)); | ||||
|   | ||||
| @@ -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; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user