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

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.

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.