I built a custom PCB with an ESP32-WROVER-IE-N8R8 to read a pressure difference in a filtration system. The data is then send via MQTT to a MQTT Broker (Mosquitto) on a Linux Server. This happens every minute.
I was using the Arduino IDE because I don't do stuff like this very often and the code contains quite a lot of German.
It's working fine but after over 100 days of working all PCBs at some point run into the same issue: Code execution completely stops.
Sorry for the messy code. Like I said: I'm just doing this as a hobby.
#include <WiFiManager.h> #include <WiFi.h> #include <PubSubClient.h> #include <Wire.h> #include <esp_task_wdt.h> #define TRIGGER_PIN 33 #define LEDError 14 #define LEDConnect 5 #define LEDWiFi 15 #define WDT_TIMEOUT 90 //--------------------------------------------------------------------------------- #define SensorName "Filtersensor 9" #define SensorLogin "fs-09" #define SensorPasswort "xxx" #define SensorPublish "xxx" #define SensorStatus "Status_FS_09" //--------------------------------------------------------------------------------- WiFiManager wm; char Status[30]; //--------------------------------------------------------------------------------- //I2C byte ADCAddress = 0x48; const int ADCref = 4096; float ADCvoltage; float Druck; //--------------------------------------------------------------------------------- //MQTT const char* mqtt_server = "RandomIP"; WiFiClient espClient; PubSubClient client(espClient); unsigned long lastMsg = 0; char msg[50]; //--------------------------------------------------------------------------------- void setup() { Wire.begin(); Serial.begin(115200); delay(100); pinMode(LEDError, OUTPUT); pinMode(LEDConnect, OUTPUT); pinMode(LEDWiFi, OUTPUT); //------------------------------------------------------------------------------------ wm.setHostname(SensorLogin); WiFi.mode(WIFI_STA); Serial.setDebugOutput(true); delay(3000); Serial.println("\n Starte..."); pinMode(TRIGGER_PIN, INPUT); //-------------------------------------------------- //WiFi bool res; res = wm.autoConnect(SensorName,"password"); if(!res) { //Verbindungsversuch mit Wifi Serial.println("Verbindung fehlgeschalgen oder Time-Out"); digitalWrite(LEDError, HIGH); Serial.println("Neustarten..."); delay(10000); ESP.restart(); } else { Serial.println("WiFi verbunden!"); digitalWrite(LEDWiFi, HIGH); } //------------------------------------------------------------------------------------------- //MQTT client.setServer(mqtt_server, 1883); //----------------------------------------------------------------------------------------- //WDT Serial.println("Einrichtung des WDT..."); esp_task_wdt_init(WDT_TIMEOUT, true); esp_task_wdt_add(NULL); } //------------------------------------------------------------------------------------------- void checkButton(){ if ( digitalRead(TRIGGER_PIN) == LOW ) { delay(50); if( digitalRead(TRIGGER_PIN) == LOW ){ Serial.println("WiFi Button gedrückt"); delay(3000); if( digitalRead(TRIGGER_PIN) == LOW ){ Serial.println("Button gehalten"); Serial.println("Lösche Config, Starte neu...."); wm.resetSettings(); digitalWrite(LEDWiFi, LOW); delay(5000); ESP.restart(); } esp_task_wdt_reset(); Serial.println("Starte Wifi-Konfiguration..."); wm.setConfigPortalTimeout(120); if (!wm.startConfigPortal(SensorName,"password")) { Serial.println("Verbindung fehlgeschalgen oder Time-Out"); delay(3000); digitalWrite(LEDError, HIGH); Serial.println("Neustarten..."); delay(10000); ESP.restart(); } else { //Wif erfolgreich verbunden Serial.println("WiFi verbunden!"); digitalWrite(LEDWiFi, HIGH); } } } } void reconnect() { while (!client.connected()) { Serial.print("Versuche MQTT-Verbindung herzustellen..."); if (client.connect(SensorName, SensorLogin, SensorPasswort)) { Serial.println("Verbunden!"); digitalWrite(LEDConnect, HIGH); } else { Serial.print("Fehlgeschlagen!, rc="); Serial.print(client.state()); Serial.println(" Neuer Versuch in 5 Sekunden"); digitalWrite(LEDConnect, LOW); delay(5000); } } return; } void Sensor() { uint16_t ADCresult; Wire.requestFrom(ADCAddress, (uint8_t) 2); if (Wire.available()) { ADCresult = Wire.read(); ADCresult = ADCresult<<8; ADCresult += Wire.read(); ADCvoltage = (ADCresult*(ADCref/4095)); Serial.print("Spannung ADC: "); Serial.print(ADCvoltage); Serial.println(" mV"); ADCvoltage /= 1000; Druck = ((500.0*(ADCvoltage-0.25))/3.75); Druck /= 100; Serial.print("Differenzdruck: "); Serial.print(Druck,3); Serial.println(" mbar"); char DruckMessage[8]; dtostrf(Druck, 1, 3, DruckMessage); strcat (Status," SENT"); //------------------------------------------------------------------------------- if (client.connected()) { esp_task_wdt_reset(); //WDT Reset client.publish(SensorPublish, DruckMessage); delay(100); client.publish(SensorStatus, Status); digitalWrite(LEDConnect, LOW); digitalWrite(LEDError, LOW); delay(500); digitalWrite(LEDConnect, HIGH); Serial.print("Gesendete Daten: "); Serial.println(DruckMessage); } //------------------------------------------------------------------------------- } else{ digitalWrite(LEDError, HIGH); strcat (Status," ERROR"); if (client.connected()) { client.publish(SensorStatus, Status); } Serial.println("Keine Verbindung zum ADC herstellbar"); } return; } void Neustart() { Serial.println("Regelmäßiger Neustart wird ausgeführt"); char StatusMessage[10] ="RESTART"; client.publish(SensorStatus, StatusMessage); delay(500); ESP.restart(); } void getReadableTime(String &readableTime) { unsigned long currentMillis; unsigned long seconds; unsigned long minutes; unsigned long hours; unsigned long days; currentMillis = millis(); seconds = currentMillis / 1000; minutes = seconds / 60; hours = minutes / 60; days = hours / 24; currentMillis %= 1000; seconds %= 60; minutes %= 60; hours %= 24; if (days < 10) { readableTime += "0"; } readableTime = String(days) + "D "; if (hours < 10) { readableTime += "0"; } readableTime += String(hours) + "H "; if (minutes < 10) { readableTime += "0"; } readableTime += String(minutes) + "M "; } void loop() { checkButton(); if (!client.connected()) { digitalWrite(LEDConnect, LOW); reconnect(); } client.loop(); unsigned long now = millis(); if (now > 86400000) { Neustart(); } if (now - lastMsg > 60000) { lastMsg = now; String readableTime; getReadableTime(readableTime); Serial.print("Laufzeit: "); Serial.println(readableTime); readableTime.toCharArray(Status, 20); Sensor(); } } I implemented a restart whenever millis(); overflows (Every 40-50 days) and activated the watchdog timer. Nothing changed. The watchdog timer does nothing in this case. I also added a lot of serial outputs and hoped to find a loop or something else where the ESP gets stuck. Nothing. No output at all when this situation happens.
It's also very annoying to test solutions because I can basically test about 3 things a year per sensor unit.
Has someone an idea?