WiFiManager ile Captive Portal Kurulum Sihirbazı
Proje Amacı
Cihazı ilk açılışta WiFi ağı bilgisi olmadan bir Erişim Noktası (AP) moduna geçirip, telefon veya bilgisayarla bu ağa bağlanan kullanıcıya otomatik açılan bir web sayfasından (captive portal) ev WiFi bilgilerini girdirmeyi öğretir — kod içine SSID/şifre yazmadan, kutudan çıkar çıkmaz kurulum yapılabilen tüketici ürünlerindeki deneyimin bir benzeri. ESP32'nin WiFi çipi Erişim Noktası (AP) ve İstemci (STA) modları arasında yazılımsal olarak geçiş yapabilir ve bu esnada aynı anda basit bir DNS yönlendirme + web sunucusunu çalıştıracak yeterli RAM'e sahiptir. Bu senaryo Arduino Uno'da kurulamaz: kart hiçbir WiFi radyo donanımı içermez ve harici bir WiFi shield eklense bile 2KB RAM'i, DNS yönlendirme + web sunucusu + form işleme arabelleklerini aynı anda tutmaya yetmez.
Gerekli Malzemeler
- ESP32 DevKit V1 (38 pin)
- Durum LED'i
- 220Ω direnç
- Breadboard
- Jumper kablolar
Gerekli Kütüphaneler
WiFiManager by tzapu (Library Manager'dan kurun, sürüm >= 2.0.16-rc — eski 0.x sürümleriyle API uyumsuzdur, ESP32 desteği için mutlaka 2.x kullanın).
Pin Bağlantıları
| Bileşen Pini | Bağlantı |
|---|---|
| BOOT düğmesi (kart üzerinde dahili, harici kablolama gerekmez) | GPIO0Strapping pin |
| Durum LED anot (220Ω üzerinden) | GPIO4 |
| LED katot | GND |
Devre Şeması
ESP32 Kodu
| 1 | #include <WiFiManager.h> |
| 2 | |
| 3 | const int LED = 4; |
| 4 | const int BOOT_BUTTON = 0; // kart üzerindeki dahili BOOT düğmesi |
| 5 | |
| 6 | WiFiManager wm; |
| 7 | |
| 8 | void setup() { |
| 9 | Serial.begin(115200); |
| 10 | pinMode(LED, OUTPUT); |
| 11 | pinMode(BOOT_BUTTON, INPUT_PULLUP); // dahili pull-up: buton basılınca LOW okunur |
| 12 | |
| 13 | wm.setConfigPortalTimeout(180); // 3 dakika içinde ayar girilmezse devam et/yeniden dene |
| 14 | |
| 15 | Serial.println("WiFiManager başlatılıyor..."); |
| 16 | bool baglandi = wm.autoConnect("DevreAI-Kurulum", "12345678"); |
| 17 | // autoConnect: kayıtlı ağ varsa direkt bağlanır; yoksa "DevreAI-Kurulum" |
| 18 | // adında bir AP açar (şifre: 12345678), 192.168.4.1 adresine giren |
| 19 | // kullanıcıya WiFi seçme formu gösterir. |
| 20 | |
| 21 | if (!baglandi) { |
| 22 | Serial.println("Bağlanılamadı, yeniden başlatılıyor."); |
| 23 | ESP.restart(); |
| 24 | } |
| 25 | |
| 26 | Serial.println("WiFi'ye bağlandı: " + WiFi.localIP().toString()); |
| 27 | digitalWrite(LED, HIGH); // sabit yanma = ağa bağlı |
| 28 | } |
| 29 | |
| 30 | void loop() { |
| 31 | // BOOT düğmesine 3 saniye basılı tutulursa kayıtlı WiFi ayarlarını sil |
| 32 | static unsigned long basiliBaslangic = 0; |
| 33 | if (digitalRead(BOOT_BUTTON) == LOW) { |
| 34 | if (basiliBaslangic == 0) basiliBaslangic = millis(); |
| 35 | else if (millis() - basiliBaslangic > 3000) { |
| 36 | Serial.println("WiFi ayarları sıfırlanıyor..."); |
| 37 | wm.resetSettings(); |
| 38 | delay(500); |
| 39 | ESP.restart(); |
| 40 | } |
| 41 | digitalWrite(LED, LOW); // basılı tutarken LED yanıp söner gibi geri bildirim |
| 42 | delay(100); |
| 43 | digitalWrite(LED, HIGH); |
| 44 | } else { |
| 45 | basiliBaslangic = 0; |
| 46 | } |
| 47 | } |
Çalışma Açıklaması
GPIO0 ESP32'nin strapping pinlerinden biridir — güç verilirken (boot anında) bu pin LOW ise cihaz bootloader/flash moduna geçer. Bu projede sorun oluşturmaz çünkü GPIO0 sadece boot tamamlandıktan sonra loop() içinde okunuyor; ancak GPIO0'ı harici bir devrede kalıcı olarak GND'ye bağlamayın, aksi halde kart hiç normal açılmaz. Kartın kendi BOOT butonu zaten bu pini doğru şekilde (dahili pull-up + anlık buton) kullanır, ek kablolama gerekmez; bu da projeyi ekstra bileşen gerektirmeden, sadece bir LED ile tamamlanabilir hale getirir.
Test Bilgisi
İlk yüklemeden sonra telefonunuzun WiFi listesinde 'DevreAI-Kurulum' ağını görün ve şifre 12345678 ile bağlanın. Otomatik açılan sayfada (açılmazsa tarayıcıdan manuel olarak 192.168.4.1 adresine gidin) 'Configure WiFi' seçeneğiyle ev ağınızı listeden seçip şifresini girin. Cihaz kısa bir süre sonra yeniden başlayıp doğrudan ev ağınıza bağlanmalı, LED sabit yanmalı; router'ı yeniden başlatıp cihazın kayıtlı bilgilerle otomatik yeniden bağlandığını da ayrıca doğrulayın.
Olası Sorunlar ve Çözümleri
Captive portal sayfası telefon tarayıcısında otomatik açılmıyorsa: bazı telefonlar 'internet yok' uyarısı verip bağlanmayı reddedebilir veya bildirim olarak gösterebilir, bu durumda tarayıcıdan manuel olarak 192.168.4.1 adresine gidin. AP moduna hiç geçmiyorsa: WiFiManager kütüphanesinin 2.x sürümünü kullandığınızdan emin olun (0.x sürümler ESP32 ile uyumsuzdur ve derleme hatası verebilir). Kayıtlı ağa bağlanamayıp sürekli AP açıyorsa: ev ağınızın 2.4GHz olduğundan emin olun (ESP32 5GHz WiFi desteklemez) ve SSID/şifrede Türkçe karakter veya boşluk olup olmadığını kontrol edin.
Alternatif Çözümler
Sabit AP şifresi yerine WPS destekli otomatik bağlanma eklenerek kullanıcının şifre bile girmesine gerek kalmayan bir akış kurulabilir. wm.setAPCallback() ile AP moduna geçildiğinde bir buzzer veya farklı bir LED deseniyle kullanıcı 'kurulum moduna girildi' diye bilgilendirilebilir. Statik IP, özel MQTT sunucu adresi gibi ek alanlar WiFiManagerParameter ile portala eklenerek, tek seferlik WiFi girişinin ötesinde tam bir 'ilk kurulum sihirbazı' deneyimi oluşturulabilir.
Benzer Projeler
mDNS ile Otomatik Cihaz Keşfi (Zero-Config)
Cihazın IP adresini ezberlemeden, ağdaki herkesin tarayıcıdan sabit bir isimle (örn. http://devreai-lamba.local) erişebilmesini sağlamayı öğretir — DHCP her seferinde farklı bir IP verse bile isim her zaman aynı kalır. ESP32'nin ESPmDNS kütüphanesi, WiFi ağı üzerinden Bonjour/Avahi uyumlu mDNS (multicast DNS) protokolünü çalıştıracak ağ yığınına ve işlem gücüne sahiptir. Bu protokol Arduino Uno'da çalıştırılamaz: mDNS bir ağ protokolüdür ve çalışması için TCP/IP yığını ile bir ağ arayüzü gerekir, Uno'da ikisi de bulunmaz.
NTP Zaman Senkronizasyonlu Otomatik Eylem Planlayıcı
WiFi üzerinden NTP (Network Time Protocol) sunucusuyla gerçek dünya saatini senkronize edip, bu saate göre belirli zamanlarda (örn. her gün 07:00 ve 19:00) bir röleyi otomatik tetiklemeyi öğretir — harici bir RTC modülüne veya manuel saat girişine hiç gerek kalmadan. ESP32'nin WiFi bağlantısı sayesinde configTime() ile saniyeler içinde internetten doğru zamanı alıp dahili saatini senkronize edebilir. Arduino Uno'da aynı otomatiklik sağlanamaz: kartın NTP sunucusuna ulaşacak hiçbir ağ bağlantısı yoktur; zaman bilgisi için mutlaka harici bir pilli RTC modülü (DS3231 gibi) eklenip elle veya USB üzerinden bir kerelik saat ayarlanması gerekir, kendiliğinden senkronizasyon mümkün değildir.
OTA Kablosuz Firmware Güncelleme Sistemi
ESP32'nin dahili çift OTA (Over-The-Air) flash partisyon şemasını kullanarak, sahaya kurulmuş bir cihaza tekrar USB kablosu takmadan tamamen kablosuz şekilde yeni firmware yüklemeyi öğretir — özellikle tavana, duvara veya erişimi zor bir noktaya monte edilmiş onlarca cihazı yönetirken zaman ve emek kazandıran pratik bir yetenektir. ESP32'nin flash belleği kalkınma sırasında bir 'factory' bölümü ile iki ayrı OTA partisyonuna bölünebilir; cihaz yeni kodu ağdan indirip o an boş olan partisyona yazar, bütünlük kontrolünden geçerse oradan açılış yapar ve önceki çalışan sürüm otomatik olarak yedek konumunda kalır, böylece yarım kalan veya bozuk bir güncelleme cihazı kullanılamaz hale getirmez. Bu iki katmanlı flash mimarisi ESP32'ye özgüdür: Arduino Uno'nun ATmega328P'sinde toplam flash belleği zaten 32KB'dir ve sketch kodunun kendisi bu alanın büyük bölümünü kapladığından ikinci bir tam firmware kopyasına yer kalmaz; kartta WiFi donanımı da bulunmadığından ağ üzerinden güncelleme almak zaten söz konusu değildir.