Rehberler · 13 dk okuma

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 geliştirme kartı ve PCB anteni
ESP32 geliştirme kartı: metal kapaklı modülün ucundaki zikzak çizgi PCB antenidir. Bu bölgenin üstüne ya da hemen yanına metal, pil veya kablo gelirse bağlantı belirgin biçimde zayıflar.

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şamaNe olur?Takılırsa göreceğin durum ve sebep
1. TaramaESP32, 2,4 GHz kanallarında ağ adını ararWL_NO_SSID_AVAIL (1), reason 201
2. Kimlik doğrulama ve ilişkilendirmeModem ESP32'yi ağa kabul eder ya da reddederWL_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ırWL_DISCONNECTED (6) ve reason 15; reason 204'te WL_CONNECTION_LOST (5)
4. DHCPModem ESP32'ye bir IP adresi verirWL_IDLE_STATUS (0) durumunda takılır
Bağlantıdan sonraModemden düzenli işaret (beacon) paketleri gelirKoparsa 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.

KodSabitAnlamıİlk bakılacak yer
0WL_IDLE_STATUSModeme bağlandı ama henüz IP adresi almadıBirkaç saniye sürmesi normal; uzun sürerse DHCP
1WL_NO_SSID_AVAILVerdiğin adda bir ağ bulunamadıAğ adı, 2,4 GHz bandı, mesafe
2WL_SCAN_COMPLETEDAğ taraması tamamlandıBağlantıyla ilgisi yok
3WL_CONNECTEDBağlandı ve IP adresi aldıHer şey yolunda
4WL_CONNECT_FAILEDModem bağlantıyı reddettiŞifre, güvenlik modu, MAC filtresi
5WL_CONNECTION_LOSTKurulmuş bağlantı koptuSinyal gücü, güç kaynağı, anten
6WL_DISCONNECTEDBağlı değil; deneme sürüyor ya da başarısız olduReason (sebep) kodu
254WL_STOPPEDWi-Fi istasyonu durdurulmuş (3.x çekirdeği)WiFi.mode(WIFI_STA) çağrısı
255WL_NO_SHIELDWi-Fi henüz başlatılmamış (2.x çekirdeği)WiFi.mode() ya da WiFi.begin() çağrısı
Yanlış şifrede çoğu kişi WL_CONNECT_FAILED (4) bekler, ama ESP32 çoğu zaman WL_DISCONNECTED (6) gösterir ve arka planda denemeyi sürdürür. Bunun sebebi, birçok modemin hatalı şifrede el sıkışmayı yalnızca zaman aşımına uğratmasıdır (reason 15). Bir başka klasik hata da bekleme döngüsünün içinde WiFi.begin()'i tekrar tekrar çağırmaktır: her çağrı süren denemeyi baştan başlatır ve kart çoğu zaman hiç bağlanamaz. begin()'i bir kez çağır, sonra yalnızca durumu oku.

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.

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() {}

Çı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:

ReasonAdıNe anlama gelir?Çözüm
2AUTH_EXPIREKimlik doğrulama zaman aşımına uğradıSinyal zayıf ya da modem yoğun; yaklaş, modemi yeniden başlat
5ASSOC_TOOMANYModemin bağlı cihaz sınırı doluKullanılmayan cihazları çıkar ya da sınırı artır
8ASSOC_LEAVEESP32 ağdan kendisi ayrıldıKodda WiFi.disconnect() çağrısı var; normal bir durum
154WAY_HANDSHAKE_TIMEOUTŞifre el sıkışması tamamlanamadıEn sık sebep yanlış şifre; şifreyi ve güvenlik modunu kontrol et
200BEACON_TIMEOUTModemden işaret paketi gelmez olduZayıf sinyal ya da güç düşmesi; anten, güç kaynağı, setTxPower
201NO_AP_FOUNDBu adda ağ bulunamadıSSID yazımı, 5 GHz ağ, mesafe, gizli ağ, 12 ve 13. kanal
202AUTH_FAILKimlik doğrulama reddedildiŞifre ya da Enterprise gibi uyumsuz bir güvenlik modu
203ASSOC_FAILModem ilişkilendirmeyi reddettiMAC filtresi ya da yalnız 802.11ax gibi bir kablosuz mod
204HANDSHAKE_TIMEOUTEl sıkışma zaman aşımına uğradıYanlış şifre ya da çok zayıf sinyal
210, 211NO_AP_FOUND_W_COMPATIBLE_SECURITY, NO_AP_FOUND_IN_AUTHMODE_THRESHOLDAğ 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ç.

KartWi-Fi bandıNot
ESP32 (WROOM-32, DevKit), ESP32-S2, ESP32-S3Yalnız 2,4 GHz802.11 b/g/n
ESP32-C3Yalnız 2,4 GHzUcuz Super Mini kartlarda düşük verici gücü gerekebilir
ESP32-C6Yalnız 2,4 GHzWi-Fi 6 (802.11ax) destekler ama yine yalnız 2,4 GHz
ESP32-C52,4 GHz ve 5 GHzEspressif'in çift bantlı ilk yongası
ESP8266 (NodeMCU, Wemos D1 mini, ESP-01)Yalnız 2,4 GHz802.11 b/g/n
Raspberry Pi Pico W ve Pico 2 WYalnız 2,4 GHzCYW43439 kablosuz yongası
Arduino Uno R4 WiFiYalnız 2,4 GHzWi-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:

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}

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ç.
Şifreyi değiştirmeye başlamadan önce sorunun ad mı şifre mi olduğunu ayır. Reason 201 geliyorsa ağ hiç bulunamamıştır ve şifreyle uğraşmak boşunadır. Reason 15, 202 ya da 204 geliyorsa ağ bulunmuş ama şifre ya da güvenlik modu kabul edilmemiştir.

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.

AMS1117 3,3 V voltaj regülatörü
AMS1117: ESP32 geliştirme kartlarının çoğunda 5 V'u 3,3 V'a düşüren regülatör budur. Girişi ile çıkışı arasında yaklaşık 1,1–1,3 V fark olmadan düzgün çalışmaz.
Güç kaynağıUygun mu?Neden?
Bilgisayarın arkasındaki USB portu, kısa ve kalın kabloGenellikle evetUSB 2.0 portu 500 mA verir; kısa kablo gerilim kaybını azaltır
Ön panel USB, USB hub ya da uzun ince kabloSorunlu olabilirKablo ve bağlantı direnci akım tepelerinde gerilimi düşürür
En az 1 A veren 5 V telefon adaptörüEvetTepe akımlar için bol pay bırakır
Arduino Uno'nun 3.3V piniHayırBu pin yalnızca yaklaşık 50 mA verebilir
3,7 V Li-ion pil, doğrudan kartın 5V pinineHayırAMS1117'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örEvetPil boşalırken de kararlı bir 3,3 V sağlar
MB102 breadboard güç modülünün 3,3 V çıkışıÇoğunlukla evetGirişine yeterli akım veren bir adaptör tak ve kondansatör ekle
Wi-Fi'li projelerde kartın 3V3 ve GND pinleri arasına, karta olabildiğince yakın bir yere 100–470 µF'lık bir elektrolitik kondansatör ve yanına 100 nF'lık seramik bir kondansatör ekle. Elektrolitik kondansatörün uzun bacağı (+) 3V3'e, gövdesindeki şeritli taraf GND'ye gelmelidir; ters takılan bir elektrolitik ısınır ve patlayabilir. Kondansatörlerin nasıl çalıştığını Kondansatör Nedir? yazısında, kartı doğru beslemeyi Arduino güç besleme rehberinde bulabilirsin.

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.

SabitGüçNe zaman kullanılır?
WIFI_POWER_19_5dBm19,5 dBmVarsayılana yakın; en uzun menzil
WIFI_POWER_15dBm15 dBmHafif sorunlarda ilk deneme
WIFI_POWER_11dBm11 dBmModem aynı odadaysa genellikle yeterli
WIFI_POWER_8_5dBm8,5 dBmESP32-C3 Super Mini için en sık önerilen değer
WIFI_POWER_5dBm5 dBmModemin 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:

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}

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.

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() {}
ESP32'de parametre sırası IP, ağ geçidi, alt ağ maskesi, DNS1, DNS2 şeklindedir; bu sıra bazı Arduino WiFi kütüphanelerindekinden (IP, DNS, ağ geçidi, alt ağ) farklıdır. Sırayı karıştırırsan ESP32 ağa bağlanır ama internete çıkamaz. DNS adreslerini de yazmanı öneririz: DNS çalışmazsa ESP32 modemde görünür ama alan adlarını çözemediği için hava durumu, NTP ya da Telegram gibi servislere ulaşamaz. Aynı IP'yi iki cihaza vermek ise her iki cihazın bağlantısını da rastgele koparır.

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:

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() {}

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:

  1. 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).
  2. 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ç.
  3. 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.
  4. 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.
  5. 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:

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)

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

BelirtiOlası sebepÇözüm
Seri Monitör'de anlamsız karakterlerBaud hızı uyuşmuyorSeri Monitör'ü 115200 baud yap
Durum 1, reason 201Ağ adı yanlış, ağ 5 GHz ya da çok uzakTarama 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 211Güvenlik modu uyumsuzModemi WPA2-Personal (AES) ya da WPA2/WPA3 karma moda al
Durum 0'da takılı kalıyorModeme bağlandı ama DHCP'den IP alamıyorModemi yeniden başlat, DHCP havuzunu büyüt ya da statik IP kullan
WiFi.begin() satırında reset ve Brownout detector was triggeredGüç kaynağı akım tepesine yetişemiyorKı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üç sorunusetSleep(false), setTxPower, yeniden bağlanma kodu, modeme yaklaştırma
Masada çalışıyor, kutuya koyunca bağlanmıyorMetal kutu ya da pil antenin önündeAnteni kutunun kenarına ve dışarıya bakacak şekilde yerleştir, plastik kutu kullan
Bağlı ama telefondan web sayfası açılmıyorTelefon 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 bozuluyorSensör ADC2 pinine bağlı; ADC2'yi Wi-Fi kullanırSensörü GPIO 32–39 arasındaki ADC1 pinlerine taşı
ESP32-CAM ya da harici antenli kartta menzil birkaç santimetreAnten seçimi harici antene ayarlı ama anten takılı değilIPEX soketine anten tak ya da kart üzerindeki 0 Ω anten seçim direncini kontrol et
Sorun giderirken sırayı bozma: önce hotspot testiyle sorunun modemde mi kartta mı olduğunu ayır, sonra tarama koduyla ağın görünüp görünmediğine bak, ardından teşhis kodundaki durum ve sebep kodunu oku, en son güç kaynağına ve modem ayarlarına geç. Her seferinde tek bir şeyi değiştir. Pin seçiminden şüpheleniyorsan kartının pin haritasını Pinout aracında görebilirsin; ESP32-CAM kullanıyorsan anten ayrıntıları için ESP32-CAM yazısına bak.

Bağlantı kuruldu: şimdi ne yapabilirsin?

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.

Tüm projeleri gör
ESP32 Wi-Fi STA Bağlantısı (LCD Ekranlı)
#127İleri
Premium

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.

4.4(21)
33
ESP32 Async Web Server (LCD'de IP Göstergeli)
#129İleri
Premium

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.

4.8(16)
26
ESP32 mDNS: bluegrays-esp.local ile Cihaza Erişim (LCD Ekranlı)
#131İleri
Premium

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

4.8(14)
23
ESP32 NTP ile İnternetten Gerçek Zaman
#128İleri
Premium

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

4.5(13)
21
ESP32 HTTPClient + Hava Durumu API (LCD Ekranlı)
#133İleri
Premium

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

4.7(13)
20
ESP32 OTA Update — Kablosuz Firmware Yükleme (LCD Ekranlı)
#132İleri
Premium

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

4.6(14)
22
ESP32 WebSocket Sayaç (2 Buton + LCD + Web Realtime)
#130İleri
Premium

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.

4.5(14)
23
ESP32 Hareket Alarm Sistemi (PIR + Buzzer + LED + Telegram)
#145İleri
Premium

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

0.0(0)
8