ESP32 WiFi Bağlanmıyor: WiFi.status() Kodları ve Çözümleri
ESP32 WiFi bağlanmıyor mu? WiFi.status() ve reason kodları, 2,4 GHz zorunluluğu, şifre hataları, brownout, setTxPower, statik IP ve eduroam için çözüm yolları.
ESP32 Wi-Fi'ye bağlanmıyor ve Seri Monitör'de bitmek bilmeyen noktalar mı görüyorsun? Bu sorunun sebebi neredeyse hiçbir zaman bozuk bir kart değildir. En sık rastlanan sebepler şunlardır: 5 GHz bir ağa bağlanmaya çalışmak, ağ adında ya da şifrede küçük bir yazım hatası, Wi-Fi açıldığı anda gerilimi çöken zayıf bir güç kaynağı, modemin güvenlik ve kanal ayarları, okul ya da iş yeri gibi kurumsal ağlar. İyi haber şu: ESP32 sana neyin yanlış gittiğini zaten söyler. Yeter ki WiFi.status() değerini ve bağlantı koptuğunda gelen reason (sebep) kodunu okumayı bil.
Bu rehberde önce ESP32'nin bir ağa hangi adımlarla bağlandığını ve her adımda hangi durum kodunu verdiğini göreceksin. Ardından durum ve sebep kodlarını yazdıran bir teşhis kodu, çevredeki ağları listeleyen bir tarama kodu, 2,4 GHz zorunluluğu ve çift bantlı modemler, brownout ve setTxPower çözümü, kopan bağlantıyı kendiliğinden toparlayan bir yeniden bağlanma kodu, statik IP, okul ağları için WPA2-Enterprise bağlantısı ve sorunun modemde mi yoksa kartta mı olduğunu birkaç dakikada ayıran telefon hotspot testi geliyor. Kodlar Arduino IDE'deki ESP32 çekirdeğinin 2.x ve 3.x sürümleriyle çalışır; sonda Raspberry Pi Pico W ve MicroPython için de bir test kodu bulacaksın.

ESP32 bir Wi-Fi ağına nasıl bağlanır?
WiFi.begin() çağrıldığında ESP32 arka planda dört adımı sırayla yapar. Önce kanalları tarayıp verdiğin ada (SSID) sahip ağı arar. Ağı bulursa modemle kimlik doğrulama ve ilişkilendirme (association) yapar. WPA2 ağlarda bunun ardından şifrenin doğru olup olmadığının anlaşıldığı 4 yönlü el sıkışma (4-way handshake) gelir. Son olarak modemin DHCP sunucusundan bir IP adresi ister. WiFi.status() ancak bu son adım da bittiğinde WL_CONNECTED döndürür. Hangi adımda takıldığını bilirsen sebebi de büyük ölçüde bilmiş olursun:
| Aşama | Ne olur? | Takılırsa göreceğin durum ve sebep |
|---|---|---|
| 1. Tarama | ESP32, 2,4 GHz kanallarında ağ adını arar | WL_NO_SSID_AVAIL (1), reason 201 |
| 2. Kimlik doğrulama ve ilişkilendirme | Modem ESP32'yi ağa kabul eder ya da reddeder | WL_CONNECT_FAILED (4) ya da WL_DISCONNECTED (6), reason 202 veya 203 |
| 3. 4 yönlü el sıkışma | Şifreden türetilen anahtarlar karşılaştırılır | WL_DISCONNECTED (6) ve reason 15; reason 204'te WL_CONNECTION_LOST (5) |
| 4. DHCP | Modem ESP32'ye bir IP adresi verir | WL_IDLE_STATUS (0) durumunda takılır |
| Bağlantıdan sonra | Modemden düzenli işaret (beacon) paketleri gelir | Koparsa WL_CONNECTION_LOST (5), reason 200 |
WiFi.status() kodlarının anlamı
WiFi.status(), wl_status_t türünde bir değer döndürür. Bu değeri Seri Monitör'e doğrudan yazdırırsan yalnızca bir sayı görürsün. Sayıların ESP32 Arduino çekirdeğindeki karşılıkları aşağıdaki tabloda. Dikkat et: 0 ile 6 arasındaki değerler eski Arduino WiFi kütüphanesiyle aynı adları taşısa da ESP32'de hangi durumda hangisinin geldiği biraz farklıdır. Örneğin WiFi.begin() çağrıldığı anda durum 0 değil 6'dır; modeme bağlanılıp IP beklenirken 0'a, IP alınınca 3'e geçer.
| Kod | Sabit | Anlamı | İlk bakılacak yer |
|---|---|---|---|
| 0 | WL_IDLE_STATUS | Modeme bağlandı ama henüz IP adresi almadı | Birkaç saniye sürmesi normal; uzun sürerse DHCP |
| 1 | WL_NO_SSID_AVAIL | Verdiğin adda bir ağ bulunamadı | Ağ adı, 2,4 GHz bandı, mesafe |
| 2 | WL_SCAN_COMPLETED | Ağ taraması tamamlandı | Bağlantıyla ilgisi yok |
| 3 | WL_CONNECTED | Bağlandı ve IP adresi aldı | Her şey yolunda |
| 4 | WL_CONNECT_FAILED | Modem bağlantıyı reddetti | Şifre, güvenlik modu, MAC filtresi |
| 5 | WL_CONNECTION_LOST | Kurulmuş bağlantı koptu | Sinyal gücü, güç kaynağı, anten |
| 6 | WL_DISCONNECTED | Bağlı değil; deneme sürüyor ya da başarısız oldu | Reason (sebep) kodu |
| 254 | WL_STOPPED | Wi-Fi istasyonu durdurulmuş (3.x çekirdeği) | WiFi.mode(WIFI_STA) çağrısı |
| 255 | WL_NO_SHIELD | Wi-Fi henüz başlatılmamış (2.x çekirdeği) | WiFi.mode() ya da WiFi.begin() çağrısı |
Teşhis kodu: durum ve sebep kodunu Seri Monitör'e yazdır
Aşağıdaki kod 20 saniye boyunca bağlanmayı dener, durum kodu her değiştiğinde onu adıyla birlikte yazdırır ve bağlantı her koptuğunda ESP-IDF'in verdiği sebep (reason) kodunu gösterir. Bağlanırsa IP adresini, ağ geçidini, sinyal gücünü (RSSI) ve kanal numarasını yazar; her durumda kartın MAC adresini de gösterir. Ağ adını ve şifreni kendi bilgilerinle değiştir, kodu yükle ve Seri Monitör'ü 115200 baud hızında aç. Kod karta hiç yüklenmiyorsa önce kod yüklenmiyor rehberine göz at.
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() {}Çıktıda önce Durum / Status: 6 WL_DISCONNECTED satırını görmen normaldir. Bağlantı başarılıysa durum kısa bir süre 0'a, ardından 3'e geçer. Durum 1'de kalıyorsa ağ hiç bulunamamıştır; Koptu / Disconnected, reason: 15 satırları art arda geliyorsa şifre büyük ihtimalle yanlıştır. Daha da ayrıntılı bilgi istersen Arduino IDE'de Araçlar > Core Debug Level menüsünü Warn ya da Info yap: çekirdek her kopmada Reason: 201 - NO_AP_FOUND gibi sebebin adını da yazar. En sık karşılaşacağın sebep kodları şunlardır:
| Reason | Adı | Ne anlama gelir? | Çözüm |
|---|---|---|---|
| 2 | AUTH_EXPIRE | Kimlik doğrulama zaman aşımına uğradı | Sinyal zayıf ya da modem yoğun; yaklaş, modemi yeniden başlat |
| 5 | ASSOC_TOOMANY | Modemin bağlı cihaz sınırı dolu | Kullanılmayan cihazları çıkar ya da sınırı artır |
| 8 | ASSOC_LEAVE | ESP32 ağdan kendisi ayrıldı | Kodda WiFi.disconnect() çağrısı var; normal bir durum |
| 15 | 4WAY_HANDSHAKE_TIMEOUT | Şifre el sıkışması tamamlanamadı | En sık sebep yanlış şifre; şifreyi ve güvenlik modunu kontrol et |
| 200 | BEACON_TIMEOUT | Modemden işaret paketi gelmez oldu | Zayıf sinyal ya da güç düşmesi; anten, güç kaynağı, setTxPower |
| 201 | NO_AP_FOUND | Bu adda ağ bulunamadı | SSID yazımı, 5 GHz ağ, mesafe, gizli ağ, 12 ve 13. kanal |
| 202 | AUTH_FAIL | Kimlik doğrulama reddedildi | Şifre ya da Enterprise gibi uyumsuz bir güvenlik modu |
| 203 | ASSOC_FAIL | Modem ilişkilendirmeyi reddetti | MAC filtresi ya da yalnız 802.11ax gibi bir kablosuz mod |
| 204 | HANDSHAKE_TIMEOUT | El sıkışma zaman aşımına uğradı | Yanlış şifre ya da çok zayıf sinyal |
| 210, 211 | NO_AP_FOUND_W_COMPATIBLE_SECURITY, NO_AP_FOUND_IN_AUTHMODE_THRESHOLD | Ağ bulundu ama güvenlik modu uyumsuz ya da izin verilen alt sınırın altında (3.x çekirdeği) | Modemi WPA2-Personal (AES) yap ya da WiFi.setMinSecurity() ile alt sınırı düşür |
2,4 GHz zorunluluğu: ESP32 5 GHz ağları göremez
Klasik ESP32, ESP32-S2, ESP32-S3, ESP32-C3 ve ESP32-C6 yalnızca 2,4 GHz bandında çalışır. 5 GHz yayın yapan bir ağı taramada hiç göremezler ve sonuç her zaman WL_NO_SSID_AVAIL olur. Evdeki modemlerin çoğu iki bantta birden yayın yapar. Modemin iki bant için ayrı ad kullanıyorsa (örneğin EvAgi ve EvAgi_5G) ESP32'ye mutlaka 2,4 GHz olanın adını yaz. İki bant aynı adı taşıyorsa (Smart Connect, Band Steering ya da mesh sistemler) ESP32 çoğu zaman 2,4 GHz tarafına sorunsuz bağlanır, çünkü 5 GHz yayını zaten görmez. Sorun, 2,4 GHz bandı kapatılmışsa ya da modem istemcileri zorla 5 GHz'e itmeye çalışıyorsa çıkar: ESP32 bağlanır, birkaç saniye sonra düşer ve bu döngü tekrarlanır. Böyle bir durumda modemin arayüzünden bantları ayır ya da yalnızca 2,4 GHz yayın yapan bir misafir ağı aç.
| Kart | Wi-Fi bandı | Not |
|---|---|---|
| ESP32 (WROOM-32, DevKit), ESP32-S2, ESP32-S3 | Yalnız 2,4 GHz | 802.11 b/g/n |
| ESP32-C3 | Yalnız 2,4 GHz | Ucuz Super Mini kartlarda düşük verici gücü gerekebilir |
| ESP32-C6 | Yalnız 2,4 GHz | Wi-Fi 6 (802.11ax) destekler ama yine yalnız 2,4 GHz |
| ESP32-C5 | 2,4 GHz ve 5 GHz | Espressif'in çift bantlı ilk yongası |
| ESP8266 (NodeMCU, Wemos D1 mini, ESP-01) | Yalnız 2,4 GHz | 802.11 b/g/n |
| Raspberry Pi Pico W ve Pico 2 W | Yalnız 2,4 GHz | CYW43439 kablosuz yongası |
| Arduino Uno R4 WiFi | Yalnız 2,4 GHz | Wi-Fi işini kart üzerindeki ESP32-S3 yapar |
Bant doğru olduğu hâlde ağ bulunamıyorsa modemin kanal ve mod ayarlarına bak. ESP32'nin varsayılan bölge ayarında 1–11. kanallar etkin olarak taranır, 12 ve 13. kanallar ise yalnızca pasif olarak dinlenir. Görünür ağlar bu kanallarda da çoğu zaman bulunur, ama gizli (SSID yayını kapalı) bir ağ 12 ya da 13. kanaldaysa ESP32 onu bulamaz. En sorunsuz seçim, kanalı otomatikten çıkarıp 1, 6 ya da 11'e sabitlemektir. Kablosuz modu yalnızca 802.11ax (Wi-Fi 6) olarak ayarlanmış bir modeme klasik ESP32, S2, S3 ve C3 bağlanamaz; modu b/g/n ya da b/g/n/ax karma yap. Güvenlikte en uyumlu seçenek WPA2-Personal (AES) ya da WPA2/WPA3 karma moddur. Arduino çekirdeği varsayılan olarak WPA2'nin altındaki güvenliği (WEP ve eski WPA-TKIP) reddeder; çok eski bir ağa bağlanman gerekiyorsa begin()'den önce WiFi.setMinSecurity(WIFI_AUTH_WEP) yazabilirsin. Ayarları değiştirmeden önce ESP32'nin gerçekte ne gördüğüne bu tarama koduyla bak:
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}Listede ağının adı hiç yoksa sorun koddan önce gelir: ağ 5 GHz'dir, gizlidir ya da ESP32 çok uzaktadır. Ad listedeyse yanındaki RSSI değerine bak: -30 ile -60 dBm arası çok iyi, -60 ile -70 dBm arası iyidir; -70 ile -80 dBm arasında bağlanır ama kopabilir, -80 dBm'den zayıf bir sinyalle güvenilir bir bağlantı bekleme. Aynı adı birden fazla kez görüyorsan modemin ya da mesh sisteminin birden çok erişim noktası vardır. ESP32 varsayılan hızlı taramada bulduğu ilk eşleşmeye bağlanır; en güçlü sinyali seçmesini istiyorsan begin()'den önce WiFi.setScanMethod(WIFI_ALL_CHANNEL_SCAN) ekle. Taramada gördüğün adı birebir kopyalayıp koduna yapıştırmak, yazım hatalarını kökten çözer.
Ağ adı (SSID) ve şifre hataları
Teşhis kodu reason 201 ya da 15 veriyorsa sorun çoğu zaman koddaki iki satırdadır. SSID en fazla 32 bayt, WPA2 şifresi ise 8 ile 63 karakter arasıdır ve ikisi de büyük-küçük harfe duyarlıdır. En çok gözden kaçan hatalar şunlardır:
- Büyük-küçük harf: Modem arayüzünde EvAgi yazan bir ağa evagi yazarak bağlanamazsın. Aynı kural şifre için de geçerlidir.
- Görünmeyen boşluk: Ağ adının ya da şifrenin sonundaki bir boşluk ya da bir yerden kopyalarken gelen gizli bir karakter eşleşmeyi bozar.
- Türkçe karakterler: Ağ adındaki ş, ğ, ı, ç gibi harfler modemde farklı bir kodlamayla saklanmış olabilir. Ağ adını yalnızca İngilizce harf ve rakamlardan oluşacak şekilde değiştirmek en kesin çözümdür.
- Kıvrık kesme işareti: iPhone'larda hotspot adı telefonun adıdır ve çoğu zaman klavyedeki düz ' yerine kıvrık ’ işaretini içerir; koda yazdığın ad bu yüzden eşleşmez.
- Ters eğik çizgi ve tırnak: Şifrede \ ya da " varsa bunları C++ dizesinde \\ ve \" olarak yazmalısın; aksi hâlde derleyici şifreyi değiştirir ya da kod derlenmez.
- Açık ağ: Şifresiz bir ağa bağlanırken şifre parametresini hiç yazma; WiFi.begin(ad) yeterlidir. Açık bir ağa şifre verirsen çekirdek WPA2 arar ve ağı bulamaz.
- Gizli ağ: SSID yayını kapalı ağlara adı birebir yazarak bağlanılabilir ama taramada görünmezler; sorun yaşıyorsan test süresince yayını aç.
Güç kaynağı ve brownout: Wi-Fi açılınca kart neden resetleniyor?
ESP32 modülü çalışırken ortalama 80 mA civarında akım çeker, ama Wi-Fi vericisinin çalıştığı anlarda akım kısa süreliğine 250–400 mA tepelerine çıkar. En büyük tepeler genellikle açılıştaki radyo kalibrasyonu ve ilk bağlantı sırasında görülür. Espressif bu yüzden güç kaynağının en az 500 mA verebilmesini önerir. Kaynak bu tepeye yetişemezse 3,3 V hattı bir anlığına çöker, yongadaki brownout dedektörü devreye girer ve kart Seri Monitör'de Brownout detector was triggered mesajıyla yeniden başlar. Belirti çok tanıdıktır: kod Wi-Fi satırına kadar sorunsuz çalışır, WiFi.begin() satırında kart resetlenir ve bu sonsuz bir döngüye dönüşür. Bu hatanın bütün ayrıntılarını ESP32 Brownout ve Guru Meditation hataları yazısında ele alıyoruz.

| Güç kaynağı | Uygun mu? | Neden? |
|---|---|---|
| Bilgisayarın arkasındaki USB portu, kısa ve kalın kablo | Genellikle evet | USB 2.0 portu 500 mA verir; kısa kablo gerilim kaybını azaltır |
| Ön panel USB, USB hub ya da uzun ince kablo | Sorunlu olabilir | Kablo ve bağlantı direnci akım tepelerinde gerilimi düşürür |
| En az 1 A veren 5 V telefon adaptörü | Evet | Tepe akımlar için bol pay bırakır |
| Arduino Uno'nun 3.3V pini | Hayır | Bu pin yalnızca yaklaşık 50 mA verebilir |
| 3,7 V Li-ion pil, doğrudan kartın 5V pinine | Hayır | AMS1117'nin düşüm gerilimi yüzünden çıkış 3 V'un altına iner |
| Li-ion pil ve 5 V yükseltici ya da düşük düşümlü 3,3 V regülatör | Evet | Pil boşalırken de kararlı bir 3,3 V sağlar |
| MB102 breadboard güç modülünün 3,3 V çıkışı | Çoğunlukla evet | Girişine yeterli akım veren bir adaptör tak ve kondansatör ekle |
setTxPower çözümü: verici gücünü düşürmek
Bazı kartlarda güç kaynağı iyi olsa bile ESP32 ağı görür ama bağlanamaz ya da bağlantı sürekli kopar. Özellikle ucuz ESP32-C3 Super Mini kartlarda ve bazı klon ESP32 kartlarında anten devresi ile regülatör, en yüksek verici gücünde zorlanır. ESP32 varsayılan olarak yaklaşık 19,5–20 dBm ile yayın yapar. WiFi.setTxPower() ile bu gücü düşürmek hem akım tepelerini küçültür hem de bu kartlarda bağlantıyı çoğu zaman anında düzeltir. Komutu WiFi.begin()'den hemen sonra çağır; Wi-Fi henüz başlatılmamışken, yani WiFi.mode() ya da begin() öncesinde çağrılırsa işe yaramaz.
| Sabit | Güç | Ne zaman kullanılır? |
|---|---|---|
| WIFI_POWER_19_5dBm | 19,5 dBm | Varsayılana yakın; en uzun menzil |
| WIFI_POWER_15dBm | 15 dBm | Hafif sorunlarda ilk deneme |
| WIFI_POWER_11dBm | 11 dBm | Modem aynı odadaysa genellikle yeterli |
| WIFI_POWER_8_5dBm | 8,5 dBm | ESP32-C3 Super Mini için en sık önerilen değer |
| WIFI_POWER_5dBm | 5 dBm | Modemin hemen yanında yapılan testler için |
Her 3 dB'lik düşüş yayın gücünü yarıya indirir, dolayısıyla menzil de kısalır. Önce 15 dBm ile dene; sorun sürerse 11 ve 8,5 dBm'e in. Gücü düşürünce bağlantı düzeliyorsa asıl sebep çoğu zaman güç kaynağı ya da anten tasarımıdır, bu yüzden uzun vadede daha iyi bir kaynak ve kondansatör de ekle. Kartın o anki ayarını WiFi.getTxPower() ile okuyabilirsin; dönen değer 0,25 dBm birimindedir, yani 78 sayısı 19,5 dBm anlamına gelir.
Otomatik yeniden bağlanma kodu
Modem yeniden başladığında, elektrik kesilip geldiğinde ya da sinyal bir süre zayıfladığında ESP32'nin bağlantısı kopar. ESP32 çekirdeğinde WiFi.setAutoReconnect(true) varsayılan olarak açıktır ve çoğu kopmadan sonra kart kendiliğinden yeniden bağlanır. Ancak bazı sebeplerde, örneğin 202 AUTH_FAIL'de, çekirdek tek bir denemeden sonra vazgeçer ve kart sen resetleyene kadar ağsız kalır. Aylarca kesintisiz çalışacak bir projede bu yüzden kendi denetimini de eklemelisin. Aşağıdaki kod delay() kullanmadan, millis() ile her 15 saniyede bir bağlantıyı kontrol eder, koptuysa yeniden bağlanır ve 5 dakika boyunca bağlanamazsa kartı yeniden başlatır:
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}WiFi.setSleep(false) satırı, ESP32'nin bağlıyken radyoyu kısa aralıklarla kapattığı modem uykusunu kapatır. Bu ayar bazı modemlerde yaşanan kopmaları ve web sunucusundaki gecikmeleri azaltır; karşılığında kart birkaç on mA daha fazla akım çeker. Pille çalışan projelerde bu satırı silebilir, pilin ne kadar dayanacağını Pil Ömrü aracıyla hesaplayabilirsin. setTxPower satırını yalnızca önceki bölümdeki sorunları yaşıyorsan bırak. Proje kodunu loop() içine eklerken uzun delay() çağrılarından kaçın, çünkü bağlantı kontrolü ancak loop() döndükçe çalışır. Wi-Fi bilgilerini koda gömmek yerine telefondan girmek istersen WiFiManager kütüphanesine bak.
ESP32 statik IP ayarı
Normalde modem ESP32'ye DHCP ile her seferinde değişebilen bir adres verir. Telefondan hep aynı adrese bağlanacağın bir web sunucusu yapıyorsan ya da modemin DHCP'si sorunluysa, yani durum kodu 0'da takılı kalıyorsa, statik IP işini kolaylaştırır. Üç kurala dikkat et: WiFi.config() mutlaka WiFi.begin()'den önce çağrılır; seçtiğin adres modemin ağında ama DHCP havuzunun dışında olmalıdır (modem 192.168.1.2–100 arasını dağıtıyorsa 192.168.1.200 gibi); ağ geçidi de modemin kendi adresidir. Modeminin adresini öğrenmek için teşhis kodunu bir kez DHCP ile çalıştır; kod ağ geçidini de yazdırır.
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() {}Okul ve kurum ağları: WPA2-Enterprise (eduroam) bağlantısı
Üniversitelerdeki eduroam, şirket ağları ve bazı okul ağları tek bir ortak şifre yerine her kullanıcıya ayrı bir kullanıcı adı ve şifre veren WPA2-Enterprise (802.1X) yöntemini kullanır. Normal WiFi.begin(ad, şifre) bu ağlarda her zaman başarısız olur; tarama kodunda da bu ağların güvenlik türü Diger / Other (Enterprise) olarak görünür. ESP32 Arduino çekirdeğinin 2.x ve 3.x sürümleri, en yaygın yöntem olan PEAP için hazır bir begin() biçimi sunar:
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() {}Kimlik (identity) çoğu kurumda kullanıcı adıyla aynıdır; bazı kurumlar ise [email protected] gibi anonim bir dış kimlik ister. Bu kodda sunucu sertifikası (CA) doğrulanmaz: bağlantı çalışır, ama sahte bir erişim noktası kurum şifreni ele geçirebilir. Bu yüzden kişisel şifreni ESP32'ye yazmadan önce bilgi işlem birimine danış ve mümkünse cihazlar için ayrılmış bir hesap ya da ağ iste. Kurum sertifika istiyorsa CA dosyasını begin()'in altıncı parametresi olarak verebilirsin. Otel, yurt ve kafe ağları gibi tarayıcıda giriş sayfası açılan ağlar (captive portal) ise ayrı bir sorundur, çünkü ESP32 bu sayfayı dolduramaz. Bazı okullar da cihazların MAC adresinin önceden kaydedilmesini ister; teşhis kodunun yazdırdığı MAC adresini bilgi işleme ilet. Bu tür ağlarda en pratik çözüm telefonunun hotspot'u ya da küçük bir cep modemidir.
Telefon hotspot'uyla test: sorun modemde mi, ESP32'de mi?
Sebebi en hızlı ayıran yöntem, ESP32'yi ayarlarını tamamen senin belirlediğin bir ağa bağlamaktır. Telefonunun hotspot'u bunun için idealdir:
- Hotspot'un adını kısa ve yalnızca İngilizce harf ile rakamlardan oluşacak şekilde ayarla (örneğin esptest); şifreyi de en az 8 karakterli sade bir şifre yap (örneğin test12345).
- Android'de mobil erişim noktası ayarlarındaki bant seçeneğini (bazı telefonlarda AP bandı ya da Hız ve uyumluluk) 2,4 GHz yap ve güvenlik türü olarak WPA2-Personal seç.
- iPhone'da Ayarlar > Kişisel Erişim Noktası bölümünde Başkalarının Katılmasına İzin Ver seçeneğini aç. Yeni modellerde bulunan Uyumluluğu En Üst Düzeye Çıkar seçeneğini de aç; hotspot böylece 2,4 GHz'e geçer. Hotspot adı telefonun adıdır; Ayarlar > Genel > Hakkında > Ad bölümünden sadeleştir ve ESP32 bağlanana kadar Kişisel Erişim Noktası ekranını açık tut.
- Teşhis kodundaki ağ adını ve şifreyi hotspot bilgileriyle değiştir, telefonu ESP32'den 1–2 metre uzağa koy ve kodu yükle.
- Seri Monitör'de durum ve sebep kodlarını oku, ardından aynı kodu bir de ev modeminin bilgileriyle dene.
Sonucu şöyle yorumla: ESP32 hotspot'a bağlanıyor ama ev modemine bağlanmıyorsa kodun, kartın ve güç kaynağın sağlamdır; sorun modemin bant, kanal, güvenlik, MAC filtresi ya da bağlı cihaz sınırı ayarlarındadır. Hotspot'a da bağlanamıyorsa sorun ESP32 tarafındadır: güç kaynağını ve kabloyu değiştir, setTxPower ile gücü düşür, antenin önünde metal olmadığından emin ol ve kodu yeniden kontrol et. Hotspot testi, okulda ağa bağlanamayan bir projenin aslında çalıştığını göstermenin de en hızlı yoludur.
Raspberry Pi Pico W ve MicroPython ile Wi-Fi testi
Raspberry Pi Pico W ve Pico 2 W da yalnızca 2,4 GHz destekler; bu yazıdaki bant, şifre, güç ve hotspot önerilerinin hepsi bu kartlar için de geçerlidir. MicroPython'da durum kodları network modülündeki sabitlerle okunur. Aşağıdaki kod hem ESP32 hem Pico W üzerinde Thonny ile değiştirmeden çalışır. Pico W'da ağ bulunamadığında ya da şifre yanlış olduğunda beklemeyi hemen bırakır; ESP32'de MicroPython bazı hatalarda denemeyi sürdürdüğü için kod 20 saniyenin sonunda son durumu yazar:
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)Pico W'da sayısal durum değerleri farklıdır: 3 bağlandı ve IP aldı, 2 bağlandı ama IP bekliyor, -1 genel hata, -2 ağ bulunamadı, -3 şifre yanlış anlamına gelir. ESP32'de ise bağlanırken 1001, IP alınca 1010, sorun olduğunda da 201 ve 202 gibi ESP-IDF sebep kodlarını görürsün. Pico W'da 12 ve 13. kanal sorunlarını önlemek için bağlanmadan önce ülke kodunu ayarla (rp2.country('TR'), yeni sürümlerde network.country('TR')); bağlantı ara sıra kopuyorsa güç tasarrufunu wlan.config(pm=0xa11140) ile kapatabilirsin. Pico W ile web sunucusu kurmak için Pico W Wi-Fi web sunucu yazısına, MicroPython'a yeniysen MicroPython temelleri rehberine göz at.
Sık hatalar ve çözümleri
| Belirti | Olası sebep | Çözüm |
|---|---|---|
| Seri Monitör'de anlamsız karakterler | Baud hızı uyuşmuyor | Seri Monitör'ü 115200 baud yap |
| Durum 1, reason 201 | Ağ adı yanlış, ağ 5 GHz ya da çok uzak | Tarama kodunu çalıştır, 2,4 GHz ağın adını birebir kopyala |
| Durum 6, art arda reason 15 | Şifre yanlış | Şifreyi büyük-küçük harf ve özel karakterlere dikkat ederek yeniden yaz |
| Durum 4 ya da 6; reason 202, 210 ya da 211 | Güvenlik modu uyumsuz | Modemi WPA2-Personal (AES) ya da WPA2/WPA3 karma moda al |
| Durum 0'da takılı kalıyor | Modeme bağlandı ama DHCP'den IP alamıyor | Modemi yeniden başlat, DHCP havuzunu büyüt ya da statik IP kullan |
| WiFi.begin() satırında reset ve Brownout detector was triggered | Güç kaynağı akım tepesine yetişemiyor | Kısa kablo, en az 1 A adaptör, 3V3 ile GND arasına 470 µF |
| Bağlanıyor, birkaç dakika sonra kopuyor (reason 200) | Zayıf sinyal, modem uykusu ya da güç sorunu | setSleep(false), setTxPower, yeniden bağlanma kodu, modeme yaklaştırma |
| Masada çalışıyor, kutuya koyunca bağlanmıyor | Metal kutu ya da pil antenin önünde | Anteni kutunun kenarına ve dışarıya bakacak şekilde yerleştir, plastik kutu kullan |
| Bağlı ama telefondan web sayfası açılmıyor | Telefon başka ağda ya da misafir ağında istemci izolasyonu var | İkisini aynı ağa bağla, IP adresini Seri Monitör'den oku |
| Wi-Fi açılınca analogRead() değerleri bozuluyor | Sensör ADC2 pinine bağlı; ADC2'yi Wi-Fi kullanır | Sensörü GPIO 32–39 arasındaki ADC1 pinlerine taşı |
| ESP32-CAM ya da harici antenli kartta menzil birkaç santimetre | Anten seçimi harici antene ayarlı ama anten takılı değil | IPEX soketine anten tak ya da kart üzerindeki 0 Ω anten seçim direncini kontrol et |
Bağlantı kuruldu: şimdi ne yapabilirsin?
- Web sunucu ve canlı panel: Sensör değerlerini telefonda anlık gösteren bir ESP32 web sunucusu ve WebSocket projesi kur.
- İnternet saati: Saati NTP sunucusundan alıp bir ekranda göster.
- Hava durumu ekranı: Hava durumu API'si ile şehrinin sıcaklığını ve nemini çek.
- Telefona bildirim: Kapı açıldığında Telegram botu ile mesaj gönder.
- Akıllı ev: ESP32'yi MQTT ile Home Assistant'a bağla.
- Modemsiz haberleşme: İki ESP32'yi hiçbir ağa bağlamadan ESP-NOW ile konuştur.
- Kablosuz kod yükleme: Kartı kutuya kapattıktan sonra yeni kodu OTA güncelleme ile Wi-Fi üzerinden gönder.
ESP32'nin Wi-Fi'ye bağlanmaması ilk anda kafa karıştırıcıdır, ama durum ve sebep kodu sana sorunun hangi adımda olduğunu her zaman söyler: 1 ve 201 ağın bulunamadığını, 15 ve 202 şifreyi ya da güvenlik modunu, 0 DHCP'yi, 200 ve ani resetler ise sinyali ya da güç kaynağını gösterir. ESP32'yi yeni tanıyorsan temelleri ESP32 Nedir? yazısında bulabilirsin. BlueGrays uygulamasında da ESP32 ile Wi-Fi bağlantısı, web sunucu, mDNS, NTP saati, hava durumu, OTA güncelleme ve Telegram alarmı gibi projeleri adım adım devre şemaları ve hazır kodlarıyla inceleyebilirsin.
Sıkça sorulan sorular
ESP32 neden Wi-Fi'ye bağlanmıyor?
En sık sebepler 5 GHz bir ağa bağlanmaya çalışmak, ağ adında ya da şifrede yazım hatası, Wi-Fi açılınca gerilimi çöken zayıf bir güç kaynağı ve modemin güvenlik ayarlarıdır. WiFi.status() değerini ve bağlantı koptuğunda gelen reason kodunu yazdırırsan sorunun hangisi olduğunu hemen görürsün. Ağ bulunamıyorsa 1 ve 201, şifre yanlışsa çoğu zaman 6 ve 15 görürsün.
ESP32 5 GHz Wi-Fi'ye bağlanır mı?
Klasik ESP32, ESP32-S2, S3, C3 ve C6 yalnızca 2,4 GHz destekler ve 5 GHz ağları taramada hiç göremez. Çift bantlı model ESP32-C5'tir. Modemin iki bandı ayrı adlarla yayınlıyorsa ESP32'ye 2,4 GHz ağın adını yazmalısın.
ESP32 WiFi.status() 6 ne anlama gelir?
6, WL_DISCONNECTED demektir: kart ağa bağlı değildir ve bağlantı denemesi ya sürmektedir ya da başarısız olmuştur. ESP32'de yanlış şifre çoğu zaman 4 (WL_CONNECT_FAILED) yerine bu değeri verir. Asıl sebebi görmek için ARDUINO_EVENT_WIFI_STA_DISCONNECTED olayındaki reason koduna bak.
ESP32 Wi-Fi bağlantısı neden sürekli kopuyor?
Sürekli kopmanın başlıca sebepleri zayıf sinyal, Wi-Fi akım tepelerine yetişemeyen bir güç kaynağı, antenin önündeki metal ya da pil ve modemin bant yönlendirme ayarlarıdır. Kartı modeme yaklaştır, 3V3 ile GND arasına 100–470 µF kondansatör ekle ve WiFi.setSleep(false) ile modem uykusunu kapat. Kodunu da kopan bağlantıyı kendiliğinden toparlayacak şekilde yaz.
ESP32 telefon hotspot'una bağlanır mı?
Evet, hotspot 2,4 GHz bandında yayın yapıyorsa bağlanır. Android'de hotspot bandını 2,4 GHz yap, iPhone'da Uyumluluğu En Üst Düzeye Çıkar seçeneğini aç ve hotspot adını sade tut. Hotspot testi, sorunun ev modeminde mi yoksa ESP32 tarafında mı olduğunu ayırmanın en hızlı yoludur.
ESP32 eduroam ya da okul ağına bağlanabilir mi?
eduroam gibi WPA2-Enterprise ağlara, ESP32 Arduino çekirdeğindeki WiFi.begin(ad, WPA2_AUTH_PEAP, kimlik, kullanıcı, şifre) biçimiyle bağlanabilir. Tarayıcıda giriş sayfası açılan ağlarda (captive portal) ise ESP32 bu sayfayı dolduramaz. Kurum ağını kullanmadan önce bilgi işlem birimine danışmak ve mümkünse cihazlar için ayrı bir hesap istemek en doğrusudur.
Bu yazıdan sonra yapabileceğin projeler
Tüm projeleri gör
ESP32 Wi-Fi STA Bağlantısı (LCD Ekranlı)
Bu projede ESP32'yi Station (STA) modunda evdeki Wi-Fi ağına güvenli ve hata toleranslı şekilde bağlıyoruz. SSID/şifreyi `secrets.h` dosyasına ayırarak Git'e sızmasını önlüyor, otomatik yeniden bağlanma mekanizması kuruyor, RSSI sinyal seviyesini ve IP adresini I2C LCD ekranda gösteriyoruz. Dahili LED durum göstergesi olarak çalışır. Üretim seviyesi bir bağlantı yöneticisidir.

ESP32 Async Web Server (LCD'de IP Göstergeli)
Bu projede ESP32'yi aynı Wi-Fi ağındaki telefonunuzdan veya bilgisayarınızdan kontrol edebileceğiniz **asenkron bir web sunucusuna** dönüştürüyoruz. ESPAsyncWebServer kütüphanesi sayesinde sunucu birden fazla isteği aynı anda işleyebiliyor (klasik `WebServer.h` gibi tek istekte bloklamıyor). Tarayıcıdan ESP32'nin IP adresine bağlanıp ON/OFF butonlarına basarak (`/on` ve `/off` adresleri) GPIO 5'e bağlı LED'i açıp kapatabileceksiniz.

ESP32 mDNS: bluegrays-esp.local ile Cihaza Erişim (LCD Ekranlı)
Bu projede ESP32'ye mDNS (Multicast DNS) servisi ekleyerek IP adresi yerine `bluegrays-esp.local` gibi okunabilir bir host adıyla erişim sağlıyoruz. DHCP'nin verdiği IP değişse bile cihaza her zaman aynı isimle ulaşabilirsiniz. Üzerinde küçük bir web server da çalıştırarak tarayıcıdan `http://bluegrays-esp.local/` adresiyle LED kontrolü gönderiyoruz. I2C LCD ekranda hostname, IP ve LED durumu hem Türkçe hem İngilizce gösterilir. iOS, macOS ve Linux mDNS'i doğal olarak destekler; Windows'ta Bonjo

ESP32 NTP ile İnternetten Gerçek Zaman
ESP32, Wi-Fi'a bağlanıp NTP (Network Time Protocol) sunucularından milisaniye hassasiyetiyle gerçek zamanı çeker. `configTzTime()` fonksiyonu sayesinde Türkiye saat dilimi (TRT, UTC+3) otomatik uygulanır ve yaz/kış saati uygulayan ülkelerde DST geçişi POSIX TZ string'i ile otomatik yönetilir. Saat hem Serial Monitor'e hem de opsiyonel I2C LCD'ye yazdırılır. `configTzTime()` SNTP hizmetini başlatır; ağ erişimi varken periyodik yeniden senkronizasyon yapılır ve iki senkronizasyon arasında sistem s

ESP32 HTTPClient + Hava Durumu API (LCD Ekranlı)
Bu projede ESP32 ile internet üzerinden hava durumu API'sine (wttr.in) `HTTPClient.h` kullanarak REST API çağrısı yapıyoruz. ArduinoJson v7 ile dönen JSON cevabını parse edip şehir, sıcaklık, nem, hava durumu ve rüzgar bilgilerini I2C LCD ekranda hem Türkçe hem İngilizce gösteriyoruz. wttr.in ücretsizdir, API key gerektirmez — herhangi bir şehir ismini yazarak o şehrin anlık hava durumunu çekebilirsiniz. 30 dakikada bir otomatik güncelleme, LED ile her ekran için farklı görsel feedback ve eksiks

ESP32 OTA Update — Kablosuz Firmware Yükleme (LCD Ekranlı)
Bu projede ESP32'ye USB kablosu olmadan, Wi-Fi üzerinden yeni firmware yüklemeyi öğreneceksin. `ArduinoOTA` kütüphanesi ile ESP32 ağda görünür hale gelir ve Arduino IDE'nin "Network port" sekmesinde `bluegrays-ota` olarak otomatik listelenir. İlk yükleme USB ile yapılır, sonrasında tüm güncellemeler kablosuz olur — saha cihazları için çok kritik bir özelliktir. I2C LCD ekranda WiFi durumu, IP, hostname, OTA yükleme yüzdesi ve hata mesajları hem Türkçe hem İngilizce gösterilir. Parola koruması, h

ESP32 WebSocket Sayaç (2 Buton + LCD + Web Realtime)
Bu projede ESP32'ye bağlı iki butonla (GPIO 5 artırır, GPIO 4 azaltır) bir sayaç değiştirilir. Değer hem 16x2 I2C LCD'de hem de ESPAsyncWebServer'ın WebSocket desteğiyle bağlı tüm tarayıcılarda anında güncellenir; sayfayı yenilemek gerekmez. HTTP polling yerine tek bir kalıcı bağlantı kullanılır ve ESP32 yeni değeri ws.textAll() ile herkese gönderir.

ESP32 Hareket Alarm Sistemi (PIR + Buzzer + LED + Telegram)
PIR sensörü hareket algıladığında buzzer ve LED'i aktif eden, aynı anda Telegram üzerinden sahibine anlık bildirim gönderen akıllı bir güvenlik alarm sistemidir. Tekrarlayan alarmların sıklığını sınırlamak için 30 saniyelik cooldown (bekleme süresi) mekanizması vardır; bu mekanizma PIR sensörünün yanlış algılamalarını doğrulamaz veya ortadan kaldırmaz. Ev güvenliği, garaj izleme, depo veya çalışma odası gibi alanlarda kullanılabilir. Telegram entegrasyonu sayesinde nerede olursanız olun anında h
Diğer yazılar
BlueGrays uygulaması
Bu devreyi telefonunda adım adım kur
Devre şeması, kod ve parça listesi tek ekranda. 160'tan fazla Arduino, ESP32 ve Pico projesi seni bekliyor.
Telefonunla tara
Kamerayı koda tut; telefonunun uygulama mağazası açılır.
ya da mağazada aç

