ESP32 Deep sleep und Regenmengensensor

Hallo und guten Tag,
ich steh grade programmiertechnisch auf dem Schlauch, und denke Ihr habt sofort eine Idee...

Also mein ESP32 misst aller 1/2 h Temperatur Luftdruck und so weiter, WiFi an und auf den Webserver
(Station Talstrasse -die Seite ist allerdings fürs Handy optimiert), WiFi wieder aus und schlafen. Nach einer halben Stunde Wecken und so weiter. Geht prima.

Jetzt hat Aliexpress gestern meinen neuen Regenmengensensor geliefert, der so Impulse ausgibt. Also an EXT0 angeschlossen mit externem Pulldown, beim ersten Impuls WLAN an und den Regen melden, aus, schlafen. Beim nächsten Impuls nix mehr melden, nur hochzählen und schlafen. Geht auch soweit.

Ich kann nun unterscheiden ob wegen Timer (dann wird gemessen und gesendet und auch die Regenimpulszahl)
oder wegen Regenimpuls (dann wird nur hochgezählt) geweckt wurde.
Der ganze Stress natürlich wegen der 3V Lithiumzelle die das alles befeuert....

Das ist alles super, aber wenn es jetzt tagelang regnet, werden gar keine Werte mehr gesendet. Ich hab als Krücke die Weckzeit nach Impuls auf 60 Sekunden verkürzt, aber bei typischem Dauerregen hilft das auch nicht, da es zumindest eine Minute mal aufhören müsste.

Ich hab keine richtige Idee. Hat der ESP32 vielleicht 2 verschiedene Sleeptimer oder irgend sowas?

Hey, über eine Idee (kein Code sonder Herangehensweise) würde ich mich richtig freuen....

Eigentlich wollte ich ja mal vier Wochen die Klappe halten. Aber ich kanns nicht lassen.... :blush:

Du kannst das Event abfragen, welches das WakeUp ausgelöst hat.
Stichwort: esp_sleep_get_wakeup_cause()
https://docs.espressif.com/projects/esp-idf/en/latest/api-reference/system/sleep_modes.html

Oder hier: arduino-esp32/TouchWakeUp.ino at master · espressif/arduino-esp32 · GitHub

void print_wakeup_reason(){
  esp_sleep_wakeup_cause_t wakeup_reason;

  wakeup_reason = esp_sleep_get_wakeup_cause();

  switch(wakeup_reason)
  {
    case ESP_SLEEP_WAKEUP_EXT0 : Serial.println("Wakeup caused by external signal using RTC_IO"); break;
    case ESP_SLEEP_WAKEUP_EXT1 : Serial.println("Wakeup caused by external signal using RTC_CNTL"); break;
    case ESP_SLEEP_WAKEUP_TIMER : Serial.println("Wakeup caused by timer"); break;
    case ESP_SLEEP_WAKEUP_TOUCHPAD : Serial.println("Wakeup caused by touchpad"); break;
    case ESP_SLEEP_WAKEUP_ULP : Serial.println("Wakeup caused by ULP program"); break;
    default : Serial.printf("Wakeup was not caused by deep sleep: %d\n",wakeup_reason); break;
}

Wenn's der Regensensor ist, hochzählen und gleich wieder einschlafen.....
Ich habe aber keine Ahnung, wie lange das WakeUp dauert.

Aber da gibt's ja noch was feines (was ich bisher noch nicht gebraucht habe):
Der ESP hat ja drei Kerne, zwei normale und den ULP.
Der ULP arbeitet in DeepSleep-Modus. Das heisst, dein ESP würde beim Impulsezählen nicht aufwachen und damit Strom sparen.
Wegen der IOs musst du aber nochmal in die Doku schauen. Kann mich erinnern, dass sie beim ULP von der normalen Belegung abweicht. Im Normalbetrieb würd ich über den Sensoreingang einen Interrupt auslösen....

Mir haben die Videos von Andreas Spiess sehr geholfen. Hier ein Video zum ULP.

Bitte schreibe das Ergebnis. Würde mich sehr interessieren.