Nesnelerin İnterneti (IoT) projelerinde ESP32 geliştirme kartı güçlü Wi-Fi yetenekleriyle öne çıksa da, bazı durumlarda ENC28J60 Ethernet modülü sayesinde daha kararlı ve güvenilir kablolu ağ bağlantıları tercih edilebilir. Bu makalede, ESP32 ve ENC28J60 ikilisini kullanarak yerel ağ üzerinden basit bir web sunucusu oluşturacak ve kartın dahili LED’ini nasıl kontrol edeceğimizi adım adım inceleyeceğiz. Bu yapı, ev otomasyonundan endüstriyel izlemeye kadar birçok alanda temel oluşturabilir.
Neden Kablolu Bağlantı?
Wi-Fi’nin rahatlığına karşın, kablolu Ethernet özellikle parazitin yoğun olduğu veya kesintisiz bağlantının kritik olduğu uygulamalarda üstünlük sağlar. ENC28J60, uygun maliyetli ve SPI arayüzü ile ESP32’ye kolayca entegre olabilen bir Ethernet denetleyicisidir. Bu kombinasyon, projelerinize sağlam bir ağ altyapısı sunar.
Gerekli Malzemeler ve Bağlantı
Bu projeyi gerçekleştirmek için bir ESP32 Geliştirme Kartı, bir ENC28J60 Ethernet Modülü, bağlantı için jumper kabloları ve modülü ağınıza bağlamak için bir Ethernet kablosu yeterlidir. Kodda dahili bir LED kontrol edildiği için ekstra bir LED’e ihtiyacınız olmayacaktır.
ENC28J60’ı ESP32’ye bağlarken SPI pinlerini kullanmanız gerekiyor. Genel ESP32 SPI pinleri şöyledir:
ENC28J60 Pini | ESP32 Pini (Genel SPI) |
---|---|
VCC | 3.3V |
GND | GND |
CS | GPIO5 |
SI | GPIO23 (MOSI) |
SO | GPIO19 (MISO) |
SCK | GPIO18 (SCK) |

Şekil 1: ESP32 ve ENC28J60 Bağlantı Şeması
Kod Yapısı ve Temel Bileşenler
#include <UIPEthernet.h> // ENC28J60 için Ethernet kütüphanesi #define LED_PIN 2 // ESP32 dahili LED genellikle GPIO2 // Ağ ayarları byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; // Cihazın MAC adresi IPAddress ip(192, 168, 1, 50); // ESP32'ye atanacak statik IP adresi IPAddress gateway(192, 168, 1, 1); // Ağ geçidi (router) IP adresi IPAddress subnet(255, 255, 255, 0); // Alt ağ maskesi EthernetServer server(80); // 80 numaralı porttan gelen bağlantıları dinleyen bir web sunucusu nesnesi bool ledDurum = false; // LED'in mevcut durumunu tutan değişken (başlangıçta kapalı) void setup() { pinMode(LED_PIN, OUTPUT); // LED_PIN'i çıkış olarak ayarla digitalWrite(LED_PIN, LOW); // Başlangıçta LED'i kapat Serial.begin(115200); // Seri haberleşmeyi başlat (hata ayıklama için) Ethernet.begin(mac, ip, gateway, subnet); // Ethernet bağlantısını başlat delay(1000); // Ağ başlatma için kısa bir gecikme Serial.print("ESP32 IP: "); Serial.println(Ethernet.localIP()); // Atanan IP adresini seri monitöre yazdır server.begin(); // Web sunucusunu başlat } void loop() { EthernetClient client = server.available(); // Yeni bir istemci bağlantısı var mı kontrol et if (client) { // Eğer bir istemci bağlantısı varsa String req = ""; // Gelen HTTP isteğini tutacak boş bir string while (client.connected()) { // İstemci bağlı olduğu sürece if (client.available()) { // İstemciden veri var mı kontrol et char c = client.read(); // Gelen karakteri oku req += c; // Karakteri isteğe ekle if (c == '\n') { // Eğer bir satır sonu karakteriyse (istek bitti demektir) // Gelen isteği kontrol et if (req.indexOf("GET /ac") >= 0) { // İstekte "/ac" varsa (LED'i aç komutu) ledDurum = true; digitalWrite(LED_PIN, HIGH); } else if (req.indexOf("GET /kapat") >= 0) { // İstekte "/kapat" varsa (LED'i kapat komutu) ledDurum = false; digitalWrite(LED_PIN, LOW); } // Web sayfası cevabı oluştur client.println("HTTP/1.1 200 OK"); // HTTP başlığı: Her şey yolunda client.println("Content-Type: text/html"); // İçerik tipi: HTML client.println("Connection: close"); // Bağlantıyı kapat client.println(); // HTTP başlıkları ile gövdesi arasına boş satır client.println("<!DOCTYPE html><html>"); // HTML sayfası başlangıcı client.println("<head><meta charset='UTF-8'><title>ESP32 + ENC28J60 Kontrol Paneli</title></head>"); client.println("<body style='text-align:center;font-family:sans-serif;'>"); client.println("<h1>ESP32 + ENC28J60 Kontrol Paneli</h1>"); client.print("<p>LED DURUMU: <strong>"); client.print(ledDurum ? "AÇIK" : "KAPALI"); // LED durumuna göre "AÇIK" veya "KAPALI" yazdır client.println("</strong></p>"); client.print("<a href='/"); client.print(ledDurum ? "kapat" : "ac"); // Mevcut duruma göre "kapat" veya "ac" linki oluştur client.print("'><button style='padding:10px 20px;font-size:16px;'>LED "); client.print(ledDurum ? "Kapat" : "Aç"); // Buton metnini ayarla client.println("</button></a>"); client.println("</body></html>"); break; // İstemci isteğini işledikten sonra döngüden çık } } } delay(1); // Küçük bir gecikme client.stop(); // İstemci bağlantısını kapat } }
Sağladığınız kod, Arduino IDE ortamında ESP32 için yazılmıştır ve temel olarak üç ana bölümden oluşur: Kütüphane Tanımlama ve Sabitler, setup()
fonksiyonu ve loop()
fonksiyonu.
1. Kütüphane Tanımlama ve Sabitler: Kodun başında, ENC28J60 Ethernet modülü için gerekli UIPEthernet kütüphanesi projeye dahil edilir. ESP32’nin dahili LED’inin bağlı olduğu pin numarası (GPIO2
) LED_PIN
olarak tanımlanır. Ayrıca, cihazınızın MAC adresi, IP adresi, ağ geçidi ve alt ağ maskesi gibi ağ ayarları belirlenir. Web sunucusu için standart HTTP portu olan 80 numaralı port kullanılır. ledDurum
adlı boolean bir değişken ise LED’in mevcut durumunu takip etmek amacıyla false
(kapalı) olarak başlatılır.
2. setup()
Fonksiyonu: Bu fonksiyon, ESP32 kartı ilk başlatıldığında yalnızca bir kez çalışır ve temel ayarları yapar. LED_PIN
bir çıkış olarak ayarlanır ve LED başlangıçta kapatılır. Seri haberleşme (115200 baud hızında) başlatılır. Ethernet.begin()
fonksiyonu, tanımlanan ağ ayarlarıyla ENC28J60 modülünü başlatır ve kısa bir gecikmenin ardından ESP32’ye atanan IP adresi seri monitöre yazdırılır. Son olarak, server.begin()
ile web sunucusu gelen bağlantılar için dinlemeye başlar.
3. loop()
Fonksiyonu: Bu fonksiyon, setup()
tamamlandıktan sonra sürekli olarak tekrar tekrar çalışır ve ana program döngüsünü oluşturur. server.available()
ile yeni bir istemci bağlantısı olup olmadığı sürekli kontrol edilir. Eğer bir istemci bağlanırsa, istemciden gelen HTTP isteği karakter karakter okunarak req
isimli bir stringde depolanır.
4. İstek İşleme ve LED Kontrolü: HTTP isteği tamamlandığında (bir yeni satır karakteri algılandığında), req
stringi kontrol edilir. Eğer istekte “GET /ac” ifadesi bulunursa, ledDurum
true
yapılır ve digitalWrite(LED_PIN, HIGH);
komutuyla dahili LED yakılır. Benzer şekilde, eğer istekte “GET /kapat” ifadesi bulunursa, ledDurum
false
yapılır ve digitalWrite(LED_PIN, LOW);
komutuyla dahili LED kapatılır.
5. Web Sayfası Yanıtı Oluşturma: İsteğin işlenmesinin ardından, ESP32 istemciye (web tarayıcısına) standart HTTP başlıkları ve bir HTML sayfası gönderir. Bu HTML sayfası, basit bir kontrol paneli arayüzüdür:
- “ESP32 + ENC28J60 Kontrol Paneli” başlığı bulunur.
- LED’in mevcut durumunu (“AÇIK” veya “KAPALI”) gösteren bir metin gösterilir.
- LED’in mevcut durumuna göre metni (“Kapat” veya “Aç”) ve linki (
/kapat
veya/ac
) dinamik olarak değişen bir buton bulunur. Bu buton sayesinde kullanıcı tek bir tıklama ile LED’in durumunu değiştirebilir. Yanıt gönderildikten sonrabreak;
komutuyla mevcut istemci döngüsünden çıkılır.
6. Bağlantının Kapatılması: Bir milisaniyelik kısa bir gecikmenin ardından, client.stop()
ile istemci ile olan bağlantı kapatılır. Bu, sunucunun yeni bağlantıları kabul etmeye hazır olmasını sağlar ve loop()
fonksiyonu tekrar başa dönerek yeni istekleri dinlemeye devam eder.
Projeyi Çalıştırma
- Yukarıdaki kodu Arduino IDE’ye yapıştırın.
- Araçlar > Kart menüsünden “ESP32 Dev Module” veya kullandığınız ESP32 kartını seçin.
- Araçlar > Port menüsünden ESP32’nizin bağlı olduğu seri portu seçin.
- Kodu ESP32’nize yükleyin.
- Yükleme tamamlandıktan sonra, ENC28J60 modülünüzü bir Ethernet kablosuyla router’ınıza bağlayın.
- Arduino IDE’deki Seri Monitörü açın. ESP32’nizin atanan IP adresini (
ESP32 IP: 192.168.1.50
gibi) görmelisiniz. - Aynı ağa bağlı bir bilgisayar veya telefondan web tarayıcınızı açın ve Seri Monitörde gördüğünüz IP adresini adres çubuğuna yazın (örneğin,
http://192.168.1.50
). - Karşınıza çıkan basit web sayfasındaki buton ile ESP32’nizin dahili LED’ini kolayca açıp kapatabilirsiniz!

Şekil 2: Web Arayüzü Kontrol Paneli Örnek Çıktısı
Bu proje, ESP32 ve ENC28J60’ın kablolu ağ iletişim yeteneklerini sergileyen basit ama güçlü bir örnektir. Bu temeli kullanarak daha karmaşık IoT cihazları ve otomasyon sistemleri geliştirebilirsiniz.