ESP’de PROGMEM ve ESPAsyncWebServer

Belleği Verimli Kullanarak Asenkron Web Sunucusu Geliştirme Rehberi

ESP8266 ve ESP32, küçük boyutlarına rağmen Wi-Fi destekleri sayesinde oldukça güçlü mikrokontrolcülerdir. Bu kartlarla web sunucuları kurabilir, sensör verilerini web üzerinden izleyebilir, uzaktan kontrol sistemleri geliştirilebilir. Ancak bu gücün bir bedeli vardır: sınırlı RAM.

İşte tam bu noktada iki önemli kavram devreye girer:

  • PROGMEM → RAM’i korumak için verileri flash bellekte saklamak
  • ESPAsyncWebServer → Ana döngüyü kilitlemeden web sunucusu çalıştırmak

Bu yazıda:

  • PROGMEM’in ne olduğunu ve neden önemli olduğunu,
  • ESPAsyncWebServer’ın klasik web sunucularına göre farkını,

Bu iki yapıyı birlikte kullanarak nasıl temiz ve verimli bir ESP yazılımı yazabileceğini
adım adım ele alacağız.


1. ESP’lerde Bellek Problemi: RAM Neden Bu Kadar Kritik?

ESP8266’da yaklaşık 40 KB, ESP32’de ise birkaç yüz KB RAM bulunur. Bu RAM;

  • Değişkenler
  • String’ler
  • Web sayfaları
  • JSON yanıtları
  • Wi-Fi işlemleri

gibi her şey için ortak kullanılır. Şöyle bir hata çok yaygındır:

String html = "<html><head><title>ESP</title></head><body>...</body></html>";

Bu HTML içeriği RAM’e yüklenir. Sayfa biraz büyüyünce:

  • RAM hızla dolar
  • ESP reset atar
  • Garip, takip edilemeyen hatalar oluşur

Çözüm: PROGMEM


2. PROGMEM Nedir?

PROGMEM, sabit verileri RAM yerine flash bellekte saklamanı sağlayan bir mekanizmadır.

Flash bellek:

  • Program kodunun da bulunduğu alandır
  • RAM’e göre çok daha geniştir
  • Sabit (değişmeyen) veriler için idealdir

PROGMEM Ne Zaman Kullanılır?

  • HTML / CSS / JavaScript kodları
  • Sabit metinler
  • Uzun açıklamalar
  • JSON şablonları

Basit Bir PROGMEM Örneği

const char mesaj [] PROGMEM = "Merhaba ESP!"; 

Bu metin RAM’e yüklenmez, doğrudan flash’te durur.


3. PROGMEM ile HTML Sayfası Saklamak

ESP projelerinde en yaygın kullanım alanı web arayüzleridir.

Burada:

const char index_html[] PROGMEM = R"rawliteral(
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>ESP Web</title>
</head>
<body>
  <h1>Merhaba ESP!</h1>
  <p>Bu sayfa PROGMEM’den geliyor.</p>
</body>
</html>
)rawliteral";

Burada:

  • R”rawliteral(…)” sayesinde kaçış karakterleriyle uğraşmayız
  • HTML doğrudan flash bellekte saklanır
  • RAM kullanımın minimuma iner

4. Klasik Web Server Yaklaşımı ve Sorunları

Arduino tarafında klasik yöntem genelde şudur:

WiFiServer server(80);

void loop() {
  WiFiClient client = server.available();
  if (client) {
    // isteği oku
    // cevabı gönder
  }
}

Bu yaklaşımın sorunları:

  • Bloklayıcıdır
  • İstek okunurken loop() durur
  • Sensör okuma, röle kontrolü gecikir
  • Birden fazla istemci zorlaşır

Modern projeler için bu yöntem artık yetersizdir.


5. ESPAsyncWebServer Nedir?

ESPAsyncWebServer, ESP için geliştirilmiş asenkron bir web sunucu kütüphanesidir.

Avantajları

  • loop() içinde bekleme yok
  • Aynı anda birden fazla istemci
  • Daha stabil Wi-Fi
  • JSON, REST API, WebSocket desteği
  • PROGMEM ile kusursuz uyum

ESP tarafında “profesyonel” web projelerinin neredeyse tamamı bu kütüphaneyi kullanır.


6. ESPAsyncWebServer Kurulumu

Arduino IDE için:

  • Library Manager’dan ESPAsyncWebServer
  • AsyncTCP (ESP32) veya ESPAsyncTCP (ESP8266)

kütüphaneleri kurulur.


7. Temel ESPAsyncWebServer Yapısı

#include <ESP8266WiFi.h>
#include <ESPAsyncWebServer.h>

AsyncWebServer server(80);

void setup() {
  WiFi.begin("SSID", "SIFRE");

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
  }

  server.begin();
}

void loop() {
}

Dikkat edilirse:

  • loop() boş
  • Web sunucusu arka planda çalışıyor

8. PROGMEM + ESPAsyncWebServer Birlikte Kullanımı

Şimdi işin en güzel kısmına geldik 🙂

PROGMEM’den HTML Sunmak

server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){
  request->send_P(200, "text/html", index_html);
});

Burada:

  • send_P() → PROGMEM’den veri gönderir
  • HTML RAM’e kopyalanmaz
  • Büyük sayfalar bile sorunsuz çalışır

9. Dinamik Veri Gösterimi (Placeholder Mantığı)

PROGMEM içindeki HTML’e değişken veri ekleyebilirsin.

HTML:

const char index_html[] PROGMEM = R"rawliteral(
<h1>Sıcaklık: %TEMP%</h1>
)rawliteral";
İşleyici Fonksiyon
String processor(const String& var){
  if(var == "TEMP"){
    return String(25.4);
  }
  return String();
}

İşleyici Fonksiyon

String processor(const String& var){
  if(var == "TEMP"){
    return String(25.4);
  }
  return String();
}

Sunum

request->send_P(200, “text/html”, index_html, processor);

request->send_P(200, "text/html", index_html, processor);

Bu yapı:

  • RAM dostudur
  • Temizdir
  • Büyük projelerde hayat kurtarır

10. REST API Örneği

ESPAsyncWebServer ile JSON API yazmak çok kolaydır:

server.on("/api/status", HTTP_GET, [](AsyncWebServerRequest *request){
  request->send(200, "application/json",
    "{\"durum\":\"aktif\",\"deger\":123}");
});

Bu sayede:

  • Mobil uygulama
  • Web panel
  • Başka ESP’ler

ESP ile konuşabilir.


11. PROGMEM Kullanmazsan Ne Olur?

Küçük projelerde fark edilmeyebilir ama:

  • Sayfa büyüdükçe resetler başlar
  • Heap fragmentation oluşur
  • “Exception (28)” gibi hatalar çıkar
  • ESP kararsız çalışır

Bu yüzden PROGMEM bir lüks değil, gerekliliktir.


12. Özet ve Tavsiyeler

PROGMEM

  • RAM’i korur
  • Büyük HTML/CSS için şarttır
  • send_P() ile kullanılmalıdır

ESPAsyncWebServer

  • Bloklamaz
  • Daha hızlıdır
  • Profesyonel projeler için idealdir

Tavsiye Edilen Mimari

  • HTML → PROGMEM
  • Veri → JSON API
  • Arayüz → JavaScript (fetch ile)

Bu yapı ESP’yi küçük bir IoT sunucusuna dönüştürür.


Share your love

Leave a Reply

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir