Nein, ich habe noch keinen Watchdog implementiert.
Hab mir mal ein paar ESP32 Watchdog Beispiele angeschaut.
Da ich den WDT_TIMEOUT zur laufzeit ändern kann esp_task_wdt_init(WDT_TIMEOUT, true); //enable panic so ESP32 restarts
Kann ich z.B. wenn der Motor nicht läuft ein WDT_TIMEOUT von 5 sek und wenn der Motor läuft eine WDT_TIMEOUT von 1 sek verwenden.
Und dann z.B. in der Loop Routine alle 100ms esp_task_wdt_reset() aufrufen.
Evtl reicht es auch wenn ich bei Watchdog auslösung anstatt einem ESP restart eine eigene Routine aufrufe, ich habe aber nichts gefunden wie eine eigene Routine aufgerufen wird. esp_task_wdt_add(NULL); //add current thread to WDT watch
Evtl reicht es, wenn in der eigenen Routine der Motor gestoppt wird und dann:
Frage: Wozu verwendest du die EEprom.h Library ?
Die im core enthaltene Preferences ist da deutlich besser geeignet.
Zumal kein echtes EEprom vorhanden ist.
Bei anderen Projekten mit Arduinos, Maple Mini und ESPs verwende ich auch die EEprom Library, so kann ich ein Teil der Routinen von dort verwenden und muss nicht umdenken.
Ok, aber man könnte ja auch mal etwas neues angehen. Neuentwicklungen macht man ja nicht aus Langeweile.
Schau dir einfach mal diesen Beirag zu Preferences an.
Diese Routinen habe ich von einem anderen Projekt übernommen, evtl passt dies hier nicht so richtig, da die Klappensteuerung auch bei WLAN ausfall oder keiner Telnet Verbindung funktionieren soll.
Macht es Sinn die serialEvent Routine nur aufzurufen wenn eine Telnet Verbindung besteht?
Wie prüfe ich dies?
Damit?
if (client && client.connected()) {
serialEvent();
}
void WiFiEvent()
{
//check if there are any new clients
if (PWMstat == '0' && Server.hasClient()) { // PWMstat == '0' -> Motor laeuft nicht
if (!client || !client.connected()) {
if (client) client.stop();
client = Server.available();
client.flush();
Serial.print(F("New client: "));
Serial.println(client.remoteIP());
} else {
WiFiClient rejectClient = Server.available();
rejectClient.stop();
Serial.print(F("Reject new Client="));
Serial.println(rejectClient.remoteIP());
}
}
if(client && !client.connected())
{
client.stop();
}
}
void serialEvent()
{
while (client.available())
{
char inChar = (char)client.read();
switch (inChar)
{
case '\n':
case '\r':
case '\0':
case '#':
command_available = true;
break;
default:
cmdstring += inChar;
}
if (cmdstring.length() > maxCmdString)
{
cmdstring = "";
client.print(F("cmd to long! (max "));
client.print(maxCmdString);
client.println(F(")"));
}
}
}
Dass es während ein Motor läuft zu einer Blockierung z.B. durch eine Telnet Verbindung kommt, ist in der Praxis vermutlich sehr unwahrscheinlich,
aber es gibt ein Sprichwort "der Teufel ist ein Eichhörnchen".
Zwischen dem oberen Reedkontakt Stop und dem Motorgehäuse sind noch ca 2,5 Sek Luft.
Ich möchte deshalb ein Watchdog Timeout von 1 Sek verwenden, oder gibts bedenken, dass 1 Sek für ein Watchdog zu wenig sind?
Macht es Sinn, wenn der Motor nicht läuft den Watchdog Timeout auf 5 Sek zu erhöhen?
Ich habe zu den WiFi Server und Client Abfragen noch eine Vertändnisfrage.
Ich habe mir zum besseren Verständnis dies alle 2 Sek ausgegeben:
Serial.print("client ");
if (client) {
Serial.print("1");
}
else {
Serial.print("0");
}
Serial.print(" con ");
Serial.print(client.connected());
Serial.print(" hasC ");
Serial.println(Server.hasClient());
Wenn ich mit Strg+] und Quit die Telnet Verbindung beende, ist immer client und client.connected() false.
In welchen Fällen ist if(client) true und client.connected() false?
client wird mit Server.available() ein Objekt zugewiesen,
wenn die Telnetverbindung beendet wird, ist das Objekt = NULL.
Wenn client = NULL ist und dann mit if client.connected() oder client.available() abgefragt wird, wird da immer false zurückgegeben und es muss nicht noch vorher if(client) abgefragt werden?
Inzwischen habe ich es mit 2 Hühnerklappen aufgebaut. Ich werde es demnächst um eine dritte Hühnerklappe erweitern.
Für die Tasten und die Reedkontakte unten verwende ich den MCP23017 (siehe Anlage)
Die RSSI Werte vom ESP32 sind ca zwischen -75 und -82
Sicherheitshalber logge ich mich nicht in den ESP32 ein, wenn gerade ein Motor läuft.
Ich verwende noch kein Watchdog.
Ich habe vor sicherheitshalber einen Watchdog einzubauen.
Falls, während der Motor läuft, mein Code im ESP32 irgendwo hängen bleiben sollte, wird die Klappe oben anschlagen und der Motor wird blockieren.
Die Überstrom Erkennung des DRV8876 wird dann den Motor und kurzer Folge pulsieren, der Strom der Pulse ist dabei ca 1A.
Gibts im ESP32 auch ohne Watchdog einen internen Timeout, der nach einiger Zeit einen ESP32 restart auslöst?
Wenn ich einen Watchdog mit einem Timeout von ca 15 Sek verwende, dann müsste es ausreichend sein in der Loop jede Sekunde esp_task_wdt_reset(); aufzurufen.
Gibt es eine Möglichkeit nach einem Restart abzufragen ob der watchdog die Ursache war?