ESP32 ve ENC28J60 ile Ethernet Tabanlı Gömülü Sistem Geliştirme: Tarayıcıdan Cihaz Kontrolü

ESP32 ve ENC28J60 ile Ethernet Tabanlı Gömülü Sistem Geliştirme: Tarayıcıdan Cihaz Kontrolü

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 PiniESP32 Pini (Genel SPI)
VCC3.3V
GNDGND
CSGPIO5
SIGPIO23 (MOSI)
SOGPIO19 (MISO)
SCKGPIO18 (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 sonra break; 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

  1. Yukarıdaki kodu Arduino IDE’ye yapıştırın.
  2. Araçlar > Kart menüsünden “ESP32 Dev Module” veya kullandığınız ESP32 kartını seçin.
  3. Araçlar > Port menüsünden ESP32’nizin bağlı olduğu seri portu seçin.
  4. Kodu ESP32’nize yükleyin.
  5. Yükleme tamamlandıktan sonra, ENC28J60 modülünüzü bir Ethernet kablosuyla router’ınıza bağlayın.
  6. Arduino IDE’deki Seri Monitörü açın. ESP32’nizin atanan IP adresini (ESP32 IP: 192.168.1.50 gibi) görmelisiniz.
  7. 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).
  8. 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.

Yorumlar kapalı.

nurullahozkan@outlook.com.tr