Forum: Mikrocontroller und Digitale Elektronik ESP32-S2 ->kein wakeup in Timer Mode aus LightSleep


von Timo R. (tire)


Lesenswert?

Hallo,

ich nutze eine Wemos ESP32-S2 mini.

Das Teil möchte ich in Schlafmodus versetzten. Dazu definiere ich (gemäß 
Doku 
https://docs.espressif.com/projects/esp-idf/en/v4.2/esp32s2/api-reference/system/sleep_modes.html) 
folgendes
1
#define uS_TO_S_FACTOR 1000000ULL  /* Conversion factor for micro seconds to seconds */
2
#define TIME_TO_SLEEP  5        /* Time ESP32 will go to sleep (in seconds) */
3
esp_sleep_enable_timer_wakeup(TIME_TO_SLEEP * uS_TO_S_FACTOR);
4
esp_light_sleep_start();

Der Controller geht in Schlafmodus, wacht aber nicht mehr selbstständig 
auf.

nutze ich stattdessen den DeepSleep
1
esp_deep_sleep_start();
bekomme ich das Teil schlafen und automatisch geweckt - allerdings gemäß 
der Funktion startet der Controller durch. Das will ich ja gerade nicht.

Hat jemand ähnliche Erfahrung, es scheint LightSleep funktioniert 
einfach nicht?!

Gruß
Timo

: Bearbeitet durch User
von Andree S. (amshh)


Lesenswert?

Moin,

ich hatte mich auch mit dem Lightsleep Mode beschäftigt, weil nur in 
diesem Mode die GPIO-Ausgänge ihren Output festhalten ...

Dabei bin ich in Beispielen auf einen dort erwähnten Fehler gestoßen, 
der behoben wurde, indem nach dem wifi_fpm_do_sleep ein delay mit einer 
Zeit, die länger ist als die sleep-zeit eingebaut werden muss. Der 
Sleepmode startet dann und der callback wird (zumindest bei mir) dann 
nach der Zeit ausgeführt.
Hier ein Schnipsel (mit ein paar Debug-Ausgaben):
1
    Serial.println("3 >>>>>>>>>>>> Enter light sleep mode for 10 Sec");
2
    Serial.flush();
3
    
4
    // Here all the code to put con light sleep
5
    // the problem is that there is a bug on this
6
    // process
7
    //wifi_station_disconnect(); //not needed
8
    WiFi.mode(WIFI_STA);
9
10
    uint32_t sleep_time_in_ms = 10000;
11
    wifi_set_opmode(NULL_MODE);
12
    wifi_fpm_set_sleep_type(LIGHT_SLEEP_T);
13
    wifi_fpm_open();
14
    wifi_fpm_set_wakeup_cb(callback);
15
16
    wifi_fpm_do_sleep(sleep_time_in_ms *1000 );
17
18
    Serial.println("Delay after sleep mode START");
19
    delay(sleep_time_in_ms + 1);
20
    
21
    Serial.println("Exit light sleep mode");
22
    wifi_set_sleep_type(NONE_SLEEP_T);

1
void callback() {
2
  Serial.println("4 >>>>>>>>>>>> Callback");
3
  Serial.flush();
4
}



Probier es mal aus.
Gruß
A.

: Bearbeitet durch User
von Timo R. (tire)


Lesenswert?

Danke Andree,
konnte Deinen Code leider nicht nachvollziehen :-/

Folgender Test:
* Gleicher Code auf ein ESP32-Board "ESP32 Dev Module" kompiliert und 
aufgespielt - läuft problemlos

* auf einem WEMOS ESP32-S2 mini als "LOLIN S2 Mini" kompiliert und 
aufgespielt - bekanntes Problem, wake-up wird nicht ausgeführt.

Vermutlich wurde hier was bei der Boardintegration (esp32 V2.0.11) nicht 
sauber umgesetzt??

Der Code
1
#define uS_TO_S_FACTOR 1000000ULL /* Conversion factor for micro seconds to seconds */
2
#define TIME_TO_SLEEP 5           /* Time ESP32 will go to sleep (in seconds) */
3
4
5
6
void setup() {
7
  Serial.begin(115200);
8
}
9
10
void loop() {
11
  int i;
12
  i = 0;
13
  while (i < 100) {
14
    Serial.println(i);
15
    delay(100);
16
    i++;
17
  }
18
19
  Serial.println("schlafen");
20
  esp_sleep_enable_timer_wakeup(TIME_TO_SLEEP * uS_TO_S_FACTOR);  // wakeup setting
21
  delay(100);
22
  esp_light_sleep_start();
23
24
  Serial.println("Weiter gehts");
25
}

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.