Book Appointment Now
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.