Merhabalar. Bugün sizlere ESP32 ile Wi-Fi’ye bağlanmayı ve üzerinde çalışan bir web server kurmayı anlatacağım. ESP32, içinde Wi-Fi ve Bluetooth barındıran, ucuz ve güçlü bir mikrodenetleyicidir. Birçok IoT projesinin beynidir. Bu yazının sonunda, telefonunuzun veya bilgisayarınızın tarayıcısından ESP32’nin bir pinini açıp kapatabileceksiniz. Harika, değil mi?
ESP32 Nedir?
ESP32, Espressif Systems tarafından üretilen bir mikrodenetleyicidir. Çift çekirdekli 240 MHz işlemcisi, 520 KB SRAM’i ve dahili Wi-Fi/Bluetooth modülü ile birçok projeye yetecek gücü vardır. Üstelik fiyatı son derece uygundur — 5-10 dolar arası değişir.
Bu yazıda ESP32’yi bir web server olarak kullanacağız. Yani ESP32’yi Wi-Fi ağına bağlayacağız, üzerine küçük bir HTTP sunucusu kuracağız ve tarayıcıdan bir LED’i açıp kapatacağız. Bu, IoT dünyasına atılacak en güzel ilk adımlardan biridir.
1. Arduino IDE’ye ESP32 Desteği Ekleme
ESP32 ile kod yazmak için en kolay yol Arduino IDE kullanmaktır. Ancak Arduino IDE varsayılan olarak ESP32’yi tanımaz. Önce ESP32 board paketini eklememiz gerekir.
Arduino IDE’yi açın ve şu adımları takip edin:
- File → Preferences menüsünü açın.
- “Additional Board Manager URLs” alanına şu adresi yapıştırın:
https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json
- OK ile pencereyi kapatın.
- Tools → Board → Boards Manager menüsünü açın.
- Arama kutusuna “esp32” yazın.
- “ESP32 by Espressif Systems” paketini bulun ve Install butonuna basın.
Kurulum birkaç dakika sürebilir (yaklaşık 1.2 GB indirme yapar). Kurulum bitince Tools → Board menüsünden kartınızı seçin. En yaygın olanı “ESP32 Dev Module” seçeneğidir.
Kartı USB ile bilgisayara bağlayın ve Tools → Port menüsünden doğru COM portunu seçin.
2. Devre Kurulumu
Bu projede ESP32’nin GPIO 2 pinine bir LED bağlayacağız. LED’in uzun bacağı (+) GPIO 2’ye, kısa bacağı (-) ise 330Ω direnç üzerinden GND’ye gidecek.
Basit bağlantı şeması:
ESP32 GPIO 2 —-[LED +]—-[LED -]—-[330Ω]—- ESP32 GND
Eğer elinizde hazır bir LED ve direnç yoksa, ESP32’nin üzerindeki dahili LED’i de kullanabilirsiniz (genellikle GPIO 2’ye bağlıdır). Bu durumda hiçbir devre kurmanıza gerek yok, sadece kodu yüklemeniz yeterli.
3. Wi-Fi’ye Bağlanma
Önce ESP32’yi Wi-Fi ağınıza bağlayan basit bir kod yazalım. Bu adım, web server’ı kurmadan önce gelmelidir çünkü sunucumuz bir IP adresine ihtiyaç duyar.
Arduino IDE’de yeni bir sketch açın ve şu kodu yapıştırın:
#include <WiFi.h>
const char* ssid = "WIFI_ADINIZ";
const char* password = "WIFI_SIFRENIZ";
void setup() {
Serial.begin(115200);
delay(1000);
WiFi.begin(ssid, password);
Serial.print(“Wi-Fi’ye baglaniliyor”);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(“.”);
}
Serial.println();
Serial.println(“Wi-Fi’ye baglandi!”);
Serial.print(“IP adresi: “);
Serial.println(WiFi.localIP());
}
void loop() {
// Bu örnekte loop boş, sadece bağlantı testi yapıyoruz
}
Kodu yükleyin ve Tools → Serial Monitor‘ü açın (baud rate’i 115200 olarak ayarlayın). Şuna benzer bir çıktı görmelisiniz:
Wi-Fi'ye baglaniliyor...
Wi-Fi'ye baglandi!
IP adresi: 192.168.1.42
Bu IP adresini bir kenara not edin. Web server’ı kurduğumuzda tarayıcıdan bu adrese gireceğiz.
ssid ve password değişkenlerini kendi Wi-Fi bilgilerinizle değiştirmeyi unutmayın. ESP32 2.4 GHz ağlara bağlanır; 5 GHz ağları desteklemez. Eğer router’ınız ikisini de yayınlıyorsa, 2.4 GHz olanı kullandığınızdan emin olun.
4. Web Server Kurma ve LED Kontrolü
Şimdi asıl eğlenceli kısma geçelim. ESP32 üzerinde bir HTTP web server çalıştıracağız ve tarayıcıdan LED’i açıp kapatacağız.
İşte tam kod:
#include <WiFi.h>
#include <WebServer.h>
const char* ssid = "WIFI_ADINIZ";
const char* password = "WIFI_SIFRENIZ";
WebServer server(80);
const int ledPin = 2;
bool ledDurum = false;
void anaSayfa() {
String html = “
html += ““;
html += “
html += “ “;
html += “
ESP32 LED Kontrol
“;
html += “
LED durumu: “;
html += ledDurum ? “ACIK” : “KAPALI”;
html += “
“;
if (ledDurum) {
html += ““;
} else {
html += ““;
}
html += ““;
server.send(200, “text/html”, html);
}
void ledAc() {
ledDurum = true;
digitalWrite(ledPin, HIGH);
Serial.println(“LED acildi”);
anaSayfa();
}
void ledKapat() {
ledDurum = false;
digitalWrite(ledPin, LOW);
Serial.println(“LED kapatildi”);
anaSayfa();
}
void setup() {
Serial.begin(115200);
pinMode(ledPin, OUTPUT);
digitalWrite(ledPin, LOW);
WiFi.begin(ssid, password);
Serial.print(“Wi-Fi’ye baglaniliyor”);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(“.”);
}
Serial.println();
Serial.print(“Baglandi! IP: “);
Serial.println(WiFi.localIP());
server.on("/", anaSayfa);
server.on("/ac", ledAc);
server.on("/kapat", ledKapat);
server.begin();
Serial.println(“Web server baslatildi.”);
}
void loop() {
server.handleClient();
}
Kodu yükleyin, Serial Monitor’ü açın ve IP adresini not edin. Sonra telefonunuzun veya bilgisayarınızın tarayıcısına bu IP adresini yazın.
Karşınıza şöyle bir sayfa gelecek:
- Başlık: “ESP32 LED Kontrol”
- LED durumu: KAPALI
- Yeşil bir “LED’i Ac” butonu
Butona bastığınızda LED yanacak ve sayfa “LED’i Kapat” kırmızı butonuna dönüşecek. Tekrar bastığınızda sönecek. İşte bir IoT cihazı yaptınız!
Kod Nasıl Çalışıyor?
Adım adım inceleyelim:
WiFi.begin(): ESP32’yi Wi-Fi ağına bağlar. ssid ve password parametrelerini alır.
while (WiFi.status() != WL_CONNECTED): Bağlanana kadar bekler. Bu döngü içinde delay(500) ile her yarım saniyede bir kontrol ederiz.
WebServer server(80): 80 portunda (HTTP varsayılan portu) bir web server nesnesi oluşturur.
server.on(“/”, anaSayfa): Kök dizine (örneğin http://192.168.1.42/) gelen istekleri anaSayfa fonksiyonuna yönlendirir.
server.on(“/ac”, ledAc): /ac path’ine gelen istekleri ledAc fonksiyonuna yönlendirir. Yani butona tıkladığınızda tarayıcı http://192.168.1.42/ac adresine gider ve bu fonksiyon çalışır.
server.send(200, “text/html”, html): HTTP 200 OK yanıtı gönderir, içeriğin HTML olduğunu belirtir ve html string’ini gönderir.
server.handleClient(): loop() içinde sürekli çağrılır. Gelen HTTP isteklerini dinler ve ilgili fonksiyonlara yönlendirir. Bu fonksiyon çağrılmazsa server hiçbir isteğe cevap vermez.
anaSayfa() fonksiyonu: HTML sayfasını string olarak oluşturur. ledDurum değişkenine göre butonun rengini ve etiketini değiştirir.
ledAc() ve ledKapat(): LED’i açar/kapatır, durumu Serial Monitor’e yazar ve sonra anaSayfa() çağırarak güncellenmiş sayfayı gösterir. Kullanıcı butona bastığında bir istek gider, LED durumu değişir ve güncel sayfa geri döner.
Access Point (AP) Modu: Router olmadan çalışma
Buraya kadar ESP32’yi mevcut Wi-Fi ağınıza bağladık (Station Mode). Ama ya Wi-Fi yoksa? ESP32 kendi ağını oluşturabilir. Buna Access Point (AP) modu denir.
İşte AP modunda çalışan basit bir örnek:
#include <WiFi.h>
#include <WebServer.h>
const char* ssid_ap = "ESP32-Web";
const char* password_ap = "12345678";
WebServer server(80);
void setup() {
Serial.begin(115200);
WiFi.softAP(ssid_ap, password_ap);
Serial.println("Access Point baslatildi");
Serial.print("IP adresi: ");
Serial.println(WiFi.softAPIP());
server.on(“/”, []() {
server.send(200, “text/html”, “
ESP32 Access Point!
Merhaba!
“);
});
server.begin();
}
void loop() {
server.handleClient();
}
Bu kodda WiFi.softAP() ile ESP32 kendi Wi-Fi ağını oluşturur. Telefonunuzdan “ESP32-Web” ağına bağlanın (şifre: 12345678) ve tarayıcıya 192.168.4.1 yazın. WiFi.softAPIP() varsayılan olarak bu adresi verir.
AP modu, dış ağ bağımlılığı olmadan çalışan projeler için idealdir. Örneğin bir tarım sensoru tarlada çalışıyorsa ve orada Wi-Fi yoksa, ESP32 kendi ağını oluşturur ve siz telefonunuzla bağlanıp verileri okursunuz.
Yaygın Hatalar ve Çözümleri
Hata: “Wi-Fi’ye baglaniliyor…” yazısında takılı kalıyor
En yaygın sorundur. Birkaç olası nedeni vardır:
- SSID veya şifre yanlış girilmiş. Büyük/küçük harf duyarlı olduğundan emin olun.
- Wi-Fi ağınız 5 GHz olabilir. ESP32 sadece 2.4 GHz destekler. Router ayarlarınızdan 2.4 GHz ağını kontrol edin.
- Wi-Fi sinyali zayıf olabilir. ESP32'yi router'a daha yakın bir yere taşıyın.
Hata: “Failed to connect to ESP32: No serial data received”
Kart yükleme sırasında boot moduna giremiyor demektir. Çözüm:
- USB kablosunu veri aktarımını destekleyen bir kabloyla değiştirin (bazı USB kabloları sadece şarj içindir).
- Upload sırasında ESP32'nin <strong>BOOT</strong> butonuna basılı tutun. Yükleme başlayınca bırakabilirsiniz.
- <strong>Tools → Upload Speed</strong>'i 115200'den 921600'e düşürmeyi deneyin.
Hata: “A fatal error occurred: Failed to connect to ESP32: Timed out waiting for packet header”
Bu da yükleme sorunudur. BOOT butonuna basılı tutup RESET butonuna basın, sonra BOOT’u bırakın ve tekrar yüklemeyi deneyin.
Hata: Tarayıcıda sayfa açılmıyor
- IP adresini doğru girdiğinizden emin olun. Serial Monitor’da görünen adresi kullanın.
- Telefonunuzun ESP32 ile aynı Wi-Fi ağında olduğundan emin olun. Eğer telefonunuz mobil verideyse, Wi-Fi’ye bağlanın.
server.handleClient()fonksiyonununloop()içinde olduğundan emin olun.
Hata: Sayfa geliyor ama buton çalışmıyor
- Tarayıcı önbelleğini temizleyin.
- Serial Monitor’da LED açma/kapama mesajları çıkıyor mu kontrol edin. Çıkıyorsa LED ama LED yanmıyorsa, LED’in polaritesini (uzun/kısa bacak) kontrol edin. veya 330Ω direnci doğru takıp takmadığınıza bakın.
Hata: board manager’da ESP32 kurulumu başarısız
- Arduino IDE sürümünüzün güncel olduğundan emin olun (2.x önerilir).
- Additional Board Manager URL’sini doğru yapıştırdığınızdan emin olun.
- İnternet bağlantınızı kontrol edin.
Sonuç
Bugün ESP32’yi Wi-Fi’ye bağlamayı, üzerinde bir web server çalıştırmayı ve tarayıcıdan LED kontrol etmeyi öğrendik. Bu, IoT projelerinin temelidir. Aynı yapıyı kullanarak sensör verilerini web’de görüntüleyebilir, motorları kontrol edebilir veya akıllı ev sistemleri kurabilirsiniz.
İleriye dönük birkaç fikir:
– DHT22 sıcaklık sensörü ekleyip web sayfasında sıcaklık gösterin.
– Birden fazla GPIO’yu kontrol edin (her biri için ayrı buton).
– ESP32’ye bir SD kart takıp web üzerinden dosya sunun.
– Async web server kullanarak daha performanslı sunucu kurun.
Bu projeyi kurduktan sonra kodları değiştirip kendi sayfa tasarımınızı yapabilirsiniz. HTML/CSS bilginizi kullanarak çok daha şık arayüzler oluşturabilirsiniz.
Bir sonraki yazımızda görüşmek üzere. Okuduğunuz için teşekkür ederim!