[SOLVED] Deep Sleep zu kurz

Hallo,
ich habe leider ein Problem mit der Dauer des Deepsleeps. Vielleicht kann mir hier jemand helfen. Meine eigene Recherche war leider nicht erfolgreich.

Der Esp soll tagsüber 20Minuten schlafen, kurz aufwachen und dann wieder 20Min schlafen.
Nachts soll er 60Minuten schlafen.

Dafür habe ich eine IF-Abfrage gebaut, die auch korrekt verarbeitet wird.
Das Problem ist, dass er nachts nur 14Minuten schläft.
Ich weiß leider nicht warum.
Ohne die If Abfrage funktioniert es und er schlälft z.B. 20Minuten.
Ändere ich die 60Minuten auf einen anderen Wert (weniger, oder mehr) dann bleibt es trotzdem bei 14Minuten.

Hätte jemand eine Idee woran das liegen könnte?
Falls ich etwas vergessen haben sollte, trage ich das noch nach.
Danke schon einmal!

Hardware: Esp32 Wroom
Der Code:

int Schlafdauer_Tag = 1200; 
int Schlafdauer_Nacht = 3600; 
int hour; 
void startDeepSleep(){
  //Serial.println("Going to sleep...");
  //Serial.flush();

if (hour >= 19 && hour <= 23 || hour == 0 || hour >= 0 && hour <= 9)    {
Serial.println("Going to sleep (Nacht)...");
    esp_sleep_enable_timer_wakeup(Schlafdauer_Nacht * 1000000);   // Angabe und Umrechnung der Schlafdauer in s
    esp_deep_sleep_start();                                       // Start des DeepSleep

  }
else {  
//Es ist Tag.
Serial.println("Going to sleep (Tag)...");
    esp_sleep_enable_timer_wakeup(Schlafdauer_Tag * 1000000); // Angabe und Umrechnung der Schlafdauer in s
    esp_deep_sleep_start();                                   // Start des DeepSleep
  } 
}

Zeiten möglichst als unsigned vereinbaren, große Konstanten z.B. als 1000000UL. Sonst kann es zu unerwarteten Problemen mit Vorzeichen und abgeschnittenen Bits kommen.

Das sieht mir doppelt gemoppelt aus.
hour==0 ist in hour >=0 enthalten.

Neben DrDiettrich seinem Hinweis auf das UL setze ich gerne Klammern für die Übersicht.

if ((hour >= 19 && hour <= 23) || (hour >= 0 && hour <= 9))

man könnte auch einfach die Logik auf “istTag” umdrehen und damit ein oder und sparen:

if (hour > 9 && hour < 19)
// tag
else
// nacht

übrigens, abhängig vom restlichen code, für hour braucht man kein int, da sollte ein byte auch reichen.

Vielen Dank für die Hinweise!
Ich werde die Logik der IF-Abfrage anpassen und den Hinweis von DrDiettrich umsetzen.

Ich gebe heute Abend eine Rückmeldung.

Das tut mir richtig weh!
Und die Wiederholungen machen es noch schlimmer.

IF-Schleife

Vollkommen richtig, ich habs mal angepasst :blush:

1 Like

Tausend Dank! Der Kurztest war schon erfolgreich. Ich lasse es nun permanent laufen. Mal sehen, ob es dabei bleibt. Es sieht bisher aber schon sehr gut aus.

Leider zu früh gefreut.
Der Deepsleep funktioniert für den Nacht-Zweig in der IF Abfrage für 3600s wie erwartet. Jedoch nicht für 7200s.
Er wacht dann schon nach 2940s auf.

Für genauere Tests hatte ich leider noch keine Zeit.
Den angepassten Code kann ich später noch zur Verfügung stellen. Auf die Schnelle stelle ich hier mal die gemachte Änderungen mal aus dem Gedächtnisprotokoll ein.

Habe ich die Anpassungen evtl. falsch vorgenommen? Ich hatte mir die Arduino Referenz für unsigned int und UL angesehen und aus meiner (Anfänger-) Sicht sollte das korrekt sein.

Könnt ihr bitte nochmal so nett sein und über den Code schauen?
Ich würde die Schlafzeit auf 5h (18000s) erhöhen wollen, was laut meiner Recherche angeblich machbar sein sollte.

unsigned int Schlafdauer_Tag = 1200; 
unsigned int Schlafdauer_Nacht = 7200; 
int hour; 
void startDeepSleep(){
if (hour > 9 && hour < 19) {
 esp_sleep_enable_timer_wakeup(Schlafdauer_Tag * 1000000UL); // Angabe und Umrechnung der Schlafdauer in s
 esp_deep_sleep_start();                                     // Start des DeepSleep
 } 
else {
 esp_sleep_enable_timer_wakeup(Schlafdauer_Nacht * 1000000UL);   // Angabe und Umrechnung der Schlafdauer in s
 esp_deep_sleep_start();                                         // Start des DeepSleep
 }
}

Ich rate dazu die Doku zu lesen!
esp_err_t esp_sleep_enable_timer_wakeup (uint64_t time_in_us )

const uint64_t Schlafdauer_Tag = 1200; 
const uint64_t Schlafdauer_Nacht = 3600;

Und dann kannst du immer noch esp_err_t auswerten, um zu prüfen, ob du Mist gebaut hast.

Für alle die es interessieren sollte.. hier der Code, der für mich funktioniert.
Vielen Dank an alle, dir mir geholfen haben!

const uint64_t Schlafdauer_Tag = 1200;      
const uint64_t Schlafdauer_Nacht = 10800;
if (hour >= 8 && hour < 18) {
  // tag
      esp_sleep_enable_timer_wakeup(Schlafdauer_Tag * 1000000ULL);
      esp_deep_sleep_start();  
 }
else {
  // nacht
      esp_sleep_enable_timer_wakeup(Schlafdauer_Nacht * 1000000ULL);
      esp_deep_sleep_start();                                         
 }