Skip to content

Commit 03bfc52

Browse files
authored
V1.06 InfoUpdate
additional infos: - Wifi strength - error messages addes Temps
1 parent 47da067 commit 03bfc52

1 file changed

Lines changed: 111 additions & 28 deletions

File tree

ESP32DevKitV4/PowerGuard.ino

Lines changed: 111 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,3 @@
1-
// PowerGuard V1.02
2-
// 02.10.2023Matthias Rauchschwalbe
3-
//
41
//https://beelogger.de/sensoren/temperatursensor-ds18b20/ für Pinning und Anregung
52
#include <OneWire.h>
63
#include <DallasTemperature.h>
@@ -13,6 +10,7 @@
1310
#define LED_OK 19
1411
#define ONE_WIRE_BUS 25
1512
static byte debug = 0;
13+
static String lastError = "-";
1614

1715
//Sicherheitsfunktionen
1816
int volatile hardwareError = 0; // Indikator, ob ein Sensordefekt erkannt wurde.
@@ -25,15 +23,15 @@ int volatile panicMode = 0; // Indikator für die Zwangsabschaltung - ab jet
2523

2624
// Definition der Zugangsdaten WiFi
2725
#define HOSTNAME "ESP32_Heizung_PowerGuard"
28-
const char* ssid = "MyNETWORK";
29-
const char* password = "MyPASSWORD";
26+
const char* ssid = "YourSSID";
27+
const char* password = "YourPassword";
3028
WiFiClient myWiFiClient;
3129

3230
//Definition der Zugangsdaten MQTT
33-
#define MQTT_SERVER "MyIP"
31+
#define MQTT_SERVER "Your MQTT BrokerIP"
3432
#define MQTT_PORT 1883
35-
#define MQTT_USER "My_ioBrokerUSER"
36-
#define MQTT_PASSWORD "My_ioBrokerPASSWORD"
33+
#define MQTT_USER "MQTT broker user"
34+
#define MQTT_PASSWORD "Your MQTT Password"
3735
#define MQTT_CLIENTID "ESP32_PowerGuard" //Name muss eineindeutig auf dem MQTT-Broker sein!
3836
#define MQTT_KEEPALIVE 90
3937
#define MQTT_SOCKETTIMEOUT 30
@@ -52,18 +50,22 @@ unsigned long MQTTReconnect = 0;
5250
PubSubClient mqttClient(myWiFiClient);
5351

5452
// Anzahl der angeschlossenen DS18B20 - Sensoren
55-
int DS18B20_Count = 0; //Anzahl der erkannten DS18B20-Sensoren
53+
int DS18B20_Count = 0; //Anzahl der erkannten DS18B20-Sensoren
5654
//Sensorsetting (Ausgabe im Debugmodus (debug = 3) auf dem serial Monitor)
57-
float volatile temp1 = 0.0; //Sensor in Slot 2
58-
float volatile temp2 = 0.0; //Sensor in Slot 3
59-
float tempLimit = 90.0; //Ab dieser Temperatur wir 12V abgeschalten und thermalLimit = 1
60-
float tempReconnect = 80.0; //Ab dieser Temperatur thermalLimit = 0 und panicMode = 0 zurückgesetzt -> ESP32 Heizstabsteuerung boot neu nach PanicMode / bei thermalLimit wird kurz 5V abgeschaltet und der Neustart erzwungen..
61-
float tempMaxLimit = 95.0; //Panik-Abschaltung ab dieser Temperatur = 5V und 12V abschalten und thermalLimit = 1 & panicMode = 1
62-
float tempHysterese = 2.0; //bei Unterschreitung von (tmpLimit-tempHysterese)
63-
float deltaT = 2.0; //Limit des Betrags von Differenz zwischen tempTop1 tempTop2 (|tempTop1-tempTop2|)
64-
float minTemp = 10.0; //untere Plausibilitätsgrenze für Temperatursignale. Bei Unterschreitung => Notabschaltung, da ggf. Sensor defekt
65-
float maxTemp = 100.0; //obere Plausibilitätsgrenze für Temperatursignale. Bei Überschreitung => Notabschaltung, da ggf. Sensor defekt
66-
55+
float volatile temp1 = 0.0; //Sensor in Slot 2
56+
float volatile temp2 = 0.0; //Sensor in Slot 3
57+
float tempLimit = 90.0; //Ab dieser Temperatur wir 12V abgeschalten und thermalLimit = 1
58+
float tempReconnect = 80.0; //Ab dieser Temperatur thermalLimit = 0 und panicMode = 0 zurückgesetzt -> ESP32 Heizstabsteuerung boot neu nach PanicMode / bei thermalLimit wird kurz 5V abgeschaltet und der Neustart erzwungen..
59+
float tempMaxLimit = 95.0; //Panik-Abschaltung ab dieser Temperatur = 5V und 12V abschalten und thermalLimit = 1 & panicMode = 1
60+
float tempHysterese = 2.0; //bei Unterschreitung von (tmpLimit-tempHysterese)
61+
float deltaT = 2.0; //Limit des Betrags von Differenz zwischen tempTop1 tempTop2 (|tempTop1-tempTop2|)
62+
float minTemp = 10.0; //untere Plausibilitätsgrenze für Temperatursignale. Bei Unterschreitung => Notabschaltung, da ggf. Sensor defekt
63+
float maxTemp = 100.0; //obere Plausibilitätsgrenze für Temperatursignale. Bei Überschreitung => Notabschaltung, da ggf. Sensor defekt
64+
int volatile tempTSensorFail = 0; //Fehlercounter zur Temperaturmessung - Resilienz gegen gelegentliche Fehlauswertungen der Temperatursensoren
65+
int maxTSensorFail = 3; //maximal zulässige, hinereinander folgende Sensorfehler - danach panicStop
66+
float DS18B20_minValue = -55.0; //unterster Messwert im Messbereich [°C]
67+
float DS18B20_maxValue = 125.0; //unterster Messwert im Messbereich [°C]
68+
6769
//Initialisiere OneWire und Thermosensor(en)
6870
OneWire oneWire(ONE_WIRE_BUS);
6971
DallasTemperature myDS18B20(&oneWire);
@@ -309,7 +311,10 @@ void printStateMQTT() {
309311
mqttTopic = MQTT_SERIAL_PUBLISH_STATE;
310312
mqttTopic += "JSON";
311313
mqttJson = "{\"panicMode\":\"" + String(panicMode) + "\"";
312-
mqttJson += ",\"thermalLimit\":\"" + String(thermalLimit) + "\"}";
314+
mqttJson += ",\"thermalLimit\":\"" + String(thermalLimit) + "\"";
315+
mqttJson += ",\"hardwareError\":\"" + String(hardwareError) + "\"";
316+
mqttJson += ",\"lastError\":\"" + String(lastError) + "\"";
317+
mqttJson += ",\"WiFi_Signal_Strength\":\"" + String(WiFi.RSSI()) + "\"}";
313318
if (debug > 2) Serial.println("MQTT_JSON: " + mqttJson);
314319
mqttClient.publish(mqttTopic.c_str(), mqttJson.c_str());
315320
//panicMode
@@ -319,20 +324,34 @@ void printStateMQTT() {
319324
mqttClient.publish(mqttTopic.c_str(), mqttPayload.c_str());
320325
if (debug > 2) Serial.print("MQTT panicmode: ");
321326
if (debug > 2) Serial.println(mqttPayload);
322-
//thermalLimit
327+
//thermalLimit
323328
mqttTopic = MQTT_SERIAL_PUBLISH_STATE;
324329
mqttTopic += "thermalLimit";
325330
mqttPayload = String(thermalLimit);
326331
mqttClient.publish(mqttTopic.c_str(), mqttPayload.c_str());
327332
if (debug > 2) Serial.print("MQTT thermalLimit: ");
328333
if (debug > 2) Serial.println(mqttPayload);
329-
//thermalLimit
334+
// hardware Error
330335
mqttTopic = MQTT_SERIAL_PUBLISH_STATE;
331336
mqttTopic += "hardwareError";
332337
mqttPayload = String(hardwareError);
333338
mqttClient.publish(mqttTopic.c_str(), mqttPayload.c_str());
334339
if (debug > 2) Serial.print("MQTT hardwareError: ");
335340
if (debug > 2) Serial.println(mqttPayload);
341+
//lastError
342+
mqttTopic = MQTT_SERIAL_PUBLISH_STATE;
343+
mqttTopic += "lastError";
344+
mqttPayload = String(lastError);
345+
mqttClient.publish(mqttTopic.c_str(), mqttPayload.c_str());
346+
if (debug > 2) Serial.print("LastError: ");
347+
if (debug > 2) Serial.println(mqttPayload);
348+
//WiFi Signalstärke
349+
mqttTopic = MQTT_SERIAL_PUBLISH_STATE;
350+
mqttTopic += "WiFi_Signal_Strength";
351+
mqttPayload = WiFi.RSSI();
352+
mqttClient.publish(mqttTopic.c_str(), mqttPayload.c_str());
353+
if (debug > 2) Serial.print("WiFi Signalstärke: ");
354+
if (debug > 2) Serial.println(mqttPayload);
336355
}
337356
// MQTT Config und Parameter senden
338357
void printConfigMQTT() {
@@ -404,14 +423,13 @@ void mqttConnect () {
404423
Serial.print(" wird aufgebaut ");
405424
while (!mqttClient.connected()) {
406425
Serial.print(".");
407-
i++;
408426
if (mqttClient.connect(MQTT_CLIENTID, MQTT_USER, MQTT_PASSWORD, MQTT_SERIAL_PUBLISH_STATUS, 0, true, "false")) {
409427
mqttClient.publish(MQTT_SERIAL_PUBLISH_STATUS, "true", true);
410428
Serial.println("");
411429
Serial.print("MQTT verbunden!");
412430
}
413431
else {
414-
if (i > 20) {
432+
if (++i > 20) {
415433
Serial.println("MQTT scheint nicht mehr erreichbar! Reboot!!");
416434
ESP.restart();
417435
}
@@ -473,8 +491,28 @@ static void MQTTwatchdog (void *args){
473491

474492
//-------------------------------------
475493
//Subfunktionen für den TempSensor-Task
494+
// Temperatursensorenwerte auf die Limits prüfen
495+
bool checkDS18B20Value (float t){
496+
bool res = true; // true = im Messbereich; false = außerhalb des Messbereichs
497+
if ((t < DS18B20_minValue) || (t > DS18B20_maxValue)){
498+
//Sensorwert außerhalb des Messbereichs
499+
res = false;
500+
}
501+
if (debug > 2) Serial.print("Prüfe t-Wert auf Gültigkeit: ");
502+
if (debug > 2) Serial.print(t);
503+
if (debug > 2) Serial.print("°C [");
504+
if (debug > 2) Serial.print(DS18B20_minValue);
505+
if (debug > 2) Serial.print(",");
506+
if (debug > 2) Serial.print(DS18B20_maxValue);
507+
if (debug > 2) Serial.print("]; Ergebnis: ");
508+
if (debug > 2) Serial.println(res);
509+
return res;
510+
}
476511
// Temperatursensoren auslesen
477512
void readDS18B20() {
513+
float t1 = 0.0;
514+
float t2 = 0.0;
515+
bool res = false;
478516
if (debug > 2) Serial.print("Anfrage der Temperatursensoren... ");
479517
myDS18B20.requestTemperatures(); //Anfrage zum Auslesen der Temperaturen
480518
if (debug > 2) Serial.println("fertig");
@@ -488,8 +526,41 @@ void readDS18B20() {
488526
Adresse += String(myDS18B20Address[j], HEX);
489527
if (j < 7) Adresse += ", ";
490528
}
491-
if (i == 0) temp1 = myDS18B20.getTempCByIndex(i);
492-
if (i == 1) temp2 = myDS18B20.getTempCByIndex(i);
529+
if (i == 0) t1 = myDS18B20.getTempCByIndex(i);
530+
if (i == 1) t2 = myDS18B20.getTempCByIndex(i);
531+
}
532+
//Plausibilitätscheck
533+
if (checkDS18B20Value(t1)) {
534+
temp1 = t1;
535+
res = true;
536+
}
537+
else {
538+
++tempTSensorFail;
539+
res = false;
540+
mqttTopic = MQTT_SERIAL_PUBLISH_STATE;
541+
mqttTopic += "lastError";
542+
mqttPayload = "Temperatursensor T1 außerhalb des Messbereichts: " + String(t1) + "[C]; Wiederholung: " + String(tempTSensorFail);
543+
mqttClient.publish(mqttTopic.c_str(), mqttPayload.c_str());
544+
if (debug > 2) Serial.print("LastError: ");
545+
if (debug > 2) Serial.println(mqttPayload); //(debug > 2)
546+
}
547+
if (checkDS18B20Value(t2)) {
548+
temp2 = t2;
549+
if (res) tempTSensorFail = 0; //t1 und t2 sind korrekt => Fehlercounter auf 0 gesetzt
550+
}
551+
else {
552+
++tempTSensorFail;
553+
res = false;
554+
mqttTopic = MQTT_SERIAL_PUBLISH_STATE;
555+
mqttTopic += "lastError";
556+
mqttPayload = "Temperatursensor T2 außerhalb des Messbereichts: " + String(t2) + "[C]; Wiederholung: " + String(tempTSensorFail);
557+
mqttClient.publish(mqttTopic.c_str(), mqttPayload.c_str());
558+
if (debug > 2) Serial.print("LastError: ");
559+
if (debug > 2) Serial.println(mqttPayload);
560+
}
561+
if (tempTSensorFail > maxTSensorFail) {
562+
Serial.println("zu viele Fehler (out of range) beim Auslesen der DS18B20! Reboot!!");
563+
ESP.restart();
493564
}
494565
}
495566
//Thermale Limits prüfen und ggf. reagieren
@@ -506,6 +577,7 @@ void termalLimits () {
506577
if (debug) Serial.println("°C am Top-Sensor #2)");
507578
//Temperatursensoren liefern unplausible Werte gegeneinander -> Defekt!
508579
hardwareError = 1;
580+
lastError = "Zwangsabschaltung: unterschiedliche Sensorwerte (" + String(temp1) + "; " + String(temp2) + ")";
509581
panicStop();
510582
}
511583
}
@@ -520,6 +592,7 @@ void termalLimits () {
520592
if (debug) Serial.print("[");
521593
//Thermosensor 1 ist außerhalb des eingestellten Normbereichs -> Annahme Defekt!
522594
hardwareError = 1;
595+
lastError = "Zwangsabschaltung: Verletzung der thermischen Grenzen " + String(temp1) + " -> [" + String(minTemp) + " ... " + String(maxTemp) + "]";
523596
panicStop();
524597
}
525598
}
@@ -534,6 +607,7 @@ void termalLimits () {
534607
if (debug) Serial.print("[");
535608
//Thermosensor 2 ist außerhalb des eingestellten Normbereichs -> Annahme Defekt!
536609
hardwareError = 1;
610+
lastError = "Zwangsabschaltung: Verletzung der thermischen Grenzen " + String(temp2) + " -> [" + String(minTemp) + " ... " + String(maxTemp) + "]";
537611
panicStop();
538612
}
539613
}
@@ -546,6 +620,7 @@ void termalLimits () {
546620
if (debug) Serial.print(temp2);
547621
if (debug) Serial.println("°C am Top-Sensor #2.");
548622
//thermalstop = 1 -> 12V wird abgeschalten, damit die Relais keine Versorgung mehr haben können.
623+
lastError = "Thermal Stop: 12V abgeschaltet (" + String(temp1) + "; " + String(temp2) + ")";
549624
thermalStop();
550625
}
551626
}
@@ -558,17 +633,19 @@ void termalLimits () {
558633
if (debug) Serial.println("°C am Top-Sensor #2.");
559634
//thermalstop = 1 -> 12V wird abgeschalten, damit die Relais keine Versorgung mehr haben können.
560635
//panicMode = 1 -> 5V des ESP32 zur Steuerung des Heizstabs wird abgeschalten - damit alle Spannungsversorgungen
636+
lastError = "Thermal Stop: 5V und 12V abgeschaltet (" + String(temp1) + "; " + String(temp2) + ")";
561637
panicStop();
562638
}
563639
}
564640
if ((thermalLimit == 1) && (panicMode == 1) && (hardwareError == 0)) {
565-
//Prüfung, ob die Temperatur unter TempReconnect gefallen ist - falls ja Reboot ESP32 Heizstabsteuerung dur 5V ein
641+
//Prüfung, ob die Temperatur unter TempReconnect gefallen ist - falls ja, Reboot ESP32 Heizstabsteuerung zur 5V ein
566642
if ((temp1 < tempReconnect) && (temp2 < tempReconnect)) {
567643
if (debug) Serial.print("Thermische Zuschalten nach PanicMode: ");
568644
if (debug) Serial.print(temp1);
569645
if (debug) Serial.print("°C am Top-Sensor #1 bzw. ");
570646
if (debug) Serial.print(temp2);
571647
if (debug) Serial.println("°C am Top-Sensor #2.");
648+
lastError = "zurück im Normalbereich der Temperatur: reset der Heizstabelektornik";
572649
Heizstab_reboot();
573650
}
574651
}
@@ -581,6 +658,7 @@ void termalLimits () {
581658
if (debug) Serial.print("°C am Top-Sensor #1 bzw. ");
582659
if (debug) Serial.print(temp2);
583660
if (debug) Serial.println("°C am Top-Sensor #2.");
661+
lastError = "zurück im Normalbereich der Temperatur: reset der Heizstabelektornik";
584662
Heizstab_reboot();
585663
}
586664
}
@@ -777,7 +855,12 @@ void setup() {
777855
int app_cpu = xPortGetCoreID();
778856
BaseType_t rc;
779857
esp_err_t er;
780-
er = esp_task_wdt_init(300,true); //restart nach 5min = 300s Inaktivität einer der 4 überwachten Tasks
858+
esp_task_wdt_config_t wdt_config = {
859+
.timeout_ms = 300000, // 5 Minuten = 300000 ms
860+
.idle_core_mask = (1 << 1), // Nur Kerne 1 überwachen
861+
.trigger_panic = true
862+
};
863+
er = esp_task_wdt_reconfigure(&wdt_config); //restart nach 5min = 300s Inaktivität einer der 4 überwachten Tasks
781864
assert(er == ESP_OK);
782865
rc = xTaskCreatePinnedToCore(
783866
getTempFromSensor, //Taskroutine

0 commit comments

Comments
 (0)