ESP8266 serwer AP z karty CD przykładowy kod
index.htm
) lub generuje listę plików. ESP8266WebServer
) mapuje dowolny URI na odpowiadający mu plik na SD; przy braku pliku zwraca 404. index.htm
(jeśli istnieje) albo wygenerowaną listę plików./*
* ESP8266 AP + Web-Server z karty SD
* przetestowane z: NodeMCU v3, WeMos D1 mini
* biblioteki: ESP8266WiFi.h, ESP8266WebServer.h, SD.h, SPI.h
*/
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <SD.h>
#include <SPI.h>
/* --- KONFIGURACJA --- */
const char* ssid = "ESP8266-AP";
const char* password = "12345678"; // ≥8 znaków (WPA2-PSK)
const uint8_t SD_CS = D2; // CS karty SD (NodeMCU v3 = D2)
/* --- OBIEKTY --- */
ESP8266WebServer server(80);
/* --- POBIERANIE MIME WG ROZSZERZENIA --- */
String getContentType(const String& path)
{
if (path.endsWith(".htm") || path.endsWith(".html")) return "text/html";
else if (path.endsWith(".css")) return "text/css";
else if (path.endsWith(".js")) return "application/javascript";
else if (path.endsWith(".png")) return "image/png";
else if (path.endsWith(".gif")) return "image/gif";
else if (path.endsWith(".jpg")) return "image/jpeg";
else if (path.endsWith(".ico")) return "image/x-icon";
else if (path.endsWith(".xml")) return "text/xml";
else if (path.endsWith(".pdf")) return "application/pdf";
else if (path.endsWith(".zip")) return "application/zip";
return "text/plain";
}
/* --- STRONA GŁÓWNA (lista plików) --- */
void handleRoot()
{
if (SD.exists("/index.htm") || SD.exists("/index.html")) {
// Jeśli na karcie jest index – służ go zamiast listy
String idx = SD.exists("/index.htm") ? "/index.htm" : "/index.html";
File file = SD.open(idx, "r");
server.streamFile(file, getContentType(idx));
file.close();
return;
}
// Wygeneruj prostą listę plików
String html = "<h1>Pliki na karcie SD</h1><ul>";
File root = SD.open("/");
File file = root.openNextFile();
while (file) {
String name = String(file.name());
html += "<li><a href=\"" + name + "\">" + name + "</a> (" + file.size() + " B)</li>";
file.close();
file = root.openNextFile();
}
html += "</ul>";
server.send(200, "text/html", html);
}
/* --- OBSŁUGA NIEZNANYCH URI (pliki lub 404) --- */
void handleFileRequest()
{
String path = server.uri(); // Żądany URI
if (!SD.exists(path)) { // plik nie istnieje
server.send(404, "text/plain", "404 File Not Found");
return;
}
File file = SD.open(path, "r");
server.streamFile(file, getContentType(path));
file.close();
}
/* --- SETUP --- */
void setup()
{
Serial.begin(115200);
delay(200);
/* 1. Inicjalizacja SD */
if (!SD.begin(SD_CS)) {
Serial.println("ERROR: SD init failed – sprawdź zasilanie i pin CS.");
while (true) yield();
}
Serial.println("SD OK");
/* 2. Konfiguracja SoftAP */
WiFi.mode(WIFI_AP);
WiFi.softAPConfig(IPAddress(192,168,4,1),
IPAddress(192,168,4,1),
IPAddress(255,255,255,0));
WiFi.softAP(ssid, password);
Serial.print("AP IP: ");
Serial.println(WiFi.softAPIP());
/* 3. Routing */
server.on("/", HTTP_GET, handleRoot);
server.onNotFound(handleFileRequest);
/* 4. Start serwera */
server.begin();
Serial.println("HTTP server started");
}
/* --- LOOP --- */
void loop() { server.handleClient(); }
SD_CS
(najczęściej D2 lub D8 – zależy od płytki). handleRoot()
zwraca index.htm
jeśli istnieje, w przeciwnym razie buduje listę katalogu głównego. handleFileRequest()
strumieniuje żądany plik z SD (server.streamFile()
wysyła plik fragmentami, nie zapychając RAM-u). getContentType()
gwarantuje prawidłowe nagłówki MIME, aby przeglądarka nie pobierała plików „na siłę”.Pin | Funkcja SD | NodeMCU / WeMos |
---|---|---|
3V3 | VCC | 3V3 |
GND | GND | GND |
MOSI | DI | D7 (GPIO13) |
MISO | DO | D6 (GPIO12) |
SCK | CLK | D5 (GPIO14) |
CS | CS | D2 (GPIO4) -lub- D8 (GPIO15) |
⚠ Karta SD musi być zasilana wyłącznie 3 V 3, logiczne 5 V uszkodzi moduł.
• Coraz częściej zastępuje się SD lokalnym systemem plików LittleFS / SPIFFS – mniej przewodów, szybszy odczyt, OTA-update przez Wi-Fi.
• Do obsługi wielu klientów i WebSocketów zaleca się bibliotekę ESPAsyncWebServer (działa też z SD), ale wymaga wątku AsyncTCP
.
• Pliki można kompresować do .gz
; ESP8266WebServer
sam zwróci nagłówek Content-Encoding: gzip
, jeśli nazwa pliku kończy się na .gz
.
SPI.setFrequency(10000000)
. • Sieć otwarta (bez hasła) niesie ryzyko nadużyć; WPA2-PSK to minimum.
• Udostępnianie treści z karty SD może naruszać prawa autorskie – odpowiada właściciel AP.
• Przechowywanie lub logowanie danych osobowych podlega RODO (UE) / GDPR.
wget --limit-rate
lub ab -n 100 -c 5 http://192.168.4.1/pliki/duzy.bin
pokaże, czy watchdog się nie wiesza. ArduinoOTA
, wrzucaj nowy firmware po Wi-Fi bez kabla USB. DNSServer.h
) – dowolny URL przekieruje na stronę z karty. Dostarczony szkic tworzy sieć Wi-Fi ESP8266 (SoftAP), prawidłowo uruchamia kartę SD, a serwer HTTP udostępnia dowolne pliki (HTML, CSS, JS, grafiki). Rozwiązanie to wystarcza do prostych aplikacji IoT, konfiguratorów offline czy prezentacji danych bez udziału zewnętrznego routera. W miarę potrzeb można przejść na LittleFS lub biblioteki asynchroniczne, a przy większych projektach – na ESP32.
ESP8266 serwer AP z karty CD ,czy na karcie CD mogą być obrazki
Content-Type
oraz poprawna ścieżka do pliku.Architektura rozwiązania
• ESP8266 ↔ czytnik SD (SPI, 3 V DC) ↔ karta microSD
• Biblioteka ESP8266WebServer
(lub bardziej wydajna ESPAsyncWebServer
) obsługuje żądania HTTP.
• Pliki wczytywane są strumieniowo (server.streamFile()
), więc nie zapychają RAM-u.
Obsługiwane formaty i typy MIME
.jpg/.jpeg → image/jpeg
.png → image/png
.gif → image/gif
.bmp → image/bmp
.ico → image/x-icon
.svg → image/svg+xml (tekst, można gzipować)
.webp → image/webp (od Chrome 32+, Edge, Firefox 65+)
Funkcja:
String getContentType(const String &path) {
if (path.endsWith(".png")) return "image/png";
if (path.endsWith(".jpg") || path.endsWith(".jpeg"))
return "image/jpeg";
// ...
return "application/octet-stream";
}
Ścieżka żądania
Przeglądarka wysyła /images/logo.png
; serwer:
if (SD.exists(path)) {
File f = SD.open(path, FILE_READ);
server.streamFile(f, getContentType(path));
f.close();
return true;
}
Wydajność i ograniczenia ESP8266
• SPI do ~8 MHz → ~600 kB/s odczytu z SD; Wi-Fi (802.11 b/g/n) typowo 1–3 Mb/s.
• Serwer obsługuje jedno połączenie naraz (w sync API). Dlatego:
– kompresuj obrazki,
– używaj małych rozdzielczości,
– rozważ ESPAsyncWebServer
, jeśli potrzebnych jest kilka równoległych transferów.
Cache-Control: max-age=604800
) dla grafik. #include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <SD.h>
const char* ssid="ESP_GALLERY";
ESP8266WebServer server(80);
bool handleFileRead(String path){
if (SD.exists(path)){
File f = SD.open(path, "r");
server.streamFile(f, getContentType(path));
f.close();
return true;
}
return false;
}
void setup(){
WiFi.softAP(ssid,"12345678");
SD.begin(D8);
server.onNotFound([](){ if(!handleFileRead(server.uri())) server.send(404,"text/plain","404"); });
server.begin();
}
void loop(){ server.handleClient(); }
convert foto.jpg -resize 1024x768 -quality 80 optimized.jpg
). /css
, /js
, /images
). ESPAsyncWebServer
+ FSBrowser (asynchroniczny menedżer plików). ESP8266 może działać jako punkt dostępu Wi-Fi i jednocześnie serwować dowolne pliki – w tym obrazy – z podłączonej karty SD. Kluczowe jest: prawidłowy nagłówek MIME, poprawne podłączenie SPI 3,3 V, minimalizacja rozmiaru grafik i (dla większej wydajności) ewentualne przejście na asynchroniczny stos serwera. Dzięki temu nawet tak skromny mikrokontroler sprawdzi się jako prosta, autonomiczna „galeria” dostępna bezpośrednio po Wi-Fi.