Reworks the scale calibration handling
Fixes some issues in the scale handling. Prevents a wdg reset after after scale calibration. Also makes sure that after calibration all tasks are started again that have been suspsended before.
This commit is contained in:
		
							
								
								
									
										55
									
								
								src/main.cpp
									
									
									
									
									
								
							
							
						
						
									
										55
									
								
								src/main.cpp
									
									
									
									
									
								
							| @@ -13,6 +13,9 @@ | ||||
| #include "esp_task_wdt.h" | ||||
| #include "commonFS.h" | ||||
|  | ||||
| bool mainTaskWasPaused = 0; | ||||
| uint8_t scaleTareCounter = 0; | ||||
|  | ||||
| // ##### SETUP ##### | ||||
| void setup() { | ||||
|   Serial.begin(115200); | ||||
| @@ -45,32 +48,14 @@ void setup() { | ||||
|   // NFC Reader | ||||
|   startNfc(); | ||||
|  | ||||
|   uint8_t scaleCalibrated = start_scale(); | ||||
|   if (scaleCalibrated == 3) { | ||||
|     oledShowMessage("Scale not calibrated!"); | ||||
|     for (uint16_t i = 0; i < 50000; i++) { | ||||
|       yield(); | ||||
|       vTaskDelay(pdMS_TO_TICKS(1)); | ||||
|       esp_task_wdt_reset(); | ||||
|     } | ||||
|   } else if (scaleCalibrated == 0) { | ||||
|     oledShowMessage("HX711 not found"); | ||||
|     for (uint16_t i = 0; i < 50000; i++) { | ||||
|       yield(); | ||||
|       vTaskDelay(pdMS_TO_TICKS(1)); | ||||
|       esp_task_wdt_reset(); | ||||
|     } | ||||
|   } | ||||
|    | ||||
|   start_scale(); | ||||
|  | ||||
|   // WDT initialisieren mit 10 Sekunden Timeout | ||||
|   bool panic = true; // Wenn true, löst ein WDT-Timeout einen System-Panik aus | ||||
|   esp_task_wdt_init(10, panic);  | ||||
|   esp_task_wdt_init(10, panic); | ||||
|  | ||||
|   // Aktuellen Task (loopTask) zum Watchdog hinzufügen | ||||
|   esp_task_wdt_add(NULL); | ||||
|  | ||||
|   // Optional: Andere Tasks zum Watchdog hinzufügen, falls nötig | ||||
|   // esp_task_wdt_add(task_handle); | ||||
| } | ||||
|  | ||||
|  | ||||
| @@ -147,9 +132,17 @@ void loop() { | ||||
|   }  | ||||
|  | ||||
|   // Ausgabe der Waage auf Display | ||||
|   if (pauseMainTask == 0 && weight != lastWeight && hasReadRfidTag == 0 && (!autoSendToBambu || autoSetToBambuSpoolId == 0)) | ||||
|   if(pauseMainTask == 0) | ||||
|   { | ||||
|     (weight < 2) ? ((weight < -2) ? oledShowMessage("!! -0") : oledShowWeight(0)) : oledShowWeight(weight); | ||||
|     if (mainTaskWasPaused || (weight != lastWeight && hasReadRfidTag == 0 && (!autoSendToBambu || autoSetToBambuSpoolId == 0))) | ||||
|     { | ||||
|       (weight < 2) ? ((weight < -2) ? oledShowMessage("!! -0") : oledShowWeight(0)) : oledShowWeight(weight); | ||||
|     } | ||||
|     mainTaskWasPaused = false; | ||||
|   } | ||||
|   else | ||||
|   { | ||||
|     mainTaskWasPaused = true; | ||||
|   } | ||||
|  | ||||
|  | ||||
| @@ -161,11 +154,20 @@ void loop() { | ||||
|     // Prüfen ob die Waage korrekt genullt ist | ||||
|     if ((weight > 0 && weight < 5) || weight < 0) | ||||
|     { | ||||
|       scale_tare_counter++; | ||||
|       if(scaleTareCounter < 5) | ||||
|       { | ||||
|         scaleTareCounter++; | ||||
|       } | ||||
|       else | ||||
|       { | ||||
|         scaleTareRequest = true; | ||||
|         scaleTareCounter = 0; | ||||
|       } | ||||
|        | ||||
|     } | ||||
|     else | ||||
|     { | ||||
|       scale_tare_counter = 0; | ||||
|       scaleTareCounter = 0; | ||||
|     } | ||||
|  | ||||
|     // Prüfen ob das Gewicht gleich bleibt und dann senden | ||||
| @@ -209,7 +211,6 @@ void loop() { | ||||
|       vTaskDelay(2000 / portTICK_PERIOD_MS); | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   yield(); | ||||
|    | ||||
|   esp_task_wdt_reset(); | ||||
| } | ||||
|   | ||||
| @@ -14,7 +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; | ||||
|  | ||||
| @@ -34,14 +34,16 @@ void scale_loop(void * parameter) { | ||||
|   Serial.println("++++++++++++++++++++++++++++++"); | ||||
|   Serial.println("Scale Loop started"); | ||||
|   Serial.println("++++++++++++++++++++++++++++++"); | ||||
|  | ||||
|   for(;;) { | ||||
|     if (scale.is_ready())  | ||||
|     { | ||||
|       // Waage nochmal Taren, wenn zu lange Abweichung | ||||
|       if (scale_tare_counter >= 5)  | ||||
|       if (scaleTareRequest == true)  | ||||
|       { | ||||
|         Serial.println("Re-Tare scale"); | ||||
|         scale.tare(); | ||||
|         scale_tare_counter = 0; | ||||
|         scaleTareRequest = false; | ||||
|       } | ||||
|  | ||||
|       weight = round(scale.get_units()); | ||||
| @@ -51,13 +53,13 @@ void scale_loop(void * parameter) { | ||||
|   } | ||||
| } | ||||
|  | ||||
| uint8_t start_scale() { | ||||
| void start_scale() { | ||||
|   Serial.println("Prüfe Calibration Value"); | ||||
|   long calibrationValue; | ||||
|   float calibrationValue; | ||||
|  | ||||
|   // NVS lesen | ||||
|   preferences.begin(NVS_NAMESPACE, true); // true = readonly | ||||
|   calibrationValue = preferences.getLong(NVS_KEY_CALIBRATION, defaultScaleCalibrationValue); | ||||
|   calibrationValue = preferences.getFloat(NVS_KEY_CALIBRATION, defaultScaleCalibrationValue); | ||||
|   preferences.end(); | ||||
|  | ||||
|   Serial.print("Read Scale Calibration Value "); | ||||
| @@ -68,6 +70,13 @@ uint8_t start_scale() { | ||||
|   if (isnan(calibrationValue) || calibrationValue < 1) { | ||||
|     calibrationValue = defaultScaleCalibrationValue; | ||||
|     scaleCalibrated = 0; | ||||
|  | ||||
|     oledShowMessage("Scale not calibrated!"); | ||||
|     for (uint16_t i = 0; i < 50000; i++) { | ||||
|       yield(); | ||||
|       vTaskDelay(pdMS_TO_TICKS(1)); | ||||
|       esp_task_wdt_reset(); | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   oledShowMessage("Scale Tare Please remove all"); | ||||
| @@ -101,21 +110,21 @@ uint8_t start_scale() { | ||||
|   } else { | ||||
|       Serial.println("ScaleLoop-Task erfolgreich erstellt"); | ||||
|   } | ||||
|  | ||||
|   return (scaleCalibrated == 1) ? 1 : 3; | ||||
| } | ||||
|  | ||||
| uint8_t calibrate_scale() { | ||||
|   long newCalibrationValue; | ||||
|   uint8_t returnState = 0; | ||||
|   float newCalibrationValue; | ||||
|  | ||||
|   vTaskSuspend(RfidReaderTask); | ||||
|   vTaskSuspend(ScaleTask); | ||||
|  | ||||
|   //vTaskSuspend(RfidReaderTask); | ||||
|   vTaskDelete(RfidReaderTask); | ||||
|   vTaskDelete(ScaleTask); | ||||
|   pauseBambuMqttTask = true; | ||||
|   pauseMainTask = 1; | ||||
|  | ||||
|    | ||||
|   if (scale.wait_ready_timeout(1000)) | ||||
|   { | ||||
|      | ||||
|     scale.set_scale(); | ||||
|     oledShowMessage("Step 1 empty Scale"); | ||||
|  | ||||
| @@ -137,7 +146,7 @@ uint8_t calibrate_scale() { | ||||
|       esp_task_wdt_reset(); | ||||
|     } | ||||
|      | ||||
|     long newCalibrationValue = scale.get_units(10); | ||||
|     float newCalibrationValue = scale.get_units(10); | ||||
|     Serial.print("Result: "); | ||||
|     Serial.println(newCalibrationValue); | ||||
|  | ||||
| @@ -150,35 +159,43 @@ uint8_t calibrate_scale() { | ||||
|  | ||||
|       // Speichern mit NVS | ||||
|       preferences.begin(NVS_NAMESPACE, false); // false = readwrite | ||||
|       preferences.putLong(NVS_KEY_CALIBRATION, newCalibrationValue); | ||||
|       preferences.putFloat(NVS_KEY_CALIBRATION, newCalibrationValue); | ||||
|       preferences.end(); | ||||
|  | ||||
|       // Verifizieren | ||||
|       preferences.begin(NVS_NAMESPACE, true); | ||||
|       long verifyValue = preferences.getLong(NVS_KEY_CALIBRATION, 0); | ||||
|       float verifyValue = preferences.getFloat(NVS_KEY_CALIBRATION, 0); | ||||
|       preferences.end(); | ||||
|  | ||||
|       Serial.print("Verified stored value: "); | ||||
|       Serial.println(verifyValue); | ||||
|  | ||||
|       Serial.println("End calibration, revome weight"); | ||||
|       Serial.println("End calibration, remove weight"); | ||||
|  | ||||
|       oledShowMessage("Remove weight"); | ||||
|  | ||||
|       scale.set_scale(newCalibrationValue); | ||||
|       for (uint16_t i = 0; i < 2000; i++) { | ||||
|         yield(); | ||||
|         vTaskDelay(pdMS_TO_TICKS(1)); | ||||
|         esp_task_wdt_reset(); | ||||
|       } | ||||
|        | ||||
|       oledShowMessage("Scale calibrated"); | ||||
|  | ||||
|       oledShowMessage("Calibration done"); | ||||
|       // For some reason it is not possible to re-tare the scale here, it will result in a wdt timeout. Instead let the scale loop do the taring | ||||
|       //scale.tare(); | ||||
|       scaleTareRequest = true; | ||||
|  | ||||
|       for (uint16_t i = 0; i < 2000; i++) { | ||||
|         yield(); | ||||
|         vTaskDelay(pdMS_TO_TICKS(1)); | ||||
|         esp_task_wdt_reset(); | ||||
|       } | ||||
|  | ||||
|       returnState = 1; | ||||
|     } | ||||
|     | ||||
|     else | ||||
|     { | ||||
|       { | ||||
| @@ -191,10 +208,10 @@ uint8_t calibrate_scale() { | ||||
|           vTaskDelay(pdMS_TO_TICKS(1)); | ||||
|           esp_task_wdt_reset(); | ||||
|         } | ||||
|         return 0; | ||||
|         returnState = 0; | ||||
|       } | ||||
|     } | ||||
|   }  | ||||
|     }  | ||||
|   } | ||||
|   else  | ||||
|   { | ||||
|     Serial.println("HX711 not found."); | ||||
| @@ -206,16 +223,13 @@ uint8_t calibrate_scale() { | ||||
|       vTaskDelay(pdMS_TO_TICKS(1)); | ||||
|       esp_task_wdt_reset(); | ||||
|     } | ||||
|     return 0; | ||||
|     returnState = 0; | ||||
|   } | ||||
|  | ||||
|   oledShowMessage("Scale Ready"); | ||||
|    | ||||
|   Serial.println("restart Scale Task"); | ||||
|   start_scale(); | ||||
|  | ||||
|   vTaskResume(RfidReaderTask); | ||||
|   vTaskResume(ScaleTask); | ||||
|   pauseBambuMqttTask = false; | ||||
|   pauseMainTask = 0; | ||||
|  | ||||
|   return 1; | ||||
|   return returnState; | ||||
| } | ||||
|   | ||||
| @@ -12,7 +12,7 @@ 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; | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user