Ratgeber · 16 Min. Lesezeit

ESP32 verbindet sich nicht mit WLAN: WiFi.status() und Lösungen

ESP32 verbindet sich nicht mit dem WLAN? WiFi.status() und Reason-Codes, 2,4 GHz, Passwortfehler, Brownout, setTxPower, Reconnect, statische IP und eduroam.

Dein ESP32 verbindet sich nicht mit dem WLAN und im seriellen Monitor erscheinen nur endlose Punkte? Ein defektes Board ist fast nie der Grund. Die üblichen Verdächtigen sind: ein 5-GHz-Netz, ein kleiner Tippfehler im Netzwerknamen oder Passwort, ein schwaches Netzteil, dessen Spannung beim Einschalten des WLANs einbricht, die Sicherheits- und Kanaleinstellungen des Routers oder ein Unternehmensnetz in Schule oder Firma. Die gute Nachricht: Der ESP32 verrät dir bereits, was schiefgelaufen ist. Du musst nur den Wert von WiFi.status() und den Reason-Code (Grund) lesen können, den er beim Verbindungsabbruch meldet.

In dieser Anleitung siehst du zuerst, in welchen Schritten sich der ESP32 mit einem Netz verbindet und welchen Statuscode er bei jedem Schritt liefert. Danach folgen ein Diagnose-Sketch, der Status- und Reason-Codes ausgibt, ein Scanner, der die Netze in deiner Umgebung auflistet, die 2,4-GHz-Pflicht und Dualband-Router, Brownouts und die setTxPower-Lösung, ein Reconnect-Sketch, der Verbindungsabbrüche selbst behebt, statische IP, eine WPA2-Enterprise-Verbindung für Schulnetze und der Handy-Hotspot-Test, der dir in wenigen Minuten zeigt, ob das Problem am Router oder am Board liegt. Die Sketches laufen mit den Versionen 2.x und 3.x des ESP32-Cores für die Arduino IDE; am Ende gibt es zusätzlich ein Testskript für den Raspberry Pi Pico W und MicroPython.

ESP32-Entwicklungsboard mit PCB-Antenne
ESP32-Entwicklungsboard: Die Zickzack-Leiterbahn am Ende des abgeschirmten Moduls ist die PCB-Antenne. Metall, ein Akku oder Kabel direkt darauf oder daneben schwächen die Verbindung spürbar.

Wie verbindet sich der ESP32 mit einem WLAN?

Wenn du WiFi.begin() aufrufst, arbeitet der ESP32 im Hintergrund vier Schritte ab. Zuerst durchsucht er die Kanäle nach einem Netz mit dem angegebenen Namen (SSID). Findet er es, authentifiziert er sich beim Router und meldet sich an (Association). Bei WPA2-Netzen folgt der 4-Wege-Handshake, bei dem sich zeigt, ob das Passwort stimmt. Zum Schluss fordert er beim DHCP-Server des Routers eine IP-Adresse an. WiFi.status() liefert erst dann WL_CONNECTED, wenn auch dieser letzte Schritt erledigt ist. Wenn du weißt, bei welchem Schritt er hängt, kennst du meist auch die Ursache:

SchrittWas passiert?Status und Reason, wenn es hakt
1. ScanDer ESP32 sucht den Netzwerknamen auf den 2,4-GHz-KanälenWL_NO_SSID_AVAIL (1), Reason 201
2. Authentifizierung und AnmeldungDer Router nimmt den ESP32 an oder lehnt ihn abWL_CONNECT_FAILED (4) oder WL_DISCONNECTED (6), Reason 202 oder 203
3. 4-Wege-HandshakeAus dem Passwort abgeleitete Schlüssel werden verglichenWL_DISCONNECTED (6) mit Reason 15; bei Reason 204 WL_CONNECTION_LOST (5)
4. DHCPDer Router vergibt eine IP-Adresse an den ESP32Bleibt bei WL_IDLE_STATUS (0) hängen
Nach dem VerbindenDer Router sendet regelmäßig Beacon-PaketeBleiben sie aus: WL_CONNECTION_LOST (5), Reason 200

Was die WiFi.status()-Codes bedeuten

WiFi.status() gibt einen Wert vom Typ wl_status_t zurück. Gibst du ihn direkt im seriellen Monitor aus, siehst du nur eine Zahl. Die Tabelle unten zeigt, was die Zahlen im ESP32-Arduino-Core bedeuten. Achtung: Die Werte 0 bis 6 tragen zwar dieselben Namen wie in der alten Arduino-WiFi-Bibliothek, tauchen beim ESP32 aber in etwas anderen Situationen auf. Direkt nach WiFi.begin() ist der Status zum Beispiel 6 und nicht 0; er wechselt auf 0, sobald das Board am Router angemeldet ist und auf eine IP wartet, und auf 3, wenn es eine bekommen hat.

CodeKonstanteBedeutungZuerst prüfen
0WL_IDLE_STATUSAm Router angemeldet, aber noch keine IP-AdresseEin paar Sekunden sind normal; dauert es länger, DHCP
1WL_NO_SSID_AVAILKein Netz mit diesem Namen gefundenNetzwerkname, 2,4-GHz-Band, Entfernung
2WL_SCAN_COMPLETEDEin Netzwerkscan ist abgeschlossenHat nichts mit der Verbindung zu tun
3WL_CONNECTEDVerbunden und IP-Adresse erhaltenAlles in Ordnung
4WL_CONNECT_FAILEDDer Router hat die Verbindung abgelehntPasswort, Sicherheitsmodus, MAC-Filter
5WL_CONNECTION_LOSTEine bestehende Verbindung ist abgerissenSignalstärke, Stromversorgung, Antenne
6WL_DISCONNECTEDNicht verbunden; Versuch läuft noch oder ist gescheitertDer Reason-Code
254WL_STOPPEDDie WLAN-Station ist gestoppt (Core 3.x)WiFi.mode(WIFI_STA) aufrufen
255WL_NO_SHIELDWLAN wurde noch nicht gestartet (Core 2.x)WiFi.mode() oder WiFi.begin() aufrufen
Bei einem falschen Passwort erwarten die meisten WL_CONNECT_FAILED (4), doch der ESP32 zeigt oft WL_DISCONNECTED (6) und versucht es im Hintergrund weiter. Der Grund: Viele Router lassen den Handshake bei falschem Passwort einfach in einen Timeout laufen (Reason 15). Ein weiterer Klassiker ist, WiFi.begin() in der Warteschleife immer wieder aufzurufen: Jeder Aufruf startet den laufenden Versuch neu, und das Board verbindet sich oft nie. Rufe begin() einmal auf und lies danach nur noch den Status.

Diagnose-Sketch: Status und Reason-Code im seriellen Monitor ausgeben

Der folgende Sketch versucht 20 Sekunden lang, sich zu verbinden, gibt den Statuscode bei jeder Änderung mit Namen aus und zeigt bei jedem Verbindungsabbruch den Reason-Code von ESP-IDF. Klappt die Verbindung, gibt er IP-Adresse, Gateway, Signalstärke (RSSI) und Kanal aus; in jedem Fall zeigt er außerdem die MAC-Adresse des Boards. Ersetze Netzwerkname und Passwort durch deine eigenen, lade den Sketch hoch und öffne den seriellen Monitor mit 115200 Baud. Lässt sich der Sketch gar nicht erst hochladen, lies zuerst die Anleitung zu Upload-Fehlern.

Arduino (C++)
1#include <WiFi.h>
2
3const char* WIFI_ADI   = "EvAgi_2G";    // Wi-Fi adı, büyük-küçük harfe duyarlı / network name, case-sensitive
4const char* WIFI_SIFRE = "sifre1234";   // Wi-Fi şifresi / Wi-Fi password
5
6// Durum kodunu adına çevir / turn the status code into its name
7const char* durumAdi(wl_status_t durum) {
8  switch (durum) {
9    case WL_IDLE_STATUS:     return "WL_IDLE_STATUS";
10    case WL_NO_SSID_AVAIL:   return "WL_NO_SSID_AVAIL";
11    case WL_SCAN_COMPLETED:  return "WL_SCAN_COMPLETED";
12    case WL_CONNECTED:       return "WL_CONNECTED";
13    case WL_CONNECT_FAILED:  return "WL_CONNECT_FAILED";
14    case WL_CONNECTION_LOST: return "WL_CONNECTION_LOST";
15    case WL_DISCONNECTED:    return "WL_DISCONNECTED";
16    default:                 return "WL_NO_SHIELD / WL_STOPPED";
17  }
18}
19
20// Bağlantı her koptuğunda sebep kodunu yaz / print the reason code on every disconnect
21void koptugunda(arduino_event_id_t olay, arduino_event_info_t bilgi) {
22  Serial.printf("Koptu / Disconnected, reason: %d\n", (int)bilgi.wifi_sta_disconnected.reason);
23}
24
25void setup() {
26  Serial.begin(115200);
27  delay(1000);
28  WiFi.onEvent(koptugunda, ARDUINO_EVENT_WIFI_STA_DISCONNECTED);
29  WiFi.mode(WIFI_STA);                         // istasyon modu / station mode
30  WiFi.begin(WIFI_ADI, WIFI_SIFRE);            // begin() yalnızca bir kez / call begin() only once
31
32  wl_status_t onceki = WL_NO_SHIELD;
33  unsigned long baslangic = millis();
34  while (WiFi.status() != WL_CONNECTED && millis() - baslangic < 20000) {
35    wl_status_t simdi = WiFi.status();
36    if (simdi != onceki) {                     // yalnızca değişince yaz / print only when it changes
37      Serial.printf("Durum / Status: %d %s\n", (int)simdi, durumAdi(simdi));
38      onceki = simdi;
39    }
40    delay(500);
41  }
42
43  if (WiFi.status() == WL_CONNECTED) {
44    Serial.print("Bagli / Connected, IP: ");
45    Serial.println(WiFi.localIP());
46    Serial.print("Ag gecidi / Gateway: ");
47    Serial.println(WiFi.gatewayIP());
48    Serial.printf("RSSI: %d dBm, kanal / channel: %d\n", (int)WiFi.RSSI(), (int)WiFi.channel());
49  } else {
50    wl_status_t son = WiFi.status();
51    Serial.printf("Baglanamadi / Failed, son durum / last status: %d %s\n", (int)son, durumAdi(son));
52  }
53  Serial.print("MAC: ");
54  Serial.println(WiFi.macAddress());           // MAC filtresi için / for MAC filtering
55}
56
57void loop() {}

Es ist normal, dass zuerst Durum / Status: 6 WL_DISCONNECTED erscheint. Klappt die Verbindung, wechselt der Status kurz auf 0 und dann auf 3. Bleibt er bei 1, wurde das Netz gar nicht gefunden; kommen immer wieder Zeilen wie Koptu / Disconnected, reason: 15, ist sehr wahrscheinlich das Passwort falsch. Für noch mehr Details stellst du in der Arduino IDE Werkzeuge > Core Debug Level auf Warn oder Info: Der Core schreibt dann bei jedem Abbruch auch den Namen des Grundes, zum Beispiel Reason: 201 - NO_AP_FOUND. Diese Reason-Codes begegnen dir am häufigsten:

ReasonNameWas bedeutet das?Lösung
2AUTH_EXPIREDie Authentifizierung ist abgelaufenSchwaches Signal oder ausgelasteter Router; näher ran, Router neu starten
5ASSOC_TOOMANYDie Geräteobergrenze des Routers ist erreichtUngenutzte Geräte entfernen oder das Limit erhöhen
8ASSOC_LEAVEDer ESP32 hat das Netz selbst verlassenDein Code ruft WiFi.disconnect() auf; das ist normal
154WAY_HANDSHAKE_TIMEOUTDer Passwort-Handshake wurde nicht abgeschlossenMeist falsches Passwort; Passwort und Sicherheitsmodus prüfen
200BEACON_TIMEOUTVom Router kommen keine Beacons mehrSchwaches Signal oder Spannungseinbruch; Antenne, Netzteil, setTxPower
201NO_AP_FOUNDKein Netz mit diesem Namen gefundenSSID-Schreibweise, 5-GHz-Netz, Entfernung, verstecktes Netz, Kanal 12 und 13
202AUTH_FAILDie Authentifizierung wurde abgelehntPasswort oder ein inkompatibler Sicherheitsmodus wie Enterprise
203ASSOC_FAILDer Router hat die Anmeldung abgelehntMAC-Filter oder ein Funkmodus wie nur 802.11ax
204HANDSHAKE_TIMEOUTZeitüberschreitung beim HandshakeFalsches Passwort oder sehr schwaches Signal
210, 211NO_AP_FOUND_W_COMPATIBLE_SECURITY, NO_AP_FOUND_IN_AUTHMODE_THRESHOLDNetz gefunden, aber Sicherheitsmodus inkompatibel oder unter der erlaubten Mindeststufe (Core 3.x)Router auf WPA2-Personal (AES) stellen oder die Mindeststufe mit WiFi.setMinSecurity() senken

2,4-GHz-Pflicht: Der ESP32 sieht keine 5-GHz-Netze

Der klassische ESP32, ESP32-S2, ESP32-S3, ESP32-C3 und ESP32-C6 funken nur im 2,4-GHz-Band. Ein Netz, das auf 5 GHz sendet, sehen sie beim Scan nie, und das Ergebnis ist immer WL_NO_SSID_AVAIL. Die meisten Router zu Hause senden auf beiden Bändern. Verwendet dein Router für jedes Band einen eigenen Namen (zum Beispiel MeinWLAN und MeinWLAN_5G), gib dem ESP32 immer den Namen des 2,4-GHz-Netzes. Tragen beide Bänder denselben Namen (Smart Connect, Band Steering oder Mesh-Systeme), verbindet sich der ESP32 meist problemlos mit der 2,4-GHz-Seite, weil er das 5-GHz-Signal ohnehin nicht sieht. Probleme entstehen, wenn das 2,4-GHz-Band abgeschaltet ist oder der Router Geräte auf 5 GHz drängen will: Der ESP32 verbindet sich, fliegt ein paar Sekunden später raus, und das Spiel wiederholt sich. Trenne in diesem Fall die Bänder in der Router-Oberfläche oder richte ein Gastnetz ein, das nur auf 2,4 GHz sendet.

BoardWLAN-BandHinweis
ESP32 (WROOM-32, DevKit), ESP32-S2, ESP32-S3Nur 2,4 GHz802.11 b/g/n
ESP32-C3Nur 2,4 GHzGünstige Super-Mini-Boards brauchen eventuell weniger Sendeleistung
ESP32-C6Nur 2,4 GHzUnterstützt Wi-Fi 6 (802.11ax), aber trotzdem nur auf 2,4 GHz
ESP32-C52,4 GHz und 5 GHzDer erste Dualband-Chip von Espressif
ESP8266 (NodeMCU, Wemos D1 mini, ESP-01)Nur 2,4 GHz802.11 b/g/n
Raspberry Pi Pico W und Pico 2 WNur 2,4 GHzFunkchip CYW43439
Arduino Uno R4 WiFiNur 2,4 GHzDas WLAN übernimmt der ESP32-S3 auf dem Board

Stimmt das Band und das Netz wird trotzdem nicht gefunden, prüfe die Kanal- und Modus-Einstellungen des Routers. In der Standard-Ländereinstellung des ESP32 werden die Kanäle 1 bis 11 aktiv gescannt, die Kanäle 12 und 13 dagegen nur passiv abgehört. Sichtbare Netze auf diesen Kanälen werden meist trotzdem gefunden, aber ein verstecktes Netz (SSID-Broadcast aus) auf Kanal 12 oder 13 findet der ESP32 nicht. Am sichersten stellst du den Kanal von automatisch auf fest 1, 6 oder 11. Mit einem Router, der nur 802.11ax (Wi-Fi 6) erlaubt, können sich der klassische ESP32, S2, S3 und C3 nicht verbinden; stelle den Modus auf b/g/n oder den Mischbetrieb b/g/n/ax. Bei der Sicherheit sind WPA2-Personal (AES) oder der WPA2/WPA3-Mischmodus am verträglichsten. Standardmäßig lehnt der Arduino-Core alles unterhalb von WPA2 ab (WEP und altes WPA-TKIP); musst du wirklich in ein sehr altes Netz, schreibe vor begin() WiFi.setMinSecurity(WIFI_AUTH_WEP). Bevor du Einstellungen änderst, schau mit diesem Scanner nach, was der ESP32 tatsächlich sieht:

Arduino (C++)
1#include <WiFi.h>
2
3// Güvenlik türünü yazıya çevir / turn the security type into text
4const char* guvenlikAdi(wifi_auth_mode_t tur) {
5  switch (tur) {
6    case WIFI_AUTH_OPEN:          return "Acik / Open";
7    case WIFI_AUTH_WEP:           return "WEP";
8    case WIFI_AUTH_WPA_PSK:       return "WPA";
9    case WIFI_AUTH_WPA2_PSK:      return "WPA2";
10    case WIFI_AUTH_WPA_WPA2_PSK:  return "WPA/WPA2";
11    case WIFI_AUTH_WPA3_PSK:      return "WPA3";
12    case WIFI_AUTH_WPA2_WPA3_PSK: return "WPA2/WPA3";
13    default:                      return "Diger / Other (Enterprise)";
14  }
15}
16
17void setup() {
18  Serial.begin(115200);
19  WiFi.mode(WIFI_STA);
20  WiFi.disconnect();                            // temiz tarama için bağlantıyı kes / disconnect for a clean scan
21  delay(100);
22}
23
24void loop() {
25  Serial.println("Taraniyor / Scanning...");
26  int adet = WiFi.scanNetworks();               // engelleyen tarama, 2-4 sn / blocking scan, 2-4 s
27  if (adet <= 0) {
28    Serial.println("Ag bulunamadi / No networks found");
29  }
30  for (int i = 0; i < adet; i++) {
31    Serial.printf("%2d | %-32s | %4d dBm | kanal/ch %2d | %s\n",
32                  i + 1, WiFi.SSID(i).c_str(), (int)WiFi.RSSI(i),
33                  (int)WiFi.channel(i), guvenlikAdi(WiFi.encryptionType(i)));
34  }
35  WiFi.scanDelete();                            // sonuçları bellekten sil / free the results
36  Serial.println();
37  delay(10000);                                 // 10 sn sonra yeniden tara / scan again in 10 s
38}

Taucht der Name deines Netzes gar nicht in der Liste auf, liegt das Problem vor deinem Code: Das Netz ist ein 5-GHz-Netz, versteckt, oder der ESP32 ist zu weit entfernt. Steht der Name in der Liste, sieh dir den RSSI-Wert an: -30 bis -60 dBm ist sehr gut, -60 bis -70 dBm gut; zwischen -70 und -80 dBm verbindet er sich, kann aber abreißen, und unter -80 dBm solltest du keine stabile Verbindung erwarten. Siehst du denselben Namen mehrmals, hat dein Router oder Mesh-System mehrere Zugangspunkte. Beim standardmäßigen Schnellscan verbindet sich der ESP32 mit dem ersten Treffer; soll er das stärkste Signal wählen, füge vor begin() WiFi.setScanMethod(WIFI_ALL_CHANNEL_SCAN) ein. Wenn du den Namen genau so aus dem Scan kopierst und in den Sketch einfügst, sind Tippfehler endgültig vom Tisch.

Fehler bei Netzwerkname (SSID) und Passwort

Meldet der Diagnose-Sketch Reason 201 oder 15, steckt das Problem meist in zwei Zeilen deines Codes. Eine SSID darf bis zu 32 Byte lang sein, ein WPA2-Passwort 8 bis 63 Zeichen, und beide unterscheiden Groß- und Kleinschreibung. Diese Fehler werden am häufigsten übersehen:

  • Groß- und Kleinschreibung: Ein Netz, das im Router als MeinWLAN erscheint, erreichst du nicht mit meinwlan. Für das Passwort gilt dieselbe Regel.
  • Unsichtbare Leerzeichen: Ein Leerzeichen am Ende von Netzwerkname oder Passwort oder ein verstecktes Zeichen, das beim Kopieren mitkommt, verhindert die Übereinstimmung.
  • Umlaute und Sonderzeichen: Buchstaben wie ä, ö, ü oder ß im Netzwerknamen speichert der Router womöglich in einer anderen Kodierung. Den Namen auf einfache Buchstaben und Ziffern zu ändern ist die sicherste Lösung.
  • Typografischer Apostroph: Auf dem iPhone ist der Hotspot-Name der Gerätename, und der enthält oft ein gebogenes ’ statt des geraden ' deiner Tastatur, sodass der Name im Code nicht passt.
  • Backslash und Anführungszeichen: Enthält das Passwort \ oder ", schreibe sie im C++-String als \\ und \"; sonst verändert der Compiler das Passwort oder der Sketch lässt sich nicht kompilieren.
  • Offenes Netz: Für ein Netz ohne Passwort lässt du den Passwort-Parameter ganz weg; WiFi.begin(name) genügt. Gibst du für ein offenes Netz ein Passwort an, sucht der Core nach WPA2 und findet das Netz nicht.
  • Verstecktes Netz: Netze mit abgeschaltetem SSID-Broadcast erreichst du mit dem exakten Namen, aber im Scan tauchen sie nicht auf; hast du Probleme, schalte den Broadcast während des Tests ein.
Bevor du am Passwort herumprobierst, kläre, ob das Problem beim Namen oder beim Passwort liegt. Kommt Reason 201, wurde das Netz nie gefunden und das Passwort zu ändern bringt nichts. Kommt Reason 15, 202 oder 204, wurde das Netz gefunden, aber Passwort oder Sicherheitsmodus wurden nicht akzeptiert.

Stromversorgung und Brownout: Warum startet das Board neu, sobald das WLAN angeht?

Ein ESP32-Modul zieht im Betrieb durchschnittlich etwa 80 mA, doch während der WLAN-Sender arbeitet, steigt der Strom kurzzeitig auf Spitzen von 250–400 mA. Die größten Spitzen treten meist bei der Funkkalibrierung beim Start und beim ersten Verbinden auf. Deshalb empfiehlt Espressif ein Netzteil, das mindestens 500 mA liefern kann. Kommt die Versorgung bei diesen Spitzen nicht mit, bricht die 3,3-V-Schiene kurz ein, der Brownout-Detektor des Chips greift, und das Board startet mit der Meldung Brownout detector was triggered im seriellen Monitor neu. Das Symptom kennt fast jeder: Der Code läuft bis zur WLAN-Zeile, bei WiFi.begin() setzt sich das Board zurück, und daraus wird eine Endlosschleife. Alle Details zu diesem Fehler findest du im Artikel über ESP32-Brownout- und Guru-Meditation-Fehler.

AMS1117 3,3-V-Spannungsregler
AMS1117: Dieser Regler macht auf den meisten ESP32-Entwicklungsboards aus 5 V die 3,3 V. Er braucht etwa 1,1–1,3 V Unterschied zwischen Ein- und Ausgang, um sauber zu arbeiten.
StromquelleGeeignet?Warum?
USB-Port hinten am Computer, kurzes und dickes KabelMeist jaEin USB-2.0-Port liefert 500 mA; ein kurzes Kabel verringert den Spannungsabfall
USB an der Gehäusefront, USB-Hub oder langes dünnes KabelKann Probleme machenKabel- und Kontaktwiderstand drücken die Spannung bei Stromspitzen
5-V-Handynetzteil mit mindestens 1 AJaLässt reichlich Reserve für Stromspitzen
3.3V-Pin des Arduino UnoNeinDieser Pin liefert nur etwa 50 mA
3,7-V-Li-Ion-Akku direkt am 5V-Pin des BoardsNeinWegen des Spannungsabfalls am AMS1117 sinkt der Ausgang unter 3 V
Li-Ion-Akku mit 5-V-Aufwärtswandler oder Low-Dropout-3,3-V-ReglerJaLiefert stabile 3,3 V, auch wenn der Akku leerer wird
3,3-V-Ausgang eines MB102-Breadboard-NetzteilmodulsMeist jaMit einem Netzteil mit genug Strom speisen und einen Kondensator ergänzen
Setze bei WLAN-Projekten einen 100–470 µF-Elektrolytkondensator zwischen die Pins 3V3 und GND, so nah wie möglich am Board, und daneben einen 100-nF-Keramikkondensator. Das lange Bein (+) des Elkos kommt an 3V3, die Seite mit dem Streifen auf dem Gehäuse an GND; ein verpolter Elko wird heiß und kann platzen. Wie Kondensatoren funktionieren, liest du in Was ist ein Kondensator?, wie du dein Board richtig versorgst, in der Anleitung zur Arduino-Stromversorgung.

Die setTxPower-Lösung: Sendeleistung reduzieren

Auf manchen Boards sieht der ESP32 trotz gutem Netzteil das Netz, kann sich aber nicht verbinden, oder die Verbindung bricht ständig ab. Vor allem bei günstigen ESP32-C3-Super-Mini-Boards und manchen ESP32-Klonen kommen Antennenschaltung und Spannungsregler bei maximaler Sendeleistung an ihre Grenzen. Standardmäßig sendet der ESP32 mit etwa 19,5–20 dBm. Diese Leistung mit WiFi.setTxPower() zu senken, verkleinert die Stromspitzen und repariert die Verbindung auf diesen Boards oft sofort. Rufe den Befehl direkt nach WiFi.begin() auf; vor dem Start des WLANs, also vor WiFi.mode() oder begin(), wirkt er nicht.

KonstanteLeistungWann verwenden?
WIFI_POWER_19_5dBm19,5 dBmNahe am Standard; größte Reichweite
WIFI_POWER_15dBm15 dBmErster Versuch bei leichten Problemen
WIFI_POWER_11dBm11 dBmReicht meist, wenn der Router im selben Raum steht
WIFI_POWER_8_5dBm8,5 dBmDer am häufigsten empfohlene Wert für den ESP32-C3 Super Mini
WIFI_POWER_5dBm5 dBmFür Tests direkt neben dem Router

Jede Absenkung um 3 dB halbiert die Sendeleistung, entsprechend sinkt auch die Reichweite. Beginne mit 15 dBm; besteht das Problem weiter, gehe auf 11 und dann auf 8,5 dBm herunter. Behebt die geringere Leistung das Problem, sind meist Netzteil oder Antennendesign die eigentliche Ursache; ergänze deshalb langfristig auch eine bessere Versorgung und einen Kondensator. Die aktuelle Einstellung liest du mit WiFi.getTxPower() aus; der Wert ist in Schritten von 0,25 dBm angegeben, 78 bedeutet also 19,5 dBm.

Sketch für automatisches Wiederverbinden

Der ESP32 verliert die Verbindung, wenn der Router neu startet, der Strom nach einem Ausfall zurückkommt oder das Signal eine Weile schwächelt. Im ESP32-Core ist WiFi.setAutoReconnect(true) standardmäßig aktiv, und nach den meisten Abbrüchen verbindet sich das Board von selbst neu. Bei manchen Gründen wie 202 AUTH_FAIL gibt der Core jedoch nach einem einzigen Versuch auf, und das Board bleibt offline, bis du es zurücksetzt. In einem Projekt, das monatelang laufen soll, solltest du deshalb eine eigene Prüfung einbauen. Der folgende Sketch kommt ohne delay() aus, prüft mit millis() alle 15 Sekunden die Verbindung, verbindet bei Bedarf neu und startet das Board neu, wenn 5 Minuten lang keine Verbindung zustande kommt:

Arduino (C++)
1#include <WiFi.h>
2
3const char* WIFI_ADI   = "EvAgi_2G";    // Wi-Fi adı / network name
4const char* WIFI_SIFRE = "sifre1234";   // Wi-Fi şifresi / Wi-Fi password
5
6const unsigned long KONTROL_ARALIGI = 15000;  // 15 sn'de bir kontrol / check every 15 s
7const int EN_FAZLA_DENEME = 20;               // 20 x 15 sn = 5 dk / 20 x 15 s = 5 min
8unsigned long sonKontrol = 0;
9int basarisizSayac = 0;                       // üst üste başarısız kontrol / consecutive failed checks
10
11void wifiBaslat() {
12  WiFi.mode(WIFI_STA);
13  WiFi.setAutoReconnect(true);                // çekirdeğin kendi yeniden bağlanması / core auto-reconnect
14  WiFi.begin(WIFI_ADI, WIFI_SIFRE);
15  WiFi.setTxPower(WIFI_POWER_15dBm);          // gerekirse 8_5dBm'e kadar düşür / lower to 8_5dBm if needed
16  WiFi.setSleep(false);                       // modem uykusunu kapat / disable modem sleep
17}
18
19void setup() {
20  Serial.begin(115200);
21  wifiBaslat();
22}
23
24void loop() {
25  if (millis() - sonKontrol >= KONTROL_ARALIGI) {
26    sonKontrol = millis();
27    if (WiFi.status() == WL_CONNECTED) {
28      basarisizSayac = 0;
29      Serial.printf("Bagli / Connected, IP: %s, RSSI: %d dBm\n",
30                    WiFi.localIP().toString().c_str(), (int)WiFi.RSSI());
31    } else {
32      basarisizSayac++;
33      Serial.printf("Bagli degil / Not connected (%d/%d), yeniden baglaniyor / reconnecting\n",
34                    basarisizSayac, EN_FAZLA_DENEME);
35      WiFi.disconnect();
36      WiFi.reconnect();
37      if (basarisizSayac >= EN_FAZLA_DENEME) {
38        Serial.println("Yeniden baslatiliyor / Restarting");
39        delay(100);
40        ESP.restart();                        // son çare: kartı yeniden başlat / last resort: restart the board
41      }
42    }
43  }
44
45  // Projenin kodu buraya; uzun delay() kullanma / your project code here; avoid long delay()
46}

Die Zeile WiFi.setSleep(false) schaltet den Modem-Sleep ab, bei dem der ESP32 sein Funkmodul im verbundenen Zustand in kurzen Abständen ausschaltet. Das verringert Abbrüche an manchen Routern und Verzögerungen beim Webserver; dafür zieht das Board einige zehn mA mehr. In Akkuprojekten kannst du die Zeile löschen und mit dem Rechner Akkulaufzeit ausrechnen, wie lange der Akku hält. Die setTxPower-Zeile behältst du nur, wenn du die Probleme aus dem vorherigen Abschnitt hast. Vermeide lange delay()-Aufrufe, wenn du deinen Projektcode in loop() einfügst, denn die Verbindungsprüfung läuft nur, solange loop() durchläuft. Willst du die WLAN-Zugangsdaten lieber per Handy eingeben statt sie fest einzuprogrammieren, sieh dir die Bibliothek WiFiManager an.

Statische IP-Adresse am ESP32 einstellen

Normalerweise vergibt der Router dem ESP32 per DHCP eine Adresse, die sich jedes Mal ändern kann. Baust du einen Webserver, den du vom Handy aus immer unter derselben Adresse aufrufst, oder spinnt der DHCP des Routers (der Status bleibt bei 0 hängen), macht eine statische IP das Leben leichter. Beachte drei Regeln: WiFi.config() muss vor WiFi.begin() aufgerufen werden; die gewählte Adresse muss im Netz des Routers, aber außerhalb seines DHCP-Bereichs liegen (vergibt der Router 192.168.1.2–100, nimm zum Beispiel 192.168.1.200; bei einer FRITZ!Box lauten die Adressen meist 192.168.178.x); und das Gateway ist die Adresse des Routers selbst. Um die Adresse deines Routers herauszufinden, lass den Diagnose-Sketch einmal mit DHCP laufen; er gibt auch das Gateway aus.

Arduino (C++)
1#include <WiFi.h>
2
3const char* WIFI_ADI   = "EvAgi_2G";      // Wi-Fi adı / network name
4const char* WIFI_SIFRE = "sifre1234";     // Wi-Fi şifresi / Wi-Fi password
5
6IPAddress sabitIP(192, 168, 1, 200);      // DHCP havuzunun dışında bir adres / an address outside the DHCP pool
7IPAddress agGecidi(192, 168, 1, 1);       // modemin adresi / router address
8IPAddress altAgMaskesi(255, 255, 255, 0); // alt ağ maskesi / subnet mask
9IPAddress dns1(1, 1, 1, 1);               // birinci DNS / primary DNS
10IPAddress dns2(8, 8, 8, 8);               // ikinci DNS / secondary DNS
11
12void setup() {
13  Serial.begin(115200);
14  WiFi.mode(WIFI_STA);
15  // config() mutlaka begin()'den önce / config() must come before begin()
16  if (!WiFi.config(sabitIP, agGecidi, altAgMaskesi, dns1, dns2)) {
17    Serial.println("Statik IP ayarlanamadi / Static IP config failed");
18  }
19  WiFi.begin(WIFI_ADI, WIFI_SIFRE);
20
21  unsigned long baslangic = millis();
22  while (WiFi.status() != WL_CONNECTED && millis() - baslangic < 15000) {
23    delay(500);
24    Serial.print('.');
25  }
26  Serial.println();
27  Serial.print("IP: ");
28  Serial.println(WiFi.localIP());             // 192.168.1.200 olmalı / should be 192.168.1.200
29}
30
31void loop() {}
Beim ESP32 lautet die Reihenfolge der Parameter IP, Gateway, Subnetzmaske, DNS1, DNS2 und unterscheidet sich damit von manchen Arduino-WiFi-Bibliotheken (IP, DNS, Gateway, Subnetz). Vertauschst du die Reihenfolge, verbindet sich der ESP32 zwar mit dem Netz, kommt aber nicht ins Internet. Trage auch die DNS-Adressen ein: Funktioniert DNS nicht, taucht der ESP32 zwar im Router auf, kann aber keine Domainnamen auflösen und erreicht deshalb Dienste wie Wetter-APIs, NTP oder Telegram nicht. Dieselbe IP an zwei Geräte zu vergeben, lässt beide Verbindungen zufällig abreißen.

Schul- und Firmennetze: Verbindung mit WPA2-Enterprise (eduroam)

eduroam an Hochschulen, Firmennetze und manche Schulnetze nutzen WPA2-Enterprise (802.1X), das jedem Nutzer einen eigenen Benutzernamen und ein eigenes Passwort gibt statt eines gemeinsamen Passworts. Ein normales WiFi.begin(name, passwort) scheitert in diesen Netzen immer, und im Scanner erscheint ihr Sicherheitstyp als Diger / Other (Enterprise). Die Versionen 2.x und 3.x des ESP32-Arduino-Cores bieten eine fertige begin()-Variante für PEAP, das verbreitetste Verfahren:

Arduino (C++)
1#include <WiFi.h>
2
3const char* AG_ADI        = "eduroam";               // kurum ağının adı / enterprise network name
4const char* EAP_KIMLIK    = "[email protected]";   // kimlik, çoğu zaman kullanıcı adıyla aynı / identity, usually same as username
5const char* EAP_KULLANICI = "[email protected]";   // kullanıcı adı / username
6const char* EAP_SIFRE     = "kurum_sifren";          // kurum şifresi / enterprise password
7
8void setup() {
9  Serial.begin(115200);
10  WiFi.disconnect(true);                              // önceki bağlantıyı kapat / close any previous connection
11  WiFi.mode(WIFI_STA);
12  // PEAP (MSCHAPv2) ile bağlan, CA doğrulaması yok / connect with PEAP (MSCHAPv2), no CA check
13  WiFi.begin(AG_ADI, WPA2_AUTH_PEAP, EAP_KIMLIK, EAP_KULLANICI, EAP_SIFRE);
14
15  unsigned long baslangic = millis();
16  while (WiFi.status() != WL_CONNECTED && millis() - baslangic < 30000) {
17    delay(500);
18    Serial.print('.');
19  }
20  Serial.println();
21  if (WiFi.status() == WL_CONNECTED) {
22    Serial.print("Bagli / Connected, IP: ");
23    Serial.println(WiFi.localIP());
24  } else {
25    Serial.printf("Baglanamadi / Failed, durum / status: %d\n", (int)WiFi.status());
26  }
27}
28
29void loop() {}

An den meisten Einrichtungen ist die Identität (identity) gleich dem Benutzernamen; manche verlangen eine anonyme äußere Identität wie [email protected]. Dieser Sketch prüft das Serverzertifikat (CA) nicht: Die Verbindung funktioniert, aber ein gefälschter Zugangspunkt könnte dein Passwort abgreifen. Frage deshalb die IT-Abteilung, bevor du dein persönliches Passwort auf einen ESP32 schreibst, und bitte möglichst um ein Konto oder Netz für Geräte. Verlangt deine Einrichtung ein Zertifikat, übergibst du die CA-Datei als sechsten Parameter von begin(). Netze, die im Browser eine Anmeldeseite öffnen (Captive Portals), etwa in Hotels, Wohnheimen und Cafés, sind ein eigenes Problem, denn der ESP32 kann diese Seite nicht ausfüllen. Manche Schulen verlangen außerdem, dass die MAC-Adressen von Geräten vorab registriert werden; schicke der IT die MAC-Adresse, die der Diagnose-Sketch ausgibt. In solchen Netzen ist der Hotspot deines Handys oder ein kleiner mobiler Router die praktischste Lösung.

Handy-Hotspot-Test: Liegt es am Router oder am ESP32?

Am schnellsten grenzt du die Ursache ein, indem du den ESP32 mit einem Netz verbindest, dessen Einstellungen du komplett selbst bestimmst. Der Hotspot deines Handys ist dafür ideal:

  1. Gib dem Hotspot einen kurzen Namen nur aus einfachen Buchstaben und Ziffern (zum Beispiel esptest) und ein schlichtes Passwort mit mindestens 8 Zeichen (zum Beispiel test12345).
  2. Stelle unter Android in den Einstellungen des mobilen Hotspots die Band-Option (bei manchen Handys AP-Band oder Geschwindigkeit und Kompatibilität) auf 2,4 GHz und wähle WPA2-Personal als Sicherheitstyp.
  3. Schalte auf dem iPhone unter Einstellungen > Persönlicher Hotspot die Option Zugriff für andere erlauben ein. Bei neueren Modellen aktivierst du zusätzlich Kompatibilität maximieren; damit wechselt der Hotspot auf 2,4 GHz. Der Hotspot-Name ist der Gerätename; vereinfache ihn unter Einstellungen > Allgemein > Info > Name und lass den Bildschirm Persönlicher Hotspot geöffnet, bis sich der ESP32 verbunden hat.
  4. Ersetze Netzwerkname und Passwort im Diagnose-Sketch durch die Hotspot-Daten, lege das Handy 1–2 Meter vom ESP32 entfernt hin und lade den Sketch hoch.
  5. Lies die Status- und Reason-Codes im seriellen Monitor und probiere denselben Sketch danach mit den Daten deines Heimrouters.

So deutest du das Ergebnis: Verbindet sich der ESP32 mit dem Hotspot, aber nicht mit deinem Heimrouter, sind Code, Board und Stromversorgung in Ordnung; das Problem liegt bei Band, Kanal, Sicherheit, MAC-Filter oder Geräteobergrenze des Routers. Klappt es auch mit dem Hotspot nicht, liegt das Problem beim ESP32: Tausche Netzteil und Kabel, senke die Leistung mit setTxPower, sorge dafür, dass kein Metall vor der Antenne ist, und prüfe den Code erneut. Der Hotspot-Test ist außerdem der schnellste Beweis, dass ein Projekt, das sich in der Schule nicht verbindet, eigentlich funktioniert.

WLAN-Test mit dem Raspberry Pi Pico W und MicroPython

Auch der Raspberry Pi Pico W und der Pico 2 W unterstützen nur 2,4 GHz; alle Tipps in diesem Artikel zu Band, Passwort, Stromversorgung und Hotspot gelten auch für diese Boards. In MicroPython liest du die Statuscodes über Konstanten aus dem Modul network. Das folgende Skript läuft unverändert in Thonny auf dem ESP32 und dem Pico W. Auf dem Pico W hört es sofort auf zu warten, wenn das Netz nicht gefunden wird oder das Passwort falsch ist; auf dem ESP32 versucht MicroPython es bei manchen Fehlern weiter, deshalb gibt das Skript dort nach 20 Sekunden den letzten Status aus:

Python
1import network, time
2
3AG_ADI = "EvAgi_2G"       # Wi-Fi adı / network name
4SIFRE = "sifre1234"       # Wi-Fi şifresi / Wi-Fi password
5
6wlan = network.WLAN(network.STA_IF)
7wlan.active(True)
8if wlan.isconnected():
9    wlan.disconnect()     # eski bağlantıyı kapat / close the previous connection
10    time.sleep(1)
11wlan.connect(AG_ADI, SIFRE)
12
13durum = wlan.status()
14for saniye in range(20):  # en fazla 20 sn bekle / wait up to 20 s
15    durum = wlan.status()
16    print(saniye, "durum / status:", durum)
17    if durum in (network.STAT_GOT_IP, network.STAT_NO_AP_FOUND, network.STAT_WRONG_PASSWORD):
18        break             # sonuç belli, beklemeyi bırak / result is known, stop waiting
19    time.sleep(1)
20
21if durum == network.STAT_GOT_IP:
22    print("Bagli / Connected, IP:", wlan.ifconfig()[0])
23    print("RSSI:", wlan.status("rssi"), "dBm")
24elif durum == network.STAT_NO_AP_FOUND:
25    print("Ag bulunamadi / Network not found (SSID, 2.4 GHz)")
26elif durum == network.STAT_WRONG_PASSWORD:
27    print("Sifre yanlis / Wrong password")
28else:
29    print("Baglanamadi / Failed, durum / status:", durum)

Auf dem Pico W sind die Zahlenwerte anders: 3 bedeutet verbunden mit IP, 2 verbunden, aber wartet auf eine IP, -1 allgemeiner Fehler, -2 Netz nicht gefunden und -3 falsches Passwort. Auf dem ESP32 siehst du stattdessen 1001 während des Verbindens, 1010 mit IP und bei Problemen ESP-IDF-Reason-Codes wie 201 und 202. Um Probleme mit Kanal 12 und 13 auf dem Pico W zu vermeiden, setze vor dem Verbinden den Ländercode (rp2.country('DE'), bei neuerer Firmware network.country('DE')); reißt die Verbindung ab und zu ab, kannst du den Energiesparmodus mit wlan.config(pm=0xa11140) abschalten. Wie du mit dem Pico W einen Webserver baust, zeigt der Artikel Pico W WLAN-Webserver; bist du neu bei MicroPython, wirf einen Blick auf die Anleitung MicroPython-Grundlagen.

Häufige Fehler und Lösungen

SymptomMögliche UrsacheLösung
Wirre Zeichen im seriellen MonitorBaudrate passt nichtSeriellen Monitor auf 115200 Baud stellen
Status 1, Reason 201Falscher Netzwerkname, 5-GHz-Netz oder zu weit wegScanner laufen lassen und den Namen des 2,4-GHz-Netzes exakt kopieren
Status 6, immer wieder Reason 15Falsches PasswortPasswort neu eintippen und auf Groß-/Kleinschreibung und Sonderzeichen achten
Status 4 oder 6; Reason 202, 210 oder 211Inkompatibler SicherheitsmodusRouter auf WPA2-Personal (AES) oder WPA2/WPA3-Mischmodus stellen
Hängt bei Status 0Am Router angemeldet, bekommt aber keine IP per DHCPRouter neu starten, DHCP-Bereich vergrößern oder statische IP nutzen
Reset bei WiFi.begin() mit Brownout detector was triggeredDas Netzteil schafft die Stromspitzen nichtKurzes Kabel, Netzteil mit mindestens 1 A, 470 µF zwischen 3V3 und GND
Verbindet sich, bricht nach ein paar Minuten ab (Reason 200)Schwaches Signal, Modem-Sleep oder StromproblemsetSleep(false), setTxPower, Reconnect-Sketch, näher an den Router
Auf dem Tisch klappt es, im Gehäuse nichtMetallgehäuse oder Akku vor der AntenneAntenne an den Gehäuserand nach außen legen, Kunststoffgehäuse verwenden
Verbunden, aber die Webseite öffnet sich am Handy nichtHandy ist in einem anderen Netz oder das Gastnetz isoliert die GeräteBeide ins selbe Netz bringen, IP im seriellen Monitor ablesen
analogRead()-Werte spinnen bei aktivem WLANSensor hängt an einem ADC2-Pin, und ADC2 nutzt das WLANSensor auf die ADC1-Pins GPIO 32–39 umlegen
Nur wenige Zentimeter Reichweite bei ESP32-CAM oder Board mit externer AntenneAntennenwahl steht auf extern, aber keine Antenne angeschlossenAntenne an die IPEX-Buchse stecken oder den 0-Ω-Antennenwahl-Widerstand auf dem Board prüfen
Halte bei der Fehlersuche die Reihenfolge ein: Kläre zuerst mit dem Hotspot-Test, ob es am Router oder am Board liegt, prüfe dann mit dem Scanner, ob das Netz sichtbar ist, lies danach Status und Reason-Code aus dem Diagnose-Sketch und gehe erst zum Schluss an Stromversorgung und Router-Einstellungen. Ändere immer nur eine Sache auf einmal. Hast du deine Pinwahl im Verdacht, zeigt dir das Tool Pinout die Pinbelegung deines Boards; nutzt du eine ESP32-CAM, findest du Details zur Antenne im Artikel ESP32-CAM.

Verbunden: Was kannst du jetzt bauen?

  • Webserver und Live-Dashboard: Baue einen ESP32-Webserver mit WebSocket, der Sensorwerte in Echtzeit auf dem Handy zeigt.
  • Internet-Uhr: Hole die Uhrzeit von einem NTP-Server und zeige sie auf einem Display an.
  • Wetteranzeige: Rufe Temperatur und Luftfeuchtigkeit deiner Stadt über eine Wetter-API ab.
  • Benachrichtigungen aufs Handy: Schicke eine Nachricht über einen Telegram-Bot, sobald die Tür aufgeht.
  • Smart Home: Binde den ESP32 per MQTT in Home Assistant ein.
  • Kommunikation ohne Router: Lass zwei ESP32 per ESP-NOW miteinander reden, ohne ein Netz zu betreten.
  • Kabelloses Hochladen: Ist das Board erst im Gehäuse verbaut, spielst du neuen Code per OTA-Update über das WLAN auf.

Ein ESP32, der sich nicht mit dem WLAN verbindet, verwirrt zunächst, doch Status- und Reason-Code verraten dir immer, in welchem Schritt das Problem liegt: 1 und 201 heißen, dass das Netz nicht gefunden wurde, 15 und 202 deuten auf Passwort oder Sicherheitsmodus, 0 auf DHCP, und 200 oder plötzliche Resets auf Signal oder Stromversorgung. Bist du neu beim ESP32, findest du die Grundlagen im Artikel Was ist der ESP32?. In der BlueGrays-App kannst du außerdem Projekte wie ESP32-WLAN-Verbindung, Webserver, mDNS, NTP-Uhr, Wetterstation, OTA-Update und Telegram-Alarm mit Schritt-für-Schritt-Schaltplänen und fertigem Code entdecken.

Häufige Fragen

Warum verbindet sich mein ESP32 nicht mit dem WLAN?

Die häufigsten Ursachen sind ein 5-GHz-Netz, ein Tippfehler in Netzwerkname oder Passwort, ein schwaches Netzteil, dessen Spannung beim WLAN-Start einbricht, und die Sicherheitseinstellungen des Routers. Gib den Wert von WiFi.status() und den Reason-Code beim Verbindungsabbruch aus, dann siehst du sofort, was davon zutrifft. Wird das Netz nicht gefunden, siehst du 1 und 201, bei falschem Passwort meist 6 und 15.

Kann sich der ESP32 mit 5-GHz-WLAN verbinden?

Der klassische ESP32, ESP32-S2, S3, C3 und C6 unterstützen nur 2,4 GHz und sehen 5-GHz-Netze beim Scan überhaupt nicht. Das Dualband-Modell ist der ESP32-C5. Sendet dein Router beide Bänder unter getrennten Namen, gib dem ESP32 den Namen des 2,4-GHz-Netzes.

Was bedeutet WiFi.status() 6 beim ESP32?

6 steht für WL_DISCONNECTED: Das Board ist nicht verbunden, und der Verbindungsversuch läuft entweder noch oder ist gescheitert. Beim ESP32 liefert ein falsches Passwort oft diesen Wert statt 4 (WL_CONNECT_FAILED). Die eigentliche Ursache zeigt der Reason-Code im Ereignis ARDUINO_EVENT_WIFI_STA_DISCONNECTED.

Warum verliert mein ESP32 ständig die WLAN-Verbindung?

Die Hauptursachen für ständige Abbrüche sind ein schwaches Signal, ein Netzteil, das die WLAN-Stromspitzen nicht schafft, Metall oder ein Akku vor der Antenne und die Band-Steering-Einstellungen des Routers. Bring das Board näher an den Router, setze einen 100–470-µF-Kondensator zwischen 3V3 und GND und schalte den Modem-Sleep mit WiFi.setSleep(false) ab. Schreibe deinen Code außerdem so, dass er sich nach einem Abbruch selbst wieder verbindet.

Kann sich ein ESP32 mit einem Handy-Hotspot verbinden?

Ja, solange der Hotspot auf 2,4 GHz sendet. Stelle unter Android das Hotspot-Band auf 2,4 GHz, aktiviere auf dem iPhone Kompatibilität maximieren und halte den Hotspot-Namen einfach. Der Hotspot-Test ist der schnellste Weg, um herauszufinden, ob das Problem beim Heimrouter oder beim ESP32 liegt.

Kann sich ein ESP32 mit eduroam oder einem Schulnetz verbinden?

Mit WPA2-Enterprise-Netzen wie eduroam verbindet sich der ESP32 über die Variante WiFi.begin(name, WPA2_AUTH_PEAP, identity, benutzer, passwort) des ESP32-Arduino-Cores. In Netzen, die im Browser eine Anmeldeseite öffnen (Captive Portal), kann der ESP32 diese Seite dagegen nicht ausfüllen. Frag am besten vorher die IT-Abteilung und bitte nach Möglichkeit um ein eigenes Konto für Geräte.

Alle Projekte ansehen
ESP32-WLAN-STA-Verbindung (mit LCD-Display)
#127Fortgeschritten
Premium

ESP32-WLAN-STA-Verbindung (mit LCD-Display)

In diesem Projekt verbinden wir den ESP32 im Station-Modus (STA) sicher und fehlertolerant mit dem heimischen WLAN. Wir lagern SSID und Passwort in eine separate `secrets.h`-Datei aus, um Leaks zu Git zu verhindern, richten einen Auto-Reconnect-Mechanismus ein und zeigen RSSI-Signalpegel und IP-Adresse auf einem I2C-LCD-Display an. Die interne LED dient als Statusanzeige. Ein Verbindungsmanager auf Produktionsniveau.

4.4(21)
33
ESP32 Async-Webserver (mit IP-Anzeige auf dem LCD)
#129Fortgeschritten
Premium

ESP32 Async-Webserver (mit IP-Anzeige auf dem LCD)

In diesem Projekt verwandeln wir den ESP32 in einen **asynchronen Webserver**, den Sie über Ihr Smartphone oder Ihren Computer im selben WLAN-Netzwerk steuern können. Dank der ESPAsyncWebServer-Bibliothek kann der Server mehrere Anfragen gleichzeitig bearbeiten (im Gegensatz zum klassischen `WebServer.h`, der bei einer einzigen Anfrage blockiert). Sie können über den Browser die IP-Adresse des ESP32 öffnen und durch Drücken der ON/OFF-Schaltflächen (Routen `/on` und `/off`) die an GPIO 5 anges

4.8(16)
26
ESP32 mDNS: Zugriff auf das Gerät über „bluegrays-esp.local“ (mit LCD-Display)
#131Fortgeschritten
Premium

ESP32 mDNS: Zugriff auf das Gerät über „bluegrays-esp.local“ (mit LCD-Display)

In diesem Projekt fügen wir dem ESP32 einen mDNS-Dienst (Multicast DNS) hinzu, um den Zugriff nicht über eine IP-Adresse, sondern über einen lesbaren Hostnamen wie `bluegrays-esp.local` zu ermöglichen. Selbst wenn sich die vom DHCP zugewiesene IP-Adresse ändert, können Sie das Gerät immer unter demselben Namen erreichen. Indem wir zusätzlich einen kleinen Webserver darauf betreiben, senden wir über den Browser unter der Adresse `http://bluegrays-esp.local/` Befehle zur LED-Steuerung. Auf dem I2C

4.8(14)
23
ESP32: Echtzeit aus dem Internet per NTP
#128Fortgeschritten
Premium

ESP32: Echtzeit aus dem Internet per NTP

Der ESP32 verbindet sich mit dem WLAN und ruft die Echtzeit mit Millisekunden-Genauigkeit von NTP-Servern (Network Time Protocol) ab. Dank `configTzTime()` wird die türkische Zeitzone (TRT, UTC+3) automatisch angewendet, und der DST-Wechsel wird per POSIX-TZ-String verwaltet. Die Uhrzeit wird auf dem Serial Monitor und einem optionalen I2C-LCD ausgegeben. `configTzTime()` startet den SNTP-Dienst; bei verfügbarem Netzwerkzugang erfolgt regelmäßig eine erneute Synchronisierung, und zwischen den Sy

4.5(13)
21
ESP32 HTTPClient + Wetter-API (mit LCD-Display)
#133Fortgeschritten
Premium

ESP32 HTTPClient + Wetter-API (mit LCD-Display)

In diesem Projekt führen wir mit dem ESP32 über das Internet mithilfe von `HTTPClient.h` einen REST-API-Aufruf an die Wetter-API (wttr.in) durch. Mit ArduinoJson v7 analysieren wir die zurückgegebenen JSON-Daten und zeigen Informationen zu Stadt, Temperatur, Luftfeuchtigkeit, Wetter und Wind sowohl auf Türkisch als auch auf Englisch auf einem I2C-LCD-Display an. wttr.in ist kostenlos und erfordert keinen API-Schlüssel – Sie können den aktuellen Wetterbericht einer beliebigen Stadt abrufen, indem

4.7(13)
20
ESP32-OTA-Update – Drahtlose Firmware-Installation (mit LCD-Display)
#132Fortgeschritten
Premium

ESP32-OTA-Update – Drahtlose Firmware-Installation (mit LCD-Display)

In diesem Projekt lernst du, wie du auf dem ESP32 ohne USB-Kabel über WLAN neue Firmware installieren kannst. Mit der `ArduinoOTA`-Bibliothek wird der ESP32 im Netzwerk sichtbar und wird im Reiter „Network port“ der Arduino-IDE automatisch als `bluegrays-ota` aufgelistet. Die erste Installation erfolgt über USB, alle nachfolgenden Updates erfolgen drahtlos – eine äußerst wichtige Funktion für Feldgeräte. Auf dem I2C-LCD-Display werden der WLAN-Status, die IP-Adresse, der Hostname, der Fortschrit

4.6(14)
22
ESP32-WebSocket-Zähler (2 Tasten + LCD + Web-Echtzeit)
#130Fortgeschritten
Premium

ESP32-WebSocket-Zähler (2 Tasten + LCD + Web-Echtzeit)

In diesem Projekt ändern zwei am ESP32 angeschlossene Taster (GPIO 5 zählt hoch, GPIO 4 zählt herunter) einen Zähler. Der Wert wird sofort auf einem 16x2-I2C-LCD und über die WebSocket-Unterstützung von ESPAsyncWebServer in allen verbundenen Browsern aktualisiert, ohne die Seite neu zu laden. Statt HTTP-Polling wird eine einzige dauerhafte Verbindung genutzt; der ESP32 sendet den neuen Wert mit ws.textAll() an alle.

4.5(14)
23
ESP32 Bewegungsalarmsystem (PIR + Buzzer + LED + Telegram)
#145Fortgeschritten
Premium

ESP32 Bewegungsalarmsystem (PIR + Buzzer + LED + Telegram)

Ein intelligentes Sicherheitsalarmsystem, das Buzzer und LED aktiviert, sobald der PIR-Sensor Bewegung erkennt, und gleichzeitig eine sofortige Benachrichtigung per Telegram an den Besitzer sendet. Ein 30-sekündiger Cooldown begrenzt die Häufigkeit wiederholter Alarme; dieser Mechanismus überprüft weder die Gültigkeit der PIR-Erkennungen noch verhindert er Fehlauslösungen. Geeignet für Heimsicherheit, Garagenüberwachung, Lagerräume oder Arbeitszimmer. Mit ESP32-CAM sind Foto-Benachrichtigungen m

0.0(0)
8