ESP32 S3 Kamera - Alle paar Sekunden ein Foto auf SD-Karte speichern

Dieses Tutorial zeigt Ihnen, wie Sie eine ESP32 S3 Kamera bauen, die alle paar Sekunden ein Foto aufnimmt und es auf einer microSD-Karte speichert. Das Board arbeitet allein. Es braucht kein WLAN und keinen Computer. Sie versorgen es nur mit Strom, und es füllt die Karte mit Fotos.

ESP32 S3 Kamera - Alle paar Sekunden ein Foto auf SD-Karte speichern

Was Sie bauen werden:

  1. Eine ESP32 S3 Kamera, die alle 30 Sekunden ein Foto aufnimmt
  2. Fotos, die auf einer microSD-Karte als photo_00001.jpg, photo_00002.jpg und so weiter gespeichert werden
  3. Code, der Ihre alten Fotos nie überschreibt, selbst nach einem Neustart des Boards
  4. Eine Zeitraffer-Kamera, die Sie stundenlang allein lassen können

Erforderliche Hardware

1×ESP32 S3 N16R8 OV5640 Camera
1×(Alternativ) ESP32 S3 N16R8 OV2640 Camera
1×microSD Card
1×USB-Kabel Typ-A zu Typ-C (für USB-A PC)
1×USB-Kabel Typ-C zu Typ-C (für USB-C PC)
1×(Optional) DC-Stromanschluss
1×(Empfohlen) Screw Terminal Expansion Board for ESP32 S3
1×(Empfohlen) Breakout Expansion Board for ESP32 S3
1×(Empfohlen) Power Splitter for ESP32 S3

Oder Sie können die folgenden Kits kaufen:

1×DIYables Sensor-Kit (18 Sensoren/Displays)
Offenlegung: Einige der in diesem Abschnitt bereitgestellten Links sind Amazon-Affiliate-Links. Wir können eine Provision für Käufe erhalten, die über diese Links getätigt werden, ohne zusätzliche Kosten für Sie. Wir schätzen Ihre Unterstützung.

※ Notiz:

Das ESP32 S3 Kamera-Board hat 40 Pins, aber der Schraubklemmenblock und das Breakout-Board haben 44 Pins. Sie funktionieren trotzdem zusammen. Setzen Sie das Kamera-Board in die Mitte des 44-Pin-Boards, sodass auf der linken Seite 2 Pins frei bleiben und auf der rechten Seite 2 Pins frei bleiben.

Mit dem Schraubklemmenblock können Sie Drähte mit einem Schraubendreher anschließen, ganz ohne Löten. Das Breakout-Board bietet Ihnen einfache Stiftleisten für ein Breadboard.

Überblick über microSD Card on ESP32 S3

Das ESP32 S3 Kamera-Board hat einen microSD-Kartensteckplatz. Die Karte ist ein sehr guter Ort für Fotos, weil:

  • Ein Foto zu groß für den Speicher des ESP32 S3 ist. Die Karte kann tausende Fotos aufnehmen.
  • Die Karte die Fotos behält, wenn der Strom ausfällt.
  • Sie die Karte herausnehmen und auf Ihrem Computer lesen können.
ESP32 S3 microSD-Kartensteckplatz

Anforderungen an die Karte

PunktWert
KartentypmicroSD oder microSDHC
GrößeBis 32 GB funktioniert am besten
DateisystemFAT32
GeschwindigkeitsklasseClass 10 oder schneller

※ Notiz:

Eine Karte größer als 32 GB wird meist mit dem Dateisystem exFAT geliefert. Der ESP32 S3 kann exFAT nicht lesen. Formatieren Sie die Karte vor der Verwendung als FAT32.

1-Bit-Modus und 4-Bit-Modus

Eine microSD-Karte kann auf zwei Arten mit dem ESP32 S3 kommunizieren:

ModusDatenpinsGeschwindigkeitKönnen wir ihn verwenden?
4-Bit4 PinsSchnellNein. Die Kamera verwendet diese Pins bereits.
1-Bit1 PinLangsamerJa. Diesen verwenden wir.

Der 1-Bit-Modus ist langsamer, aber schnell genug. Ein Foto mit 200 KB wird in weniger als einer Sekunde gespeichert.

Der Code schaltet den 1-Bit-Modus mit dem Wort true ein:

SD_MMC.begin("/sdcard", true); // true means 1-bit mode

Die Pins des Kartensteckplatzes

Der Kartensteckplatz ist bereits im Board verbunden. Sie müssen ihn nicht verdrahten. Aber der Code muss die Pins kennen:

Karten-PinESP32 S3 PinBedeutung
CLKGPIO39Takt
CMDGPIO38Befehle
D0GPIO40Daten

※ Notiz:

Verschiedene Boards verwenden verschiedene Pins für den Kartensteckplatz. Wenn Ihre Karte nicht gefunden wird, sehen Sie sich die Zeichnung Ihres Boards an und ändern Sie die drei Zeilen SD_CLK_GPIO_NUM, SD_CMD_GPIO_NUM und SD_D0_GPIO_NUM oben im Code.

Verdrahtungsdiagramm

In diesem Projekt gibt es keine Verdrahtung. Sie stecken nur die microSD-Karte in den Steckplatz.

ESP32 S3 Kamera SD-Karte Schaltplan

Dieses Bild wurde mit Fritzing erstellt. Klicken Sie, um das Bild zu vergrößern.

  1. Ziehen Sie das USB-Kabel ab.
  2. Stellen Sie sicher, dass das Kameramodul mit seinem Flachbandkabel verbunden ist.
  3. Schieben Sie die microSD-Karte in den Steckplatz, bis Sie ein leises Klicken hören.
  4. Stecken Sie das USB-Kabel ein.

Sicherheitshinweise

Nehmen Sie die Karte niemals heraus, während das Board ein Foto schreibt. Das Foto und manchmal die ganze Karte werden beschädigt. Ziehen Sie immer zuerst das USB-Kabel ab, warten Sie zwei Sekunden und nehmen Sie dann die Karte heraus.

Arduino IDE Einstellungen für die ESP32 S3 Kamera

Die Kamera funktioniert nicht mit den Standardeinstellungen der Arduino IDE. Sie müssen einige Punkte im Menü Tools ändern, bevor Sie den Code hochladen.

Menüpunkt in ToolsDiese Auswahl treffen
BoardESP32S3 Dev Module
Flash Size16MB (128Mb)
PSRAMOPI PSRAM
Partition SchemeHuge APP (3MB No OTA/1MB SPIFFS)
CPU Frequency240MHz (WiFi)
USB ModeHardware CDC and JTAG
Upload ModeUART0 / Hardware CDC
Upload Speed921600
USB CDC On BootEnabled

※ Notiz:

PSRAM muss OPI PSRAM sein, und Partition Scheme muss Huge APP sein. Ändern Sie zuerst Flash Size, denn danach ändert sich die Liste der Optionen für Partition Scheme.

So speichern Sie ein Foto auf der SD-Karte

Sie müssen keine Bibliothek installieren. SD_MMC ist bereits im ESP32-Boardpaket enthalten.

  • Binden Sie die beiden Dateien oben in Ihrem Code ein.
#include "FS.h" #include "SD_MMC.h"
  • Teilen Sie der Bibliothek mit, welche Pins der Kartensteckplatz verwendet, und starten Sie dann die Karte im 1-Bit-Modus.
SD_MMC.setPins(39, 38, 40); // CLK, CMD, D0 if (!SD_MMC.begin("/sdcard", true)) { Serial.println("SD card not found"); }
  • Prüfen Sie, ob wirklich eine Karte im Steckplatz steckt.
if (SD_MMC.cardType() == CARD_NONE) { Serial.println("No SD card inside the slot"); }
  • Öffnen Sie eine Datei, schreiben Sie das Foto und schließen Sie die Datei. Das Foto befindet sich in fb->buf, und seine Größe in fb->len.
camera_fb_t *fb = esp_camera_fb_get(); File file = SD_MMC.open("/photo.jpg", FILE_WRITE); file.write(fb->buf, fb->len); file.close(); esp_camera_fb_return(fb);

※ Notiz:

Sie müssen file.close() aufrufen. Wenn Sie es vergessen, bleibt das Foto im Speicher und erreicht nie die Karte.

  • Geben Sie jedem Foto einen anderen Namen, sonst überschreibt das neue Foto das alte.
String makeFileName(int number) { char name[32]; sprintf(name, "/photo_%05d.jpg", number); return String(name); }

%05d bedeutet "die Zahl mit 5 Ziffern schreiben". Die Namen lauten also photo_00001.jpg, photo_00002.jpg, ... Ihr Computer zeigt die Fotos dann in der richtigen Reihenfolge an.

  • Wenn das Board neu startet, beginnt der Zähler wieder bei 1. Um die alten Fotos zu behalten, suchen Sie den ersten freien Namen:
while (SD_MMC.exists(makeFileName(photoNumber))) photoNumber++;
  • Verwenden Sie millis(), um zwischen zwei Fotos zu warten. Verwenden Sie nicht delay(), weil delay() alles anhält.
if (millis() - lastPhotoTime >= PHOTO_INTERVAL) { lastPhotoTime = millis(); takeAndSavePhoto(); }

ESP32 S3 Code

Der folgende Code nimmt alle 30 Sekunden ein Foto auf und speichert es auf der microSD-Karte. Um die Zeit zu ändern, ändern Sie die Zeile #define PHOTO_INTERVAL 30000. Die Zahl ist in Millisekunden angegeben, 30000 bedeutet also 30 Sekunden.

/* * Dieser ESP32 S3 Code wurde von newbiely.de entwickelt * Dieser ESP32 S3 Code wird der Öffentlichkeit ohne jegliche Einschränkung zur Verfügung gestellt. * Für vollständige Anleitungen und Schaltpläne besuchen Sie bitte: * https://newbiely.de/tutorials/esp32-s3/esp32-s3-camera-save-photo-to-sd-card-every-few-seconds */ #include "esp_camera.h" #include "FS.h" #include "SD_MMC.h" #define PHOTO_INTERVAL 30000 // take one photo every 30 seconds (30000 milliseconds) // Camera pins of the ESP32-S3-N16R8 camera board. // The same pins work for the OV2640, OV3660 and OV5640 versions. #define PWDN_GPIO_NUM -1 #define RESET_GPIO_NUM -1 #define XCLK_GPIO_NUM 15 #define SIOD_GPIO_NUM 4 #define SIOC_GPIO_NUM 5 #define Y9_GPIO_NUM 16 #define Y8_GPIO_NUM 17 #define Y7_GPIO_NUM 18 #define Y6_GPIO_NUM 12 #define Y5_GPIO_NUM 10 #define Y4_GPIO_NUM 8 #define Y3_GPIO_NUM 9 #define Y2_GPIO_NUM 11 #define VSYNC_GPIO_NUM 6 #define HREF_GPIO_NUM 7 #define PCLK_GPIO_NUM 13 // Pins of the microSD card slot on the board #define SD_CLK_GPIO_NUM 39 #define SD_CMD_GPIO_NUM 38 #define SD_D0_GPIO_NUM 40 int photoNumber = 1; unsigned long lastPhotoTime = 0; // Returns the name of the camera sensor that is installed on the board const char *getSensorName(int pid) { switch (pid) { case OV2640_PID: return "OV2640 (2 MP, max UXGA 1600x1200)"; case OV3660_PID: return "OV3660 (3 MP, max QXGA 2048x1536)"; case OV5640_PID: return "OV5640 (5 MP, max QSXGA 2592x1944)"; default: return "Unknown sensor"; } } bool initCamera() { camera_config_t config; config.ledc_channel = LEDC_CHANNEL_0; config.ledc_timer = LEDC_TIMER_0; config.pin_d0 = Y2_GPIO_NUM; config.pin_d1 = Y3_GPIO_NUM; config.pin_d2 = Y4_GPIO_NUM; config.pin_d3 = Y5_GPIO_NUM; config.pin_d4 = Y6_GPIO_NUM; config.pin_d5 = Y7_GPIO_NUM; config.pin_d6 = Y8_GPIO_NUM; config.pin_d7 = Y9_GPIO_NUM; config.pin_xclk = XCLK_GPIO_NUM; config.pin_pclk = PCLK_GPIO_NUM; config.pin_vsync = VSYNC_GPIO_NUM; config.pin_href = HREF_GPIO_NUM; config.pin_sccb_sda = SIOD_GPIO_NUM; config.pin_sccb_scl = SIOC_GPIO_NUM; config.pin_pwdn = PWDN_GPIO_NUM; config.pin_reset = RESET_GPIO_NUM; config.xclk_freq_hz = 20000000; config.pixel_format = PIXFORMAT_JPEG; config.frame_size = FRAMESIZE_UXGA; // 1600x1200 - a big, sharp photo config.jpeg_quality = 12; // 0 to 63, a lower number means a better image config.fb_count = 1; config.fb_location = CAMERA_FB_IN_DRAM; config.grab_mode = CAMERA_GRAB_WHEN_EMPTY; if (psramFound()) { config.fb_location = CAMERA_FB_IN_PSRAM; config.jpeg_quality = 10; config.fb_count = 2; config.grab_mode = CAMERA_GRAB_LATEST; } else { config.frame_size = FRAMESIZE_QVGA; Serial.println("WARNING: PSRAM not found. Please set PSRAM to OPI PSRAM in the Tools menu."); } esp_err_t err = esp_camera_init(&config); if (err != ESP_OK) { Serial.printf("Camera init failed with error 0x%x\n", err); return false; } sensor_t *s = esp_camera_sensor_get(); Serial.printf("Camera sensor: %s\n", getSensorName(s->id.PID)); // Each sensor needs slightly different settings switch (s->id.PID) { case OV2640_PID: s->set_vflip(s, 0); s->set_hmirror(s, 0); break; case OV3660_PID: s->set_vflip(s, 1); // the OV3660 image is upside down by default s->set_brightness(s, 1); // make the image a little brighter s->set_saturation(s, -2); // make the colors a little softer break; case OV5640_PID: s->set_vflip(s, 0); s->set_hmirror(s, 0); break; default: break; } return true; } bool initSDCard() { SD_MMC.setPins(SD_CLK_GPIO_NUM, SD_CMD_GPIO_NUM, SD_D0_GPIO_NUM); // true means 1-bit mode. The camera uses the other pins, so we cannot use 4-bit mode. if (!SD_MMC.begin("/sdcard", true)) { Serial.println("SD card not found. Please check the card and push it in again."); return false; } if (SD_MMC.cardType() == CARD_NONE) { Serial.println("No SD card inside the slot"); return false; } Serial.printf("SD card size: %llu MB\n", SD_MMC.cardSize() / (1024 * 1024)); return true; } // Makes a file name like /photo_00001.jpg String makeFileName(int number) { char name[32]; sprintf(name, "/photo_%05d.jpg", number); return String(name); } // Looks for the first free file name, so old photos are never lost void findFirstFreeNumber() { while (SD_MMC.exists(makeFileName(photoNumber))) photoNumber++; Serial.printf("The next photo will be photo_%05d.jpg\n", photoNumber); } void takeAndSavePhoto() { camera_fb_t *fb = esp_camera_fb_get(); if (!fb) { Serial.println("Photo capture failed"); return; } String fileName = makeFileName(photoNumber); File file = SD_MMC.open(fileName.c_str(), FILE_WRITE); if (file) { file.write(fb->buf, fb->len); file.close(); Serial.printf("Saved %s (%u bytes)\n", fileName.c_str(), fb->len); photoNumber++; } else { Serial.printf("Cannot write the file %s\n", fileName.c_str()); } esp_camera_fb_return(fb); // give the memory back to the camera } void setup() { Serial.begin(115200); delay(1000); if (!initCamera()) { Serial.println("Stopped"); while (true) delay(1000); } if (!initSDCard()) { Serial.println("Stopped"); while (true) delay(1000); } findFirstFreeNumber(); takeAndSavePhoto(); // take the first photo now lastPhotoTime = millis(); } void loop() { if (millis() - lastPhotoTime >= PHOTO_INTERVAL) { lastPhotoTime = millis(); takeAndSavePhoto(); } }

Schnelle Schritte

  • Neu beim ESP32 S3? Arbeiten Sie zuerst unsere Anleitung Erste Schritte mit dem ESP32 S3 durch.
  • Formatieren Sie Ihre microSD-Karte auf Ihrem Computer als FAT32.
  • Ziehen Sie das USB-Kabel ab und stecken Sie dann die Karte in den Steckplatz auf dem Board.
  • Kopieren Sie den obigen Code und fügen Sie ihn in die Arduino IDE ein.
  • Ändern Sie die Einstellungen im Menü Tools. Siehe die Tabelle oben.
  • Kompilieren Sie den Code und laden Sie ihn auf das ESP32 S3 Board hoch, indem Sie in der Arduino IDE auf die Schaltfläche Upload klicken.
Arduino IDE Code hochladen
  • Öffnen Sie den Seriellen Monitor in der Arduino IDE.
So öffnen Sie den Seriellen Monitor in der Arduino IDE
  • Drücken Sie einmal die Taste RESET auf dem Board.
  • Warten Sie einige Minuten. Richten Sie die Kamera auf etwas, das sich verändert, zum Beispiel eine Pflanze oder ein Fenster.
  • Ziehen Sie das USB-Kabel ab, nehmen Sie die Karte heraus und lesen Sie sie auf Ihrem Computer.
  • Profi-Tipp: Aus diesen Fotos entsteht ein Zeitraffervideo. Viele kostenlose Programme können die Fotos zu einem Video zusammenfügen.

Serieller Monitor

Der Serielle Monitor zeigt Ihnen den Namen und die Größe jedes Fotos. Die folgenden Messwerte wurden im Jahr 2026 aufgezeichnet:

∞
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
ESP32S3 Dev Module
Newbiely.ino
···
8 Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'ESP32S3 Dev Module' on 'COM15')
New Line
9600 baud
[2026-09-23 11:00:01] Camera sensor: OV5640 (5 MP, max QSXGA 2592x1944) [2026-09-23 11:00:01] SD card size: 15193 MB [2026-09-23 11:00:01] The next photo will be photo_00001.jpg [2026-09-23 11:00:02] Saved /photo_00001.jpg (184320 bytes) [2026-09-23 11:00:32] Saved /photo_00002.jpg (183104 bytes) [2026-09-23 11:01:02] Saved /photo_00003.jpg (185876 bytes) [2026-09-23 11:01:32] Saved /photo_00004.jpg (182992 bytes)
Ln 11, Col 1
ESP32S3 Dev Module on COM15
2

Wenn Sie das Board neu starten, beginnt der Zähler nicht wieder bei 1. Er macht nach Ihrem letzten Foto weiter:

∞
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
ESP32S3 Dev Module
Newbiely.ino
···
8 Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'ESP32S3 Dev Module' on 'COM15')
New Line
9600 baud
[2026-09-23 11:05:00] The next photo will be photo_00005.jpg [2026-09-23 11:05:01] Saved /photo_00005.jpg (184028 bytes)
Ln 11, Col 1
ESP32S3 Dev Module on COM15
2

Wie viele Fotos passen auf die Karte?

Ein Foto mit 1600×1200 ist etwa 180 KB groß. Diese Tabelle hilft Ihnen bei der Planung:

KartengrößeAnzahl der FotosEin Foto alle 30 Sekunden reicht für
8 GBetwa 44.000etwa 15 Tage
16 GBetwa 88.000etwa 30 Tage
32 GBetwa 177.000etwa 61 Tage

※ Notiz:

Möchten Sie kleinere Fotos? Ändern Sie config.frame_size auf FRAMESIZE_SVGA (800×600). Ein Foto ist dann etwa 50 KB groß, sodass die Karte viermal mehr Fotos aufnimmt.

Fehlerbehebung

Der Serielle Monitor zeigt SD card not found.

Probieren Sie Folgendes, eins nach dem anderen:

  • Stecken Sie die Karte erneut ein, bis sie einrastet.
  • Formatieren Sie die Karte als FAT32, nicht als exFAT und nicht als NTFS.
  • Verwenden Sie eine Karte mit 32 GB oder weniger.
  • Vergleichen Sie die drei Pinnummern oben im Code mit der Zeichnung Ihres Boards.

Der Serielle Monitor zeigt No SD card inside the slot.

Das Board hat den Steckplatz gefunden, aber keine Karte. Stecken Sie die Karte erneut ein. Probieren Sie auch eine andere Karte, denn alte Karten fallen oft aus.

Der Serielle Monitor zeigt Cannot write the file.

Die Karte ist voll, gesperrt oder defekt. Prüfen Sie den freien Speicherplatz auf Ihrem Computer.

Die Fotos sind alle schwarz oder alle weiß.

Die Kamera braucht einen Moment für das Licht. Erhöhen Sie PHOTO_INTERVAL und stellen Sie sicher, dass der Raum nicht zu dunkel ist.

Der Serielle Monitor zeigt nach den Startmeldungen nichts an.

Wenn Ihr USB-Kabel im Anschluss mit dem Namen UART steckt, stellen Sie USB CDC On Boot auf Disabled. Wenn es im Anschluss mit dem Namen USB steckt, stellen Sie es auf Enabled.

Der Serielle Monitor zeigt Camera init failed with error 0x105.

Stellen Sie PSRAM im Menü Tools auf OPI PSRAM und prüfen Sie das Flachbandkabel der Kamera.

Anwendungen

Eine Kamera, die alle paar Sekunden ein Foto aufnimmt und auf einer Karte speichert, ist der einfachste Weg zu einem Zeitraffervideo, und sie braucht kein WLAN. Hier sind praktische Projekte, die Sie mit diesem Code bauen können:

  1. Zeitraffer des Pflanzenwachstums: Ein Foto pro Stunde zeigt eine Blüte, die sich in wenigen Sekunden Video öffnet.
  2. Baustellendokumentation: Halten Sie die Arbeit jedes Tages in einem Bild fest und zeigen Sie es Ihrem Kunden.
  3. Zeitraffer von Himmel und Wetter: Fotografieren Sie den ganzen Tag den Himmel und sehen Sie den Wolken beim Ziehen zu.
  4. 3D-Drucker-Zeitraffer: Zeichnen Sie einen langen Druckauftrag auf und machen Sie ein kurzes Video daraus.
  5. Aufzeichnung für Laden und Büro: Führen Sie ein Fotoprotokoll des Raums ohne Internetverbindung.
  6. Schulprojekt in Naturwissenschaften: Beobachten Sie schmelzendes Eis, aufgehendes Brot, eine brennende Kerze oder einen wachsenden Samen.
  7. Sonnenaufgangs- und Sonnenuntergangsvideo: Lassen Sie die Kamera den ganzen Tag an einem Fenster und fügen Sie die Fotos zu einem Video zusammen.
  8. Aquarium- und Terrarium-Beobachter: Sehen Sie, was Ihr Fisch oder Ihr Reptil tut, wenn niemand im Raum ist.
  9. Straßen- und Verkehrsstudie: Zählen Sie die Autos, die im Laufe eines Tages Ihre Straße passieren.
  10. Langzeittest einer Maschine: Nehmen Sie alle 30 Sekunden ein Foto einer Maschine auf, damit Sie den Moment finden, in dem sie ausgefallen ist.

Video Tutorial

Wir erwägen die Erstellung von Video-Tutorials. Wenn Sie Video-Tutorials für wichtig halten, abonnieren Sie bitte unseren YouTube-Kanal , um uns zu motivieren, die Videos zu erstellen.

Sehen Sie sich unten die Schritt-für-Schritt-Videoanleitung für dieses ESP32 S3 Projekt an.

Herausforderungen

  1. Einsteiger: Ändern Sie die Zeit zwischen den Fotos von 30 Sekunden auf 5 Sekunden und dann auf 5 Minuten.
  2. Fortgeschrittene: Speichern Sie die Fotos in Ordnern, einem Ordner pro Tag, zum Beispiel /2026-09-23/photo_00001.jpg.
  3. Profis: Fügen Sie eine Echtzeituhr (RTC) hinzu und schreiben Sie das echte Datum und die Uhrzeit in den Dateinamen.

※ UNSERE NACHRICHTEN

  • Sie können gerne den Link zu diesem Tutorial teilen. Bitte verwenden Sie jedoch unsere Inhalte nicht auf anderen Websites. Wir haben viel Mühe und Zeit in die Erstellung der Inhalte investiert, bitte respektieren Sie unsere Arbeit!