ESP32 wifi power save mode

Hi zusammen,

da mir allgemein aufgefallen ist, dass der webserver meines ESP32 manchmal besser und machmal schlechter erreichbar ist (also performance-mäßig) hab ich ein wenig gegoogelt und bin dann auf diese Seite der Doku gestoßen:

https://www.mischianti.org/2021/03/06/esp32-practical-power-saving-manage-wifi-and-cpu-1/

Mein Englisch ist leider zu schlecht, um die drei Modi richtig zu begreifen.
Aber anscheined ist der default modus der hier: WIFI_PS_MIN_MODEM

Kann mir jemand auf Deutsch erklären, was ich für einen Vorteil habe, wenn ich in den Stromhungrigeren WIFI_PS_NONE Modus wechsle? Können damit meine Performance-Probleme behoben sein, oder hat das damit nichts zu tun (und es liegt eher an der schwankendem WLAN-Signalstärke allgemein)?

Viele Grüße & einen guten Start in die Woche euch!

Daniel

Lass dir den Beitrag doch übersetzen. das macht mein Browser "automatisch".
Oder du verwendest deepl zur Übersetzung.

Ist den ESP im internen Netzwerk eingebunden oder ein eigener AP ?
Wenn dieser im Netzwerk ist, liegt da vermutlich dein Problem im Netzwerk.
Der ESP32 wird ja nicht direkt angesprochen, sondern über deinen Router.

Ja, genau das vermute ich.

Beides, also WIFI_STA_AP Mode

OK. D.h. ich werde wahrscheinlich keinen Vorteil haben , wenn ich in den anderen Modus (WIFI_PS_NONE) wechsle? Was hat denn der Modus dann überhaupt für einen Sinn?

Hab ich vorhin auch mal versucht, aber ich kapier das leider auch inhaltlich nicht wirklich:

"WIFI_PS_MIN_MODEM ist der Standardparameter; wenn der Modemschlaf aktiviert ist, können empfangene WiFi-Daten so lange verzögert werden wie die DTIM-Periode.

Eine "Delivery Traffic Indication Map" (DTIM) ist eine Art TIM, die die Clients über das Vorhandensein von gepufferten Multicast-/Broadcast-Daten am Zugangspunkt informiert. Sie wird im Rahmen des periodischen Beacons mit einer durch das DTIM-Intervall festgelegten Frequenz erzeugt. Beacons sind Pakete, die von einem Zugangspunkt gesendet werden, um ein drahtloses Netzwerk zu synchronisieren. Normale TIMs, die in jedem Beacon enthalten sind, dienen dazu, das Vorhandensein von gepufferten Unicast-Daten zu signalisieren. Nach einem DTIM sendet der Zugangspunkt die Multicast-/Broadcast-Daten auf dem Kanal gemäß den Standard-Kanalzugriffsregeln.

Übersetzt mit DeepL Translate: The world's most accurate translator (kostenlose Version)"

Da gehts schon los:

"[...]können empfangene WiFi-Daten so lange verzögert werden wie die DTIM-Periode"

Was genau bedeuted das und was is t die DTIM-Periode.

"[...] Sie wird im Rahmen des periodischen Beacons mit einer durch das DTIM-Intervall festgelegten Frequenz erzeugt. [...]"

Was sind Beacons? Auch hier verstehe ich den gesamten Satz schon nicht (also rein technisch), sorry ;-(

Daher habe ich gehofft, dass das jemand von euch in einfachen Worten für Dummies erklären kann. Irgendeinen Vorteil muss der Wechsel in den WIFI_PS_NONE ja haben, d.h. wann/warum macht man das?

Danke für eure Unterstützung.

Der Sender sagt "Hallo!", siehe WLAN-Beacons.

Probiere doch aus, ob esp_wifi_set_ps(WIFI_PS_NONE); in Deiner Situation Vorteile bringt.

EDIT: WIFI_PS_MAX_MODEM geändert in WIFI_PS_NONE

Du meinste eher "WIFI_PS_NONE", oder? Denn so wie ich das sehe, ist das WIFI_PS_MAX_MODEM noch mehr "power save" als das MIN_MODEM.

Aber lange Rede, kurzer Sinn: Ich les mich da heute Abend nochmal ein (auch in den Beacon-Link von dir) und hoffe mal, ich begreif das alles :wink:

Ja klar, meine ich!

1 Like

Aber nochmal eine Frage hinterher:

Was hat es denn überhaupt mit dieser esp_wifi.h library auf sich:

https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/network/esp_wifi.html

Ist das nur eine Alternative zur Wifi.h die spezielle Funktionen für den ESP(32?) bietet?
Denn bisher nutze ich nur die WiFi.h und bin erst durch diese Powersafe-Sache auf die library aufmerksam geworden.

Wie sieht das bei euch aus?
Nutzt ihr WIFi.h oer esp_wifi.h?
Oder nutzt man / kann man die parallel nutzen?

Der hier hat schon mal keine Antwort im offiziellen ESP32 Forum bekommen:

War mir aber klar, da man da sehr selten Hilfe bekommt.

Ich versuche es mal mit meinem 5%-Wissen :crazy_face:

Der ESP32 ist kein Arduino, sondern kann auf auf Espressiv-Art programmiert werden, was deutlich anders aussieht. Gleichzeitig gibt es die Möglichkeit, mit der Arduino-IDE den ESP32 zu programmieren. Uns wird vorgegaukelt, wir hätten einen UNO, der auch Wifi kann. Damit das funktioniert, werkelt viel im Hintergrund.

Dazu wird auch die Dateiauswahl beeinflußt. Könnte der UNO Wifi, würde er bei mir Arduino-1.8.19\libraries\WiFi\src\WiFi.h nutzen. Hast Du als µC den ESP32 gewählt, ist es AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.2\libraries\WiFi\src\WiFi.h.

Schau Dir mal das Beispiel für FreeRTOS an, dann bekommst Du eine Ahnung, was Espressif so für Ideen hat. Mir ist es mit viel Probieren und Glück schon mal gelungen, ein Beispiel aus der Espressif-Beschreibung mit der Arduino-IDE zum Laufen zu bekommen (duty cycle messen eines PWM-Signals bei 20kHz).

Die Beispiele der Arduino-IDE kennen nur #include <WiFi.h>, weshalb ich diese Datei nutze.

1 Like

Ich glaub dann bleib ich auch lieber auf Arduino-Basis, sprich wifi.h.
Dann hat sich aber auch meine andere Sache erledigt (das mit dem WIFI_PS_NONE), so wie ich das sehe. Denn in der Wifi.h Welt gibts diesen Befehl ja nicht. Wie es sich dann da mit dem PowerSafeMode wohl verhält?

LG & schönen Feierabend (den ich jetzt machen werden!)

Doch, steht im Link aus #1: WiFi.setSleep(false);

Der Spannungsregler meines ESP32 scheint dann aber schlapp zu machen, es erfolgt immer ein Reboot.

Mit diesem Programm geht es dann:

#include <WiFi.h>
#include <WiFiClient.h>
#include <WebServer.h>
#include <ESPmDNS.h>
#include "zugangsdaten.h"

const char* ssid = STA_SSID;
const char* password = STA_PASSWORD;

WebServer server(80);

const int led = 13;

void handleRoot() {
  digitalWrite(led, 1);
  server.send(200, "text/plain", "hello from esp32!");
  digitalWrite(led, 0);
}
void handleTest() {
  digitalWrite(led, 1);
  server.send(200, "text/plain", "hello from esp32 mit test!");
  digitalWrite(led, 0);
}

void handleNotFound() {
  digitalWrite(led, 1);
  String message = "File Not Found\n\n";
  message += "URI: ";
  message += server.uri();
  message += "\nMethod: ";
  message += (server.method() == HTTP_GET) ? "GET" : "POST";
  message += "\nArguments: ";
  message += server.args();
  message += "\n";
  for (uint8_t i = 0; i < server.args(); i++) {
    message += " " + server.argName(i) + ": " + server.arg(i) + "\n";
  }
  server.send(404, "text/plain", message);
  digitalWrite(led, 0);
}

void setup(void) {
  pinMode(led, OUTPUT);
  digitalWrite(led, 0);
  Serial.begin(115200);
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  Serial.println("");

  // Wait for connection
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.print("Connected to ");
  Serial.println(ssid);
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());

  if (MDNS.begin("esp32")) {
    Serial.println("MDNS responder started");
  }

  WiFi.setSleep(false);

  server.on("/", handleRoot);
  server.on("/test", handleTest);

  server.on("/inline", []() {
    server.send(200, "text/plain", "this works as well");
  });

  server.onNotFound(handleNotFound);

  server.begin();
  Serial.println("HTTP server started");
}

void loop(void) {
  server.handleClient();
}

Die Strommessung überlasse ich Dir :slightly_smiling_face:

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.