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.
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
}
}