ESP32 Projeleri
#03Başlangıç

WiFiManager ile Captive Portal Kurulum Sihirbazı

~45 dkArduino IDE'de kütüphane kurmayı bilmek yeterli

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 PiniBağlantı
BOOT düğmesi (kart üzerinde dahili, harici kablolama gerekmez)
GPIO0Strapping pin
Durum LED anot (220Ω üzerinden)
GPIO4
LED katot
GND
Rozetli pinler için "Çalışma Açıklaması" ve "Olası Sorunlar" bölümlerindeki notları kurmadan önce okuyun.

Devre Şeması

ESP32 Kodu

esp32-03-wifimanager-ile-captive-portal-kurulum-sihirbazi.ino
1#include <WiFiManager.h>
2
3const int LED = 4;
4const int BOOT_BUTTON = 0; // kart üzerindeki dahili BOOT düğmesi
5
6WiFiManager wm;
7
8void 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
30void 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.

Bu projenin kodunu AI ile özelleştir

Farklı pin, ek özellik ya da başka bir sensör mü istiyorsun?

Benzer Projeler

Başlangıç

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.

Başlangıç

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.

Orta

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.