INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
ESP32 Watchdog Funktion
19.07.2020, 21:35
Beitrag #1
ESP32 Watchdog Funktion
Hallo,
mein ESP32 soll mir die Aussentemperatur liefern. Ich werde wohl zuerst WLAN verwenden. Bei meinem ersten 24 Stundentest war die Übertragung abgebrochen worden. Ich mußte dann den Reset - Taster betätigen. Danach lief die Übertragung wieder.

Wenn ich die USB - Verbindung durch ziehen des USB - Steckers unterbreche, läuft die Übertragung in der Regel wieder an, aber ich meine, ab und zu auch nicht.Dodgy

Ich wollte die Zuverlässigkeit mit so etwas wie einer Watchdog Funktion verbessern. Das könnte man simpel mit einem 555er Timer umsetzen, der alle 10 Minuten den Reset des ESP32 auslöst. Das Programm würde dann bei jeder Übertragung den Timer zurückstellen und so den Reset unterbinden.

Wie sehen eure Erfahrungen aus?
mfg Klaus
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
19.07.2020, 22:40
Beitrag #2
RE: ESP32 Watchdog Funktion
(19.07.2020 21:35)KlaRa schrieb:  Hallo,
mein ESP32 soll mir die Aussentemperatur liefern. Ich werde wohl zuerst WLAN verwenden. Bei meinem ersten 24 Stundentest war die Übertragung abgebrochen worden. Ich mußte dann den Reset - Taster betätigen. Danach lief die Übertragung wieder.

Wenn ich die USB - Verbindung durch ziehen des USB - Steckers unterbreche, läuft die Übertragung in der Regel wieder an, aber ich meine, ab und zu auch nicht.Dodgy

Ich wollte die Zuverlässigkeit mit so etwas wie einer Watchdog Funktion verbessern. Das könnte man simpel mit einem 555er Timer umsetzen, der alle 10 Minuten den Reset des ESP32 auslöst. Das Programm würde dann bei jeder Übertragung den Timer zurückstellen und so den Reset unterbinden.

Wie sehen eure Erfahrungen aus?
mfg Klaus

Hi,
das Problem habe ich mit dem ESP32 auch...ab und zu spackt die WiFi Verbindung ab...und meistens hilft es nicht den Reset zu drücken... wir (ardu_arne hat auch dieses Problem mit seinen ESP32) haben das auch auch schon mehrfach erlebt. Arne hat dazu schon einen Watchdog gebaut wo dann VCC vom ESP abschaltet damit er neu bootet. Möglicherweise hängt sich da auch die Zweite CPU auf dem Chip wo im Hintergrund läuft auch auf. Eine einfachere Lösung haben wir noch nicht erfunden.
Bei einem ESP sieht es so aus das einfach die WiFi Feldstärke nach dem Absturz auf dem anhängenden OLED Dsiplay mit 0 angezeigt wird. Bei dem anderen ESP32 wo im Prinzip das gleiche Programm drauf läuft ist es dann meistens so das das Display ganz merkwürdig und gebremst upgedatet wird.... also da scheinen die ESP's noch nichts zuverlässiges zu sein.
lgbk

1+1 = 10 Angel ...und ich bin hier nicht der Suchmaschinen-Ersatz Dodgy...nur mal so als genereller Tipp..
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
20.07.2020, 09:55
Beitrag #3
RE: ESP32 Watchdog Funktion
Hallo Bitklopfer,
vielen Dank für Deine Antwort. Smile Wenn bei Dir und ardu_arne die WiFi Verbindung abbricht, wie wird dann der Watchdog ausgelöst? Der ESP32 läuft vermutlich noch weiter. Also würde der Watchdog auch noch weiter zurückgesetzt werden.

Der Empfänger müsste dem ESP32 eine Empfangs - Quittung zusenden. Bleibt sie x-mal aus, so würde ein Neustart ausgelöst.

Ich hatte schon im Februar 2019 nachstehende Lösung für einen DHT22 zum Laufen gebracht. Bin aber erst jetzt wieder dazu gekommen weiter zu machen.

https://randomnerdtutorials.com/esp32-dh...duino-ide/

Man setzt dort die ESPAsyncWebServer library und die AsyncTCP library ein. Ich weiß zur Zeit noch nicht ob der Transport bidirektional ist. Ich vermute, ja. Dann wäre die Empfangs - Quittung ja kein Problem, so hoffe ich zumindest.
mfg Klaus
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
20.07.2020, 11:01
Beitrag #4
RE: ESP32 Watchdog Funktion
Hallo,

das Problem kenne ich irgendwie. Ich habe nur einen nackten ESP32-Wroom mit einem BME280 und MAX44009 mit Akku auf dem Balkon laufen.
Daten werden alle 5 Minuten per MQTT geschickt. Zustand aktuell jetzt seit ein paar Monaten:
Laufzeit nach Aufwachen bis WLAN-connect max. 2s. Alle x Zyklen, x ist zufällig irgendwo zwischen 10 und ? braucht der ESP32 ca. 4 für den WLAN-Connect. Die jeweiligen Zeiten sind relativ konstant, bisher keine Erklärung dafür gefunden.
Außerdem wird zufällig so alle paar Stunden mal nur der Temperaturwert, also der erste publish, geschickt, beim nächsten Mal kommen dann wieder alle an.
Auch keine Erklärung, alle Returncodes sagen ok...

Ich ignoriere das jetzt eben, läuft aber sonst eben seit mehreren Monaten zuverlässig.
Die Timeouts und das WiFi abschalten sind durch Versuch und Irrtum zustande gekommen, er geht so zumindest bei Fehlern stabil wieder schalfen und startet den nächsten Zyklus sauber.

Code:
/*--------------------------------------------------
v0.6 MSoft 28.02.2016
4MBit-Flash: 1MB(3MB SPIFFS), QIO, Generic ESP
--------------------------------------------------*/

#include <WiFi.h>
#include <esp_adc_cal.h>
#include <PubSubClient.h>
#include <Wire.h>
#include <Adafruit_BME280.h>
#include <MAX44009.h>

#define BME280_I2C_ADR 0x76

// Batterie
#define RESISTANCE_NUM    2
#define DEFAULT_VREF      1100
#define NO_OF_SAMPLES     64

static esp_adc_cal_characteristics_t adc_chars;
double readBatteryVoltage(void);

// MAX44009
MAX44009 light;

// BME280
Adafruit_BME280 bme; // I2C

// WLAN
const char* ssid = "xxxxxxxx";
const char* password = "xxxxxxxx";
const char* mqtt_server = "192.168.0.99";

// Abstand der Messung
#define uS_TO_S_FACTOR 1000000 // micro seconds for sleep mode
#define TIME_TO_SLEEP 300 // seconds for sleep mode, the esp32 sends data every 10 seconds and goes to sleep mode, you can change this value as your mind

unsigned long sleepTime = TIME_TO_SLEEP * uS_TO_S_FACTOR;

// MQTT
WiFiClient espClient;
PubSubClient mqttclient(mqtt_server,1883,0,espClient); // callback

bool WIFI_Start(void);
bool MQTT_Start(void);
void MQTT_Send(void);

//################################################################

void setup()
{
  adc1_config_width(ADC_WIDTH_BIT_12);
  adc1_config_channel_atten(ADC1_CHANNEL_7, ADC_ATTEN_DB_11);  // ADC 1 Channel 7 GPIO35
  esp_adc_cal_characterize(ADC_UNIT_1, ADC_ATTEN_DB_11, ADC_WIDTH_BIT_12, DEFAULT_VREF, &adc_chars);

  esp_sleep_enable_timer_wakeup(sleepTime);
  
  btStop();
  
  WiFi.config(IPAddress (192,168,0,155), IPAddress (192,168,0,1), IPAddress (192,168,0,1));
  WiFi.mode(WIFI_STA);
  if (WIFI_Start())
  {  
      if(light.begin())
    {
      if (bme.begin(BME280_I2C_ADR))
      {
        if (MQTT_Start())
        {
          MQTT_Send();
        }
      }
    }  
  }
  
  delay(100);
  WiFi.disconnect();
  WiFi.mode(WIFI_OFF);
  delay(10);
  esp_deep_sleep_start();              // Ende, schlafen gehen...
  delay(100);
}

//----------------------------------------------------------------

void loop()
{
}

//################################################################
//----------------------- WiFi Tools -----------------------------
//################################################################

bool WIFI_Start()
{
  bool WIFIflag = false;
  
  WiFi.begin(ssid, password);
  for (byte i = 0; i < 50; i++)
  {
    if (WiFi.status() == WL_CONNECTED)
    {
      WIFIflag = true;
      break;
    }
    else
    {      
      delay(100);
    }  
  }
  return WIFIflag;
}

//################################################################
//----------------------- MQTT Tools -----------------------------
//################################################################

bool MQTT_Start()
{
  bool MQTTflag = false;

  mqttclient.connect("ESP32-BME280");   // clientID,willTopic,willQoS,willRetain,willMessage

  for (byte i = 0; i < 10; i++)
  {
    if (mqttclient.connected())
    {    
      MQTTflag = true;
      break;
    }
    else
    {      
      delay(50);
    }  
  }
  return MQTTflag;  
}

//----------------------------------------------------------------

void MQTT_Send()
{

bool flag = false;

  if (mqttclient.connected())
  {  
    bme.takeForcedMeasurement();
    
    String output = String(bme.readTemperature(),1);
    flag = mqttclient.publish("BME280-2/Temperatur", output.c_str());

    output = String(bme.readHumidity(),0);
    flag = mqttclient.publish("BME280-2/Feuchte", output.c_str());
    
    output = String((bme.readPressure() / 100.0F),0);
    flag = mqttclient.publish("BME280-2/Luftdruck", output.c_str());
    
    output = String(light.get_lux(),2);
    flag = mqttclient.publish("BME280-2/Licht", output.c_str());

    output = String(readBatteryVoltage());
    flag = mqttclient.publish("BME280-2/Spannung", output.c_str());
  }
}

//################################################################
//-------------------- Batterie Tools ----------------------------
//################################################################

double readBatteryVoltage()
{
  uint32_t adc_reading = 0;
  for (int i = 0; i < NO_OF_SAMPLES; i++)
  {
//    adc_reading += adc1_get_raw((adc1_channel_t) ADC1_CHANNEL_0);
    adc_reading += adc1_get_raw((adc1_channel_t) ADC1_CHANNEL_7); // GPIO35
  }
  adc_reading /= NO_OF_SAMPLES;

  return (double) esp_adc_cal_raw_to_voltage(adc_reading, &adc_chars) * RESISTANCE_NUM / 1000;
}
Gruß aus Berlin
Michael
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
20.07.2020, 13:01
Beitrag #5
RE: ESP32 Watchdog Funktion
Hallo Klaus,

nach meiner Erfahrung gibt es verschiedene Varianten wie so ESP32 abstürzen kann.
Oft wirft er die WLAN Verbindung weg und merkt es nicht. Man kann die WLAN Verbindung per Software überwachen und dann bei Fehler mit einem ESP.restart(); reagieren. Aber diese Überwachung greift je nach Absturzvariante auch nicht immer.
Manchmal half dann im Fehlerfall ein Druck auf den Reset Knopf, manchmal musste ich ihn auch spannungslos machen.

Ich hatte dann mit zusätzlicher Hardware (einem ATtiny85 + einem P-Kanal MOSFET) einen externen Watchdog aufgebaut der vom ESP32 getriggert wurde. Per Software wechselte der ESP32 an einem Ausgang jede Sekunde den Zustand. Das wurde vom ATtiny85 überwacht. Wenn diese Pegelwechsel einige Sekunden ausblieben hat der ATtiny85 dem ESP32 für zwei Sekunden die Spannung abgeschaltet. Dann startete der ESP32 sicher neu und alles war gut.

Inzwischen bin ich aber wegen seine Unzuverlässigkeit ganz vom ESP32 weg und nutze nur noch den ESP8266. Der läuft wesentlich stabiler.

Gruß Arne
Mit zunehmender Anzahl qualifizierter Informationen bei einer Fragestellung, erhöht sich zwangsläufig die Gefahr auf eine zielführende Antwort.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
20.07.2020, 13:49
Beitrag #6
RE: ESP32 Watchdog Funktion
(20.07.2020 09:55)KlaRa schrieb:  Hallo Bitklopfer,
vielen Dank für Deine Antwort. Smile Wenn bei Dir und ardu_arne die WiFi Verbindung abbricht, wie wird dann der Watchdog ausgelöst? Der ESP32 läuft vermutlich noch weiter. Also würde der Watchdog auch noch weiter zurückgesetzt werden.
....

..also ich für meinen Teil habe den Watchdog hier noch nicht aktiviert.
lgbk

1+1 = 10 Angel ...und ich bin hier nicht der Suchmaschinen-Ersatz Dodgy...nur mal so als genereller Tipp..
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
20.07.2020, 14:13
Beitrag #7
RE: ESP32 Watchdog Funktion
Hallo Michael,
vielen Dank für Deine Ausführungen. Ich werde zuerst auf den ESPAsyncWebServer zurückgreifen. Inzwischen weiß ich das er bidirektional arbeitet (war eigentlich klar). Mein Datensammler ist eine VB.NET Anwendung. C# ging auch, falls es erforderlich wäre.

Das MQTT sieht interessant aus. Ich werde aber jetzt dafür keine Zeit haben.
mfg Klaus
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
20.07.2020, 14:21
Beitrag #8
RE: ESP32 Watchdog Funktion
Hallo Arne,
zumindest hat der WatchDog geholfen. Beim Datensammeln hat man ja in der Regel Zeit. So stören kurze Unterbrechungen eigentlich nicht besonders. Und so oft kommen sie ja anscheinend auch nicht vor. Mein ESP32 läuft bald 36 Stunden. Aber das ist ja nur ein Thema von vielen.
mfg Klaus
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  ESP32 Schieberegler Woolli 13 242 Gestern 13:37
Letzter Beitrag: Tommy56
  Max. Eingangsspannung ESP32 Devkit V1 Gerdchen03 4 128 Gestern 00:45
Letzter Beitrag: Bitklopfer
  ESP32 BLE - Wie kann ich die UUID aus INI-WiFiManger übernehmen ? Stargazer 0 96 18.10.2020 16:26
Letzter Beitrag: Stargazer
  AZ-Touch ESP32 Grafiktest ckuehnel 0 154 13.10.2020 17:34
Letzter Beitrag: ckuehnel
  ESP32: Filesystem uploader tool findet mklittlefs.exe nicht ultralex 6 101 12.10.2020 22:07
Letzter Beitrag: hotsystems
  ESP32+SIM808 Gpsdaten auf Display und SMS reinhard-adam 0 172 06.10.2020 16:49
Letzter Beitrag: reinhard-adam
  ESP32+SIM808 GPS Daten auslesen und auf LCD reinhard-adam 2 338 21.09.2020 18:25
Letzter Beitrag: georg01
  Fehler bei Board AI Thinker ESP32-CAM Manny 4 725 30.08.2020 16:37
Letzter Beitrag: Manny
  ESP32 Ethernet shrimps 33 24.189 27.08.2020 15:05
Letzter Beitrag: biologist
  ESP32 Dev Kit 4711engel 12 1.556 26.08.2020 08:41
Letzter Beitrag: 4711engel

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste