ESP32 Projeleri
#16Orta

SPIFFS/LittleFS ile Dahili Dosya Sisteminden Web Üzerinden Medya Streaming

~1,5 saatDosya sistemi/partisyon kavramına aşinalık faydalı

Proje Amacı

ESP32'nin 4MB'lık dahili flash belleğinin bir kısmını LittleFS dosya sistemi olarak bölümleyip, içine yüklenen bir ses veya görüntü dosyasını WiFi üzerinden HTTP ile parça parça (chunked) akış olarak tarayıcıya sunmayı öğretir — harici bir SD kart olmadan, cihazın kendi hafızasından medya sunumu yapılabilmesini sağlar. ESP32'nin yeterli dahili flash'ı LittleFS gibi gerçek bir dosya sistemi partisyonuna ayırabilir ve WiFi ile bu dosyaları HTTP response olarak akıtabilecek bir ağ yığınına sahiptir. Bu senaryo Arduino Uno'da kurulamaz: toplam 32KB flash zaten sketch koduna gittiğinden bir medya dosyası bir yana, birkaç kilobaytlık bir metin dosyası için bile dosya sistemi partisyonu ayıracak yer kalmaz; WiFi de bulunmadığından zaten akıtacak bir ağ arayüzü de yoktur.

Gerekli Malzemeler

  • ESP32 DevKit V1 (38 pin)
  • Durum LED'i
  • 220Ω direnç
  • Breadboard
  • Jumper kablolar
  • USB kablo (dosya yüklemek için)

Gerekli Kütüphaneler

LittleFS.h (ESP32 core >= 2.0.0 ile gelir, ek kurulum gerekmez). Arduino IDE için 'ESP32 Sketch Data Upload' eklentisi (dosyaları /data klasöründen LittleFS'e yüklemek için) veya PlatformIO'nun dahili 'Upload Filesystem Image' komutu.

Pin Bağlantıları

Bileşen PiniBağlantı
Durum LED anot (220Ω)
GPIO4
LED katot
GND

Devre Şeması

ESP32 Kodu

esp32-16-spiffs-littlefs-ile-dahili-dosya-sisteminden-web-uzerinden-medya-streaming.ino
1#include <WiFi.h>
2#include <LittleFS.h>
3#include <WebServer.h>
4
5const char* ssid = "WIFI_ADINIZ";
6const char* password = "WIFI_SIFRENIZ";
7const int LED = 4;
8
9WebServer server(80);
10
11void medyaAkisiVer() {
12 String dosyaAdi = "/muzik.mp3"; // önceden LittleFS'e yüklenmiş olmalı
13 if (!LittleFS.exists(dosyaAdi)) {
14 server.send(404, "text/plain", "Dosya bulunamadi. Once LittleFS'e /muzik.mp3 yukleyin.");
15 return;
16 }
17 File dosya = LittleFS.open(dosyaAdi, "r");
18 server.sendHeader("Content-Disposition", "inline; filename=muzik.mp3");
19 server.streamFile(dosya, "audio/mpeg"); // parça parça (chunked) akış, tüm dosyayı RAM'e yüklemez
20 dosya.close();
21}
22
23void anaSayfa() {
24 String html = "<html><body style='font-family:sans-serif;text-align:center;padding-top:40px'>";
25 html += "<h2>DevreAI Dahili Medya Sunucusu</h2>";
26 html += "<audio controls src='/muzik.mp3' style='width:80%'></audio>";
27 html += "</body></html>";
28 server.send(200, "text/html", html);
29}
30
31void setup() {
32 Serial.begin(115200);
33 pinMode(LED, OUTPUT);
34
35 if (!LittleFS.begin(true)) { // true: dosya sistemi bozuksa otomatik formatla
36 Serial.println("LittleFS başlatılamadı!");
37 return;
38 }
39 Serial.printf("LittleFS hazır. Toplam: %u KB, Kullanılan: %u KB\n",
40 LittleFS.totalBytes() / 1024, LittleFS.usedBytes() / 1024);
41
42 WiFi.begin(ssid, password);
43 while (WiFi.status() != WL_CONNECTED) { delay(400); Serial.print("."); }
44 Serial.println("\nBağlandı: " + WiFi.localIP().toString());
45 digitalWrite(LED, HIGH);
46
47 server.on("/", anaSayfa);
48 server.on("/muzik.mp3", medyaAkisiVer);
49 server.begin();
50}
51
52void loop() {
53 server.handleClient();
54}

Çalışma Açıklaması

server.streamFile() dosyayı tamamen RAM'e yüklemez, parça parça (chunk chunk) okuyup gönderir — bu sayede birkaç yüz KB'lık bir dosya bile ESP32'nin sınırlı RAM'ini taşırmadan akıtılabilir. LittleFS.begin(true) parametresi ilk kullanımda dosya sistemini otomatik formatlar; halihazırda veri varsa bu adım atlanır, sadece bozuk veya hiç formatlanmamış flash'ta devreye girer.

Test Bilgisi

Arduino IDE'de 'ESP32 Sketch Data Upload' eklentisiyle (veya PlatformIO ile) proje klasöründeki /data/muzik.mp3 dosyasını LittleFS'e yükleyin (küçük, birkaç yüz KB'lık bir dosyayla test edin, 4MB flash'ın büyük kısmı zaten koda ayrılmıştır). Kodu yükleyip Seri Monitör'den IP'yi alın, tarayıcıdan bu IP'ye gidin; sayfadaki oynatıcıdan müzik kesintisiz çalmalı, ileri/geri sarma da (tarayıcının HTTP Range desteğiyle) sorunsuz çalışmalı.

Olası Sorunlar ve Çözümleri

'Dosya bulunamadi' hatası: dosyanın gerçekten LittleFS'e yüklendiğinden emin olun (Sketch Data Upload çalıştırıldıktan sonra Seri Monitör'deki 'Kullanılan KB' değerinin arttığını kontrol edin). Yükleme aracı flash'a yazamıyorsa: Tools > Partition Scheme'de yeterli SPIFFS/LittleFS alanı ayıran bir şema ('Default 4MB with spiffs' gibi) seçili olduğundan emin olun. Ses tarayıcıda takılıyorsa: dosya boyutunun makul (birkaç MB'ın altında) olduğundan ve aynı anda başka bir istemcinin aynı dosyayı çekmediğinden emin olun, WebServer sınıfı tek seferde tek isteği rahat işler.

Alternatif Çözümler

Tek dosya yerine LittleFS.open('/', 'r') ile dizin listeleme yapılıp, yüklenen tüm medya dosyalarını gösteren dinamik bir oynatma listesi (playlist) sayfası oluşturulabilir. Sabit kodlanmış dosya adı yerine bir HTTP POST endpoint'i eklenerek tarayıcıdan doğrudan dosya yükleme (upload) özelliği eklenebilir. LittleFS yerine proje #18'deki gibi harici bir SD kart kullanılarak çok daha büyük medya kütüphaneleri (GB seviyesinde) desteklenebilir.

Bu projenin kodunu AI ile özelleştir

Farklı pin, ek özellik ya da başka bir sensör mü istiyorsun?

Benzer Projeler

Orta

OTA Kablosuz Firmware Güncelleme Sistemi

ESP32'nin dahili çift OTA (Over-The-Air) flash partisyon şemasını kullanarak, sahaya kurulmuş bir cihaza tekrar USB kablosu takmadan tamamen kablosuz şekilde yeni firmware yüklemeyi öğretir — özellikle tavana, duvara veya erişimi zor bir noktaya monte edilmiş onlarca cihazı yönetirken zaman ve emek kazandıran pratik bir yetenektir. ESP32'nin flash belleği kalkınma sırasında bir 'factory' bölümü ile iki ayrı OTA partisyonuna bölünebilir; cihaz yeni kodu ağdan indirip o an boş olan partisyona yazar, bütünlük kontrolünden geçerse oradan açılış yapar ve önceki çalışan sürüm otomatik olarak yedek konumunda kalır, böylece yarım kalan veya bozuk bir güncelleme cihazı kullanılamaz hale getirmez. Bu iki katmanlı flash mimarisi ESP32'ye özgüdür: Arduino Uno'nun ATmega328P'sinde toplam flash belleği zaten 32KB'dir ve sketch kodunun kendisi bu alanın büyük bölümünü kapladığından ikinci bir tam firmware kopyasına yer kalmaz; kartta WiFi donanımı da bulunmadığından ağ üzerinden güncelleme almak zaten söz konusu değildir.

Orta

Watchdog + Otomatik Yeniden Bağlanma ile Endüstriyel Güvenilirlik

ESP-IDF'in görev bazlı donanımsal Task Watchdog Timer'ını (TWDT) kullanarak, ana döngü belirli bir süre 'nefes almazsa' (donarsa) cihazı otomatik olarak yeniden başlatmayı; ayrıca WiFi bağlantısı koptuğunda üstel geri çekilmeyle (exponential backoff) otomatik yeniden bağlanmayı öğretir — insansız çalışan sahadaki bir cihazın kendi kendini toparlaması için endüstriyel projelerde standart kabul edilen bir güvenilirlik desenidir. ESP32'nin FreeRTOS çekirdeği, her görevi (task) ayrı ayrı izleyebilen donanım destekli bir watchdog mekanizması sunar. Bu düzeyde bir izleme Arduino Uno'da kurulamaz: Uno'nun donanımsal watchdog'u (WDT) çok daha kaba bir genel zamanlayıcıdır, görev/task kavramı yoktur (bir RTOS çalıştıramaz) ve zaten yeniden bağlanacak bir WiFi bağlantısı da bulunmaz.

Orta

TLS/SSL ile Şifreli MQTT Veri Yayını

Sıcaklık/nem verisini, sertifika tabanlı TLS/SSL şifrelemesiyle (WiFiClientSecure) bir MQTT broker'a güvenli şekilde yayınlamayı öğretir — düz metin (plaintext) MQTT'nin aksine veri yolda kimse tarafından okunamaz veya değiştirilemez. ESP32'nin donanımsal AES/SHA kripto hızlandırıcısı, TLS el sıkışmasını (handshake) makul bir sürede tamamlayacak işlem gücünü sağlar; 520KB SRAM'i ise TLS oturum arabelleklerini, sertifika zincirini ve şifreleme durumunu aynı anda bellekte tutabilir. Bu kapasite Arduino Uno'da bulunmaz: kartın sadece 2KB SRAM'i vardır ve tek bir TLS sertifikası bile bu belleğe sığmaz; kripto hızlandırma donanımı ve WiFi radyosu da zaten mevcut değildir, dolayısıyla şifreli bir ağ bağlantısı kurmanın önünde temel bir donanım sınırı vardır.