Compare commits

..

1 Commits

3 changed files with 38 additions and 13 deletions

View File

@@ -178,9 +178,11 @@ void loop() {
// Ausgabe der Waage auf Display // Ausgabe der Waage auf Display
if(pauseMainTask == 0) if(pauseMainTask == 0)
{ {
// Use filtered weight for smooth display, but still check API weight for significant changes
int16_t displayWeight = getFilteredDisplayWeight();
if (mainTaskWasPaused || (weight != lastWeight && nfcReaderState == NFC_IDLE && (!bambuCredentials.autosend_enable || autoSetToBambuSpoolId == 0))) if (mainTaskWasPaused || (weight != lastWeight && nfcReaderState == NFC_IDLE && (!bambuCredentials.autosend_enable || autoSetToBambuSpoolId == 0)))
{ {
(weight < 2) ? ((weight < -2) ? oledShowMessage("!! -0") : oledShowWeight(0)) : oledShowWeight(weight); (displayWeight < 2) ? ((displayWeight < -2) ? oledShowMessage("!! -0") : oledShowWeight(0)) : oledShowWeight(displayWeight);
} }
mainTaskWasPaused = false; mainTaskWasPaused = false;
} }

View File

@@ -17,6 +17,7 @@ int16_t weight = 0;
#define MOVING_AVERAGE_SIZE 20 // Number of samples for moving average #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 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 DISPLAY_THRESHOLD 0.5f // Only update display if change > 0.5g
#define API_THRESHOLD 2.0f // Only trigger API actions if change > 2g
#define MEASUREMENT_INTERVAL_MS 50 // Measurement interval in milliseconds #define MEASUREMENT_INTERVAL_MS 50 // Measurement interval in milliseconds
float weightBuffer[MOVING_AVERAGE_SIZE]; float weightBuffer[MOVING_AVERAGE_SIZE];
@@ -24,6 +25,7 @@ uint8_t bufferIndex = 0;
bool bufferFilled = false; bool bufferFilled = false;
float filteredWeight = 0.0f; float filteredWeight = 0.0f;
int16_t lastDisplayedWeight = 0; int16_t lastDisplayedWeight = 0;
int16_t lastStableWeight = 0; // For API/action triggering
unsigned long lastMeasurementTime = 0; unsigned long lastMeasurementTime = 0;
uint8_t weigthCouterToApi = 0; uint8_t weigthCouterToApi = 0;
@@ -44,6 +46,7 @@ void resetWeightFilter() {
bufferFilled = false; bufferFilled = false;
filteredWeight = 0.0f; filteredWeight = 0.0f;
lastDisplayedWeight = 0; lastDisplayedWeight = 0;
lastStableWeight = 0; // Reset stable weight for API actions
// Initialize buffer with zeros // Initialize buffer with zeros
for (int i = 0; i < MOVING_AVERAGE_SIZE; i++) { for (int i = 0; i < MOVING_AVERAGE_SIZE; i++) {
@@ -96,13 +99,31 @@ int16_t processWeightReading(float rawWeight) {
// Round to nearest gram // Round to nearest gram
int16_t newWeight = round(smoothedWeight); int16_t newWeight = round(smoothedWeight);
// Only update displayed weight if change is significant // Update displayed weight if display threshold is reached
if (abs(newWeight - lastDisplayedWeight) >= DISPLAY_THRESHOLD) { if (abs(newWeight - lastDisplayedWeight) >= DISPLAY_THRESHOLD) {
lastDisplayedWeight = newWeight; lastDisplayedWeight = newWeight;
return newWeight;
} }
return weight; // Return current weight if change is too small // Update global weight for API actions only if stable threshold is reached
int16_t weightToReturn = weight; // Default: keep current weight
if (abs(newWeight - lastStableWeight) >= API_THRESHOLD) {
lastStableWeight = newWeight;
weightToReturn = newWeight;
Serial.printf("Stable weight change detected: %d -> %d (diff: %d)\n",
weight, newWeight, abs(newWeight - weight));
}
return weightToReturn;
}
/**
* Get current filtered weight for display purposes
* This returns the smoothed weight even if it hasn't triggered API actions
*/
int16_t getFilteredDisplayWeight() {
return lastDisplayedWeight;
} }
// ##### Funktionen für Waage ##### // ##### Funktionen für Waage #####
@@ -172,18 +193,19 @@ void scale_loop(void * parameter) {
// Process weight with stabilization // Process weight with stabilization
int16_t stabilizedWeight = processWeightReading(rawWeight); int16_t stabilizedWeight = processWeightReading(rawWeight);
// Update global weight variable only if it changed // Update global weight variable only if it changed significantly (for API actions)
if (stabilizedWeight != weight) { if (stabilizedWeight != weight) {
weight = stabilizedWeight; weight = stabilizedWeight;
Serial.printf("API weight updated: %d\n", weight);
}
// Debug output for monitoring (can be removed in production) // Debug output for monitoring (can be removed in production)
static unsigned long lastDebugTime = 0; static unsigned long lastDebugTime = 0;
if (currentTime - lastDebugTime > 1000) { // Print every second if (currentTime - lastDebugTime > 2000) { // Print every 2 seconds
Serial.printf("Raw: %.2f, Filtered: %.2f, Final: %d\n", Serial.printf("Raw: %.2f, Filtered: %.2f, Display: %d, API: %d\n",
rawWeight, filteredWeight, weight); rawWeight, filteredWeight, lastDisplayedWeight, weight);
lastDebugTime = currentTime; lastDebugTime = currentTime;
} }
}
lastMeasurementTime = currentTime; lastMeasurementTime = currentTime;
} }

View File

@@ -14,6 +14,7 @@ void resetWeightFilter();
float calculateMovingAverage(); float calculateMovingAverage();
float applyLowPassFilter(float newValue); float applyLowPassFilter(float newValue);
int16_t processWeightReading(float rawWeight); int16_t processWeightReading(float rawWeight);
int16_t getFilteredDisplayWeight();
extern HX711 scale; extern HX711 scale;
extern int16_t weight; extern int16_t weight;