Hallo zusammen,
ich kämpfe seit geraumer Zeit mit einer harten Nuss und bin am Ende mit meinem Wissensstand.
Folgendes Programm auf einem ESP32 sendet mir regelmäßig Licht- und Temperaturdaten per MQTT. Folgende Punkte sollen mein Problem mit dieser "Gerätschaft" beschreiben.
- ESP32 hängt sich in unregelmäßigen Intervallen auf. Mal läuft er Wochen oder sogar Monate, mal stirbt er jede Woche einmal (wie derzeit)!
- Nach der Stabilisierung der Stromversorgung (5V Mini-Schaltnetzteil) mit zwei parallelen Kondensatoren ELko 2200yf und 47yF Tantal hat sich nichts verbessert
- Bei Abschaltung von WLAN (FritzBox) über mehrere Stunden stürzt der ESP32 nicht ab! Vermutung waren Abschaltung wg. Flugzeugen.
- In diesem "Netz" laufen weitere ESP32 mit Schaltfunktionen mit ähnlichem Code - auch die stürzen ab und zu ab. Wenn es Tage/ Wochen gut gelaufen ist und dann ist in einer Nacht mal wieder der "Wurm" drin, dann stürzen immer mehrere gleichzeitig ab.
- Gefühlt läuft das System rund wenn wir im Urlaub sind und im Haus wird nichts geschaltet, wobei der u.g. Temperatur- und Lichtsensor draußen sehr freistehend angebracht ist und keine Störfelder auf ihn einwirken.
- Der MQT-Server läuft sehr stabil auf einem Rapsi 3b. Raspian immer aktuell.
Ich finde kein System in dem Verhalten meiner ESP32s. Einzige Idee wäre, dass in den MQTT-Bibliotheken ein Fehler ist.
Was würdet ihr unternehmen um den Fehler einzukreisen?
Hat der Programmcode Schwächen und das Programm kann sich an einer Stelle verrennen? Warum stürzen dann aber immer mehrere ESP's gleichzeitig ab?
Würde mich über jeden Tipp, der o.g. Verhaltensmuster nicht abdeckt, freuen.
Danke
//publizieren von Temperatur und Lichtstaerke mit ESP32
//millis-Überlauf wird berücksichtigt
//V7 Programm wartet auf WLAN bei Ausfall
#include <Arduino.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <WiFi.h>
#include <PubSubClient.h>
#include <String>
const char* SSID = "xxx";
const char* PSK = "xxx";
const char* MQTT_BROKER = "192.168.....";
const char* willTopic = "sig/fehler";
const char* willMessage = "templicht disconnected V7";
const char* CLIENT_ID = "ESP32_a01";
const char* CLIENT_TOPIC = "sig/templicht";
byte willQoS = 0;
const int oneWireBus = 4; /* DS18B20 GPIO */
const int lichtpin = 34;
const unsigned long SENDEPAUSE = 15*1000UL; // 15 Sek. ... Def wg. 50-Tageüberlauf
WiFiClient wifiClient;
PubSubClient mqttClient(wifiClient);
OneWire oneWire(oneWireBus);
DallasTemperature sensors(&oneWire);
String lesen_licht () {
int licht = analogRead(lichtpin);
//Serial.println("Lichtwert: " + String (licht) );
return String (licht);
}
String lesen_temp() {
sensors.requestTemperatures();
float temperatureC = sensors.getTempCByIndex(0);
//Serial.println("Temperatur: " + String (temperatureC));
return String(temperatureC);
}
// Callback Nachrichten-Empfang (subscribe)
void callback(char* topic, byte* message, unsigned int length) {
String str;
for (int i = 0; i < length; i++) {
str += (char)message[i];
}
}
void mqttConnect() {
boolean willRetain = false;
//Zuerst Wlan prüfen dann MQTT
WiFi.begin(SSID, PSK);
delay(1000);
while (WiFi.status() != WL_CONNECTED) {
WiFi.begin(SSID, PSK);
delay(4000);
Serial.print(".");
}
Serial.println("WLAN connected");
while (!mqttClient.connected()) {
if (mqttClient.connect(CLIENT_ID, willTopic, willQoS, willRetain, willMessage)) {
mqttClient.subscribe(CLIENT_TOPIC);
Serial.println("mqtt connected");
}
else {
Serial.print("mqtt connect error, rc = ");
Serial.println( mqttClient.state());
delay(2000);
}
}
}
void setup() {
WiFi.begin(SSID, PSK);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
//Serial.print(".");
}
sensors.begin();// Start the DS18B20 sensor
// Verbindung zum MQTT-Server herstellen
mqttClient.setServer(MQTT_BROKER, 1883);
mqttClient.setCallback(callback);
mqttConnect();
}
void loop() {
String nachricht;
String licht;
String temp;
long lastMsg = 0;
char txstring[40];
if (!mqttClient.connected()) {
mqttConnect();
}
mqttClient.loop();
static unsigned long zeitalt;
if(millis() - zeitalt > SENDEPAUSE){
licht = lesen_licht();
temp = lesen_temp();
nachricht = licht + ":" + temp;
//Serial.println(nachricht);
nachricht.toCharArray(txstring,39);
mqttClient.publish(CLIENT_TOPIC, txstring);
zeitalt += SENDEPAUSE; //verhindert 50 Tage -Überlauf
}
delay(200);
}
Alles anzeigen