Forum: Mikrocontroller und Digitale Elektronik ESP32-C6 WiFi Verbindung nach light sleep nicht mehr möglich


von Bernhard F. (bernhard_f759)


Lesenswert?

Hallo zusammen.

Ich habe mir den ESP32-C6 angeschaut und festgestellt, dass der 
Stromverbrauch im light sleep mit 180 uA endlich nicht mehr absolut 
katastrophal ist. Bei hoher Messhäufigkeit sollte der ESP32-C6 damit im 
light sleep bei hoher Messhäufigkeit besser Batterielaufzeiten erreichen 
als im deep sleep.

Ich benutze schon einige ESP8266/32 aber nur mit deep sleep.


Also gleich 2 verschiedene Boards bestellt und losgelegt.  Zuerst 
braucht der Chip eher 300uA im light sleep und damit fast doppelt so 
viel wie im Datenblatt aber ok... Die Boards sind nicht das Problem 
beide <20uA im deep sleep.
Schlimmer ist allerdings, dass der ESP nach dem Aufwachen keine 
Verbindung mehr herstellen kann.

Hier mein Minnimalcode erstellt mit der Arduino IDE:
1
while (1){
2
  delay(1000);
3
  WiFi.mode(WIFI_STA);
4
  WiFi.begin(ssid,password);
5
  testdaten_senden();
6
  
7
  WiFi.disconnect(true);
8
  WiFi.mode(WIFI_OFF);
9
  delay(1000);
10
  esp_sleep_enable_timer_wakeup(0.1 * 60 * 1000 * 1000);
11
  esp_light_sleep_start();
12
}
Kommentiere ich die Zeile esp_light_sleep_start(); aus funktioniert 
alles wie gewünscht.
Mit light sleep bleibt das Programm bei WiFi.mode(WIFI_STA); hängen.

Die letzte Meldung die ich vom ESP bekomme lautet:
[NetworkEvents.cpp:119] checkForEvent(): Network Event: 9 - WIFI_READY
Ohne sleep folgt etwa nach ~30uS:
[STA.cpp:184] _onStaEvent(): STA Started
Mit sleep bleibt das Programm wie gesagt einfach hängen.

Kennt jemand eine Lösung?
Danke schon einmal.

von Martin D. (martin_d69) Benutzerseite


Lesenswert?

Moin Bernhard,

Vorab erstmal meine quellen:
https://docs.espressif.com/projects/esp-idf/en/stable/esp32c6/api-reference/system/sleep_modes.html#:~:text=ESP32%2DC6%20supports%20two%20major,are%20some%20sub%20sleep%20modes.

https://github.com/espressif/arduino-esp32/blob/master/libraries/WiFi/src/WiFiGeneric.cpp

Dann ersetze das Delay durch ein Pollen mit while(WiFi.getMode() != 
WIFI_MODE_OFF);
Zum debuggen kannst ja in dem while Loop den Zustand ausgeben.
Jetzt sollte ein deinit kommen!

Hinweis: schau dir mal espWiFiStop() an.

Gruß Martin

von Bernhard F. (bernhard_f759)


Lesenswert?

Martin D. schrieb:
> Moin Bernhard,
>
> Vorab erstmal meine quellen:
> 
https://docs.espressif.com/projects/esp-idf/en/stable/esp32c6/api-reference/system/sleep_modes.html#:~:text=ESP32%2DC6%20supports%20two%20major,are%20some%20sub%20sleep%20modes.
>
> 
https://github.com/espressif/arduino-esp32/blob/master/libraries/WiFi/src/WiFiGeneric.cpp
>
> Dann ersetze das Delay durch ein Pollen mit while(WiFi.getMode() !=
> WIFI_MODE_OFF);
> Zum debuggen kannst ja in dem while Loop den Zustand ausgeben.
> Jetzt sollte ein deinit kommen!
>
> Hinweis: schau dir mal espWiFiStop() an.
>
> Gruß Martin

espWiFiStop(); Erzeugt ein:'espWiFiStop' was not declared in this scope
espWiFiStop()  kenne ich noch aus älteren Versionen. Inzwischen wurde 
das zumindest in der Arduino IDE durch WiFi.disconnect(true) + 
WiFi.mode(WIFI_OFF) ersetzt. Tatsächlich ist er schon vor dem delay auf 
dem Status STA_DISCONNECTED. Die delays habe ich vor allem im Programm 
damit er sich nicht ohne sleep zu Tode hetzt.
Ohne WiFi.mode(WIFI_OFF) hängt er sich schon bei Wechsel in den light 
sleep auf.

Am besten ich speichere meine Werte im EEPROM zwischen und starte den 
gehe in den deep sleep oder ESP neu wenn die Daten 1x pro Stunde zum 
Server gesendet werden sollen...

von Martin D. (martin_d69) Benutzerseite


Lesenswert?

https://github.com/iqnev/esp32_sleep_modes

besagt, dass ein deaktivieren von Radio nicht notwendig sei vorm 
light-sleep. Hast das mal probiert?

von Bernhard F. (bernhard_f759)


Lesenswert?

Ohne Aufruf von WiFi.mode(WIFI_OFF); wacht der ESP nie wieder aus dem 
Sleep auf. Generell sind 4 Jahre alte Programme inzwischen meistens 
unbrauchbar.
Anscheinend bin ich auch nicht der einzige mit diesem Problem.
Ich speichere jetzt die Daten im RTC RAM zwischen und missbrauche den 
deep sleep als Reset sobald sie gesendet werden sollen.

von Alexander (alecxs)


Lesenswert?

Ich bin mit Arduino 1.8.9 bisher gut gefahren und sehe keinen Grund 
daran was zu ändern.

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.