Produktbilder dienen ausschließlich zu Informationszwecken und können je nach Charge und Lieferant geringfügige Unterschiede aufweisen. Produktspezifikationen und Preise können ohne vorherige Ankündigung geändert werden. Wir tun unser Bestes, um der Produktseite möglichst genaue und richtige Spezifikationen hinzuzufügen, es ist jedoch möglich, dass diese nicht ganz korrekt sind. Sollten Sie einen solchen Fall feststellen, melden Sie ihn uns bitte.
Das Produkt ist für Fachleute bestimmt und erfordert qualifiziertes und autorisiertes Personal. Dem Produkt liegt keine Montage-/Gebrauchsanleitung bei . Die Inbetriebnahme des Produktes durch nicht qualifizierte Personen führt zum Verlust der Garantie gemäß den AGB auf der Seite.
Die angegebenen technischen Spezifikationen (Strom, Leistung usw.) stellen maximale zulässige Werte unter idealen Betriebsbedingungen dar. Für einen sicheren Betrieb und eine optimale Lebensdauer wird empfohlen, das Produkt im Dauerbetrieb mit höchstens 50 % der angegebenen Maximalwerte zu verwenden.
ESP32-CAM-Entwicklungsboard mit CH340G, WLAN, Bluetooth, OV5640 5MP
Kompakte Lösung für Projekte mit künstlicher Vision, Video-Streaming und IoT, mit dual-core ESP32-Prozessor bis zu 240 MHz, WiFi 802.11 b g n und Bluetooth 4.2 LE für drahtlose Steuerung und Übertragung, 5-MP-OV5640-Kamera für detaillierte Bilder, Speicher mit 4 MB PSRAM für effiziente Aufnahmen und Verarbeitung, einfache Programmierung im Arduino IDE über CH340G mit USB Typ C.
Mit dem Kauf dieses Produkts erhalten Sie 4,58 RON an Treuepunkten.
International fast shipping within EU. Free Shipping for orders above 100 EUR in most EU countries.
We ship from our stock within 24H
Sie erhalten bei jeder Bestellung Punkte im Wert von 5 %.
Die ESP32-CAM-Entwicklungsplatine kombiniert auf einem einzigen Modul den ESP32-Prozessor mit WiFi und Bluetooth sowie eine über ein Flexkabel mit dem FPC-Anschluss der Platine verbundene 5-MP-Kamera OV5640. Sie ist eine komplette Lösung für die Erfassung und Übertragung von Bildern in Projekten für künstliche Vision, Video-Streaming und IoT. Die Platine kann eigenständig arbeiten, indem sie Bilder und Videostreams per WiFi ins Netzwerk sendet, oder sie kann so programmiert werden, dass sie auf über UART empfangene Befehle reagiert. Damit eignet sie sich für Überwachung, Objekterkennung, Fernüberwachung und automatisierte Fotografie.
Die Platine wird mit einem dedizierten Programmieradapter geliefert, ausgestattet mit CH340 oder FT232 (je nach Charge), mit USB-Type-C-Anschluss.
Der Prozessor ist ein dualer 32-Bit-LX6-ESP32 mit einer Taktfrequenz von 80 bis 240 MHz und einer Rechenleistung von bis zu 600 DMIPS. Der interne 520-KB-SRAM-Speicher wird durch 4 MB externes PSRAM ergänzt, das für die Verarbeitung hochauflösender Bilder vor der Komprimierung und Übertragung erforderlich ist. Die Kamera OV5640 bietet eine maximale Auflösung von 2592 x 1944 Pixeln (5 MP) und wird über einen 24-poligen FPC-Anschluss verbunden. Das Modul unterstützt WiFi 802.11 b/g/n, Bluetooth 4.2 LE, Bilder im JPEG-, BMP- oder Graustufenformat sowie die Energiesparmodi Deep-sleep, Modem-sleep und Light-sleep.
Zu den wichtigsten Merkmalen gehören der FPC-Kameraanschluss, ein microSD-Kartensteckplatz für Karten bis 4 GB, eine weiße LED als Blitz, eine auf der Platine gedruckte PCB-Antenne, zwei Pinreihen (insgesamt 16 Pins), die Versorgungsspannung, freie GPIOs und die UART-Schnittstelle herausführen, sowie eine RESET-Taste. Die Versorgung erfolgt mit 5 VDC am 5V-Pin mit einer stabilen Stromquelle von mindestens 2 A; die Platine kann auch mit 3,3 VDC über den 3V3-Pin versorgt werden.
Über die UART-Schnittstelle (Pins U0T und U0R) wird die Platine mit einem per USB-Seriell-Adapter an den Computer angeschlossenen Setup programmiert und getestet. Nach der Verbindung mit dem Netzwerk können Bilder und Videostream direkt über einen Browser von jedem Computer oder Telefon im lokalen Netzwerk abgerufen werden. Die übrigen freien GPIO-Pins ermöglichen den Anschluss zusätzlicher Sensoren oder Module, die mit Arduino, ESP32, STM32 oder Raspberry Pi kompatibel sind, unter Verwendung des 3,3-V-Logikpegels der Platine.
Technische Daten:

Versorgungsspannung: 5 VDC (Pin 5V)
Stromverbrauch: 180 mA (Flash-LED aus) / 310 mA (Flash-LED an, maximale Helligkeit)
Stromverbrauch Deep-sleep: mindestens 6 mA
Stromverbrauch Modem-sleep: mindestens 20 mA
Stromverbrauch Light-sleep: mindestens 6,7 mA
Pinanzahl: 16
WiFi: 802.11 b/g/n
Bluetooth: 4.2 LE
CPU: Dual Core LX6, 32 Bit
CPU-Frequenz: 80 - 240 MHz
Interner Speicher: 520 KB SRAM
Externer Speicher: 4 MB PSRAM
SPI-Flash-Speicher: 32 Mbit
Unterstützte Schnittstellen: UART, SPI, I2C, PWM, ADC, DAC
Inklusive Kamera: OV5640, 5 MP, maximale Auflösung 2592 x 1944 Pixel
Kameraanschluss: FPC, 24 Pins
Bildformate: JPEG, BMP, Graustufen
Speicherkarte: microSD (TF), bis zu 4 GB
Energiesparmodi: Deep-sleep, Modem-sleep, Light-sleep
Integrierter Software-Stack: LwIP, FreeRTOS
Netzbetriebsarten: STA / AP / STA+AP
Smart Config / AirKiss: Ja
FOTA-Update: Ja
Mitgelieferter Programmierer: Ja, mit Type-C, CH340 oder FT232 je nach Charge
Abmessungen: 42 x 27 x 12 mm
ACHTUNG!
Bitte vor dem Kauf sorgfältig lesen
Kamera OV5640 (aktuelle Charge)
Dieses Modul wird aufgrund von Lieferproblemen mit hochwertigen OV2640-Kameras mit der OV5640-Kamera (5 MP) statt der OV2640 geliefert. Der Sensor wird im Betrieb sehr warm und kann sich bei Berührung heiß anfühlen. Dies ist ein normales Verhalten dieser Platinen-Kamera-Kombination und kein Defekt.
Der Programmierer kann je nach Charge den CH340- oder den FT232-Treiber verwenden.
Obligatorische Einsatzbedingungen:
Kühlkörper auf der Rückseite der Kamera, mit Klebeband oder Wärmeleitpad befestigt.
Gute Belüftung; das Modul nicht in geschlossenen Gehäusen ohne Luftzirkulation verwenden.
Stabile 5V-Versorgung, mindestens 2A, am 5V-Pin. Das Modul nicht über den USB-Seriell-Adapter mit 3,3V versorgen.
Reduzierung der Erwärmung der OV5640-Kamera auf der ESP32-CAM-Platine
Die ESP32-CAM-Platine (AI Thinker) wurde für die OV2640-Kamera entwickelt und versorgt den Kameraanschluss mit 3,3V (DOVDD), 2,8V (AVDD) und 1,2V (DVDD). Der OV5640-Sensor benötigt jedoch 1,5V am Kern (DVDD). Damit er auch unter diesen Bedingungen funktioniert, aktiviert der OV5640 standardmäßig seinen internen 1,5V-Regler, gespeist aus der 3,3V-Spannung. Die Spannungsdifferenz wird im Sensor selbst in Wärme umgewandelt, weshalb sich das Modul im Dauerbetrieb stark erwärmt. Über etwa 50°C können Rauschen und ein violetter Farbstich im Bild auftreten. Die Lösung besteht darin, den 1,2V-Regler durch einen 1,5V-Regler zu ersetzen und anschließend den internen Regler per Software zu deaktivieren.
Benötigt
Regler: XC6206P152MR oder ME6206A15XG (1,5V, SOT-23)
Werkzeuge: Heißluftstation, Multimeter
OV5640-Register: 0x3031, Bit 3 (Wert 0x08)
Vorgehensweise
Trennen Sie die Kamera ab und versorgen Sie die Platine mit 5V.
Messen Sie mit dem Multimeter bezogen auf einen GND-Pin der Platine den Ausgang der SOT-23-Regler neben dem Kameraanschluss und identifizieren Sie den Regler, der ungefähr 1,2V liefert. Der 2,8V-Regler und der AMS1117 (3,3V) werden nicht verändert.

Notieren Sie die Pinbelegung VIN (3,3V), VOUT (1,2V) und GND des identifizierten Reglers.
Löten Sie den 1,2V-Regler aus und ersetzen Sie ihn durch den 1,5V-Regler, nachdem Sie im Datenblatt überprüft haben, dass die Pins VIN, VOUT und GND zu den Pads passen.
Versorgen Sie die Platine ohne Kamera und überprüfen Sie, dass der Ausgang des neuen Reglers zwischen 1,45V und 1,55V liegt.
Schließen Sie die Kamera an und fügen Sie im Code direkt nach esp_camera_init() die Deaktivierung des internen Reglers hinzu (siehe Beispiel unten).
Prüfen Sie im Serial Monitor, dass Register 0x3031 den Wert 0x08 hat.
Optional können Sie auf der Rückseite des Kameramoduls einen kleinen Aluminiumkühlkörper mit Wärmeleitband anbringen.
// OV5640: internen 1,5V-Kernregler deaktivieren (Register 0x3031, Bit 3)
// Nur verwenden, wenn DVDD extern mit 1,5V versorgt wird
sensor_t *s = esp_camera_sensor_get();
if (s->id.PID == OV5640_PID) {
s->set_reg(s, 0x3031, 0x08, 0x08);
Serial.printf("OV5640 reg 0x3031 = 0x%02X\n", s->get_reg(s, 0x3031, 0xFF));
}
Nach der Änderung funktioniert die Kamera in allen getesteten Auflösungen bis zu 2560x1920 korrekt, und die Temperatur des Moduls sinkt. Ein Kühlkörper ist dennoch weiterhin erforderlich, da die Kamera im Betrieb ohnehin etwa 50 °C erreicht.
Alternative ohne Löten
Montieren Sie einen Kühlkörper auf der Kamera, verwenden Sie im Stream Auflösungen von höchstens SVGA oder HD und versetzen Sie den Sensor zwischen den Aufnahmen in den Standby (Register 0x3008 = 0x42 für Standby, 0x02 für aktiv).
Achtung! Deaktivieren Sie den internen Regler nicht auf einer unveränderten Platine mit 1,2V an DVDD. Der Sensorkern würde unter der spezifizierten Mindestspannung arbeiten, mit dem Risiko von beschädigten Bildern und Abstürzen. Auf einer Platine ohne DVDD-Regler lässt das Deaktivieren den Kern vollständig stromlos.
Nach der Änderung ist die Platine nicht mehr für die OV2640-Kamera geeignet, da diese 1,2V am Kern benötigt. Kennzeichnen Sie die Platine entsprechend. Die Änderung erfordert Erfahrung im Löten von SMD-Bauteilen.
Layout:
| Element | Funktion |
|---|---|
| ESP32-S-Modul mit PCB-Antenne | Der duale ESP32-Prozessor und die auf der Platine gedruckte WiFi-/Bluetooth-Antenne. |
| Weiße LED | Wird als Kamerablitz verwendet und von GPIO4 gesteuert. Sie leuchtet, wenn GPIO4 HIGH ist, und erlischt, wenn GPIO4 LOW ist. |
| Rote Status-LED | LED auf der Rückseite der Platine, gesteuert von GPIO33. Sie leuchtet, wenn GPIO33 LOW ist, und kann als freie Anzeige im Programm verwendet werden. |
| FPC-Anschluss für die Kamera | 24-poliger Anschluss, an dem das Flexkabel der OV5640-Kamera befestigt ist. |
| OV5640-Kamera | 5-MP-Kameramodul, getrennt von der Platine montiert und per Flexkabel verbunden. |
| microSD-Kartensteckplatz (TF) | Lokale Speicherung von Bildern und Dateien, Karten bis zu 4 GB. Verwendet die Pins IO2, IO4, IO12, IO13, IO14 und IO15. |
| Zwei Pinreihen (Doppelheader) | Führen Versorgung, freie GPIOs und die UART-Schnittstelle heraus, insgesamt 16 Pins. |
| Pin IO0 | Wählt den Startmodus. Mit GND (dem danebenliegenden GND-Pin) beim Reset verbunden, wechselt die Platine in den Programmiermodus. Offen gelassen, läuft das Programm aus dem Flash-Speicher. |
| RESET-Taste | Setzt den ESP32-Mikrocontroller zurück. Sie wird gedrückt, nachdem IO0 mit GND verbunden wurde, um in den Programmiermodus zu gelangen, und erneut nach Entfernen der Brücke, um das Programm auszuführen. |
| Spannungsregler | Wandelt die 5-V-Versorgung in die für die Schaltungen der Platine benötigten 3,3 V um. |
| Montagelöcher | Zwei Bohrungen zwischen den Pinreihen zur Befestigung der Platine. |
Pinbelegung:

| Anschluss | Pin | Funktion |
|---|---|---|
| 5V-Header | 5V | Platinenernährung, 5 VDC |
| 5V-Header | GND | Masse |
| 5V-Header | IO12 | GPIO12, auch als MicroSD DATA2 verwendet |
| 5V-Header | IO13 | GPIO13, auch als MicroSD DATA3 verwendet |
| 5V-Header | IO15 | GPIO15, auch als MicroSD CMD verwendet |
| 5V-Header | IO14 | GPIO14, auch als MicroSD CLK verwendet |
| 5V-Header | IO2 | GPIO2, auch als MicroSD DATA0 verwendet |
| 5V-Header | IO4 | GPIO4, auch als MicroSD DATA1 verwendet, steuert die Flash-LED |
| 3V3-Header | 3V3 | Platinenernährung, 3,3 VDC |
| 3V3-Header | IO16 | GPIO16, freie Leitung, kann UART2 RX sein |
| 3V3-Header | IO0 | GPIO0, wählt den Startmodus, wird für das Laden des Programms mit GND verbunden |
| 3V3-Header | GND | Masse |
| 3V3-Header | VCC | 3,3-V- oder 5-V-Ausgang, die Platine darf nicht über diesen Pin versorgt werden |
| 3V3-Header | U0R (IO3) | UART RX, serielle Datenempfang |
| 3V3-Header | U0T (IO1) | UART TX, serielle Datenübertragung |
| 3V3-Header | GND | Masse |
| Kamerasignal (FPC) | GPIO ESP32 | Funktion |
|---|---|---|
| D0 | GPIO5 | Kameradatenleitung (Y2) |
| D1 | GPIO18 | Kameradatenleitung (Y3) |
| D2 | GPIO19 | Kameradatenleitung (Y4) |
| D3 | GPIO21 | Kameradatenleitung (Y5) |
| D4 | GPIO36 | Kameradatenleitung (Y6) |
| D5 | GPIO39 | Kameradatenleitung (Y7) |
| D6 | GPIO34 | Kameradatenleitung (Y8) |
| D7 | GPIO35 | Kameradatenleitung (Y9) |
| XCLK | GPIO0 | Eingangstakt für den Kamerasensor |
| PCLK | GPIO22 | Pixelausgangstakt |
| VSYNC | GPIO25 | Vertikale Bildsynchronisation |
| HREF | GPIO23 | Horizontale Zeilensynchronisation |
| SIOD (SDA) | GPIO26 | I2C / SCCB, Sensor-Konfiguration |
| SIOC (SCL) | GPIO27 | I2C / SCCB, Sensor-Konfiguration |
| PWDN | GPIO32 | Sensor-Power-Down, HIGH zum Abschalten zwischen Aufnahmen |
Verwendung:
Falls das Kameramodul noch nicht montiert ist, befestigen Sie es am FPC-Anschluss der Platine und achten Sie dabei auf die Ausrichtung der Kontakte; anschließend schließen Sie die Verriegelung des Steckers.
Montieren Sie vor der ersten Verwendung einen kleinen Kühlkörper mit Klebeband oder Wärmeleitpad auf der Rückseite der OV5640-Kamera, da sich der Sensor im Betrieb stark erwärmt und bei Berührung heiß werden kann; dies ist ein normales Verhalten dieser Platinen-Kamera-Kombination.
Sorgen Sie für gute Belüftung rund um das Modul und verwenden Sie es nicht in einem geschlossenen Gehäuse ohne Luftzirkulation.
Versorgen Sie die Platine mit 5 VDC, mindestens 2 A, am 5V-Pin über eine stabile Stromquelle und speisen Sie das Modul nicht aus dem 3,3-V-Ausgang eines USB-Seriell-Adapters. Legen Sie keine Spannung an den VCC-Pin an, da dieser ein Ausgang ist.
Zum Programmieren schließen Sie einen FT232 oder einen entsprechenden Adapter an die Pins U0R, U0T und GND an, mit dem Jumper des Adapters auf 3,3 V; verbinden Sie TXD des Adapters mit U0R, RXD des Adapters mit U0T und die Masse des Adapters mit der Masse der Platine.
Im Arduino IDE installieren Sie das Board-Paket esp32 von Espressif Systems über den Boards Manager, wählen das Board AI Thinker ESP32-CAM und öffnen das Beispiel CameraWebServer im Menü File - Examples.
Im Code wählen Sie die Zeile mit dem Kameramodell CAMERA_MODEL_AI_THINKER aus und tragen den WiFi-Netzwerknamen sowie das Passwort ein.
Verbinden Sie vor dem Hochladen vorübergehend den IO0-Pin mit GND, drücken Sie die RESET-Taste und laden Sie das Programm hoch.
Nach dem Hochladen entfernen Sie die Brücke zwischen IO0 und GND und drücken Sie erneut RESET. Öffnen Sie den Serial Monitor mit 115200 Baud und notieren Sie die angezeigte IP-Adresse; geben Sie sie dann im Browser eines Computers oder Telefons ein, das sich im selben Netzwerk befindet.
Für kontinuierliches Streaming wählen Sie das JPEG-Format und eine reduzierte Auflösung (SVGA oder HD), und verwenden Sie die maximale Auflösung nur für Fotos. Wenn Sie periodische Aufnahmen machen, versetzen Sie den Sensor zwischen den Bildern in den Ruhezustand, indem Sie GPIO32 auf HIGH setzen.
Wenn Sie die microSD-Karte verwenden, beachten Sie, dass die Pins IO2, IO4, IO12, IO13, IO14 und IO15 von der Karte belegt werden und IO4 zusätzlich die weiße LED steuert.
Das Modul wird nicht für kontinuierliches Streaming rund um die Uhr empfohlen. Für stabile Ergebnisse verwenden Sie eine gute Stromversorgung, kurze Versorgungskabel und ein WiFi-Netzwerk mit starkem Signal an dem Ort, an dem die Platine montiert ist.
Abmessungsdiagramm:

Tutorial:

- Versorgungsspannung
- 5 V DC
- Abmessungen
- 42 x 27 x 12 mm
- Anzahl der Pins
- 16
- Schnittstelle
- UART, SPI, I2C, PWM, ADC, DAC
- Flash-Speicher
- 32 Mbit SPI
- Stromverbrauch
- 180 mA / 310 mA
- Prozessor
- Dual-Core LX6, 32 Bit
- WLAN
- 802.11 b/g/n
- Bluetooth
- 4.2 LE
- Standby-Verbrauch
- 6 mA
- SRAM-Speicher
- 520 KB
- Prozessortakt
- 80-240 MHz
- Speicherkartensteckplatz
- microSD (TF), bis zu 4 GB
Produs destinat utilizarii in proiecte electronice, automatizari, prototipare, educatie si cercetare.
Produsul trebuie utilizat numai conform specificatiilor tehnice mentionate in descriere si/sau in documentatia produsului.
Avertismente generale de siguranta:
Nu utilizati produsul la tensiuni, curenti sau temperaturi peste valorile specificate.
Montajul si conectarea trebuie realizate de persoane cu cunostinte tehnice minime in domeniul electric/electronic.
Evitati scurtcircuitele, inversarea polaritatii si conectarea gresita a alimentarii.
Nu lasati produsul alimentat nesupravegheat in timpul testelor.
Produsul nu este jucarie si nu este destinat copiilor.
Pentru modulele electronice, se recomanda utilizarea in carcase, panouri sau montaje protejate, dupa caz.
Identificare produs:
Denumirea produsului, codul/SKU-ul si caracteristicile tehnice sunt mentionate in pagina produsului si/sau pe eticheta ambalajului.
Producator / Importator / Distribuitor:
Sigmanortec S.R.L.
Calea Bucuresti nr. 9, Targu Jiu, Gorj, Romania
E-mail: [email protected]
Website: www.sigmanortec.ro
Persoana responsabila in UE:
Sigmanortec S.R.L.
Calea Bucuresti nr. 9, Targu Jiu, Gorj, Romania
E-mail: [email protected]
Documentatie si siguranta:
Pentru informatii suplimentare, fise tehnice, declaratii de conformitate sau instructiuni, ne puteti contacta la [email protected].
/*
Test sketch for ESP32-CAM (AI-Thinker) with OV5640 5MP camera
Board selected in Arduino IDE: "AI Thinker ESP32-CAM" (Tools > Board > esp32)
Board package: esp32 by Espressif Systems (installed from Boards Manager)
Boards Manager URL (File > Preferences): https://dl.espressif.com/dl/package_esp32_index.json
Libraries: none to install, esp_camera.h comes with the esp32 package
Wiring: camera attached to the onboard FPC connector, board powered at 5 V (min 2 A) on the 5V pin,
FT232 TXD -> U0R, FT232 RXD -> U0T, FT232 GND -> GND, IO0 bridged to GND only during upload
This sketch does not use WiFi. It checks that the camera starts and reports the frame size.
*/
#include "esp_camera.h"
// AI-Thinker camera pin map
#define PWDN_GPIO_NUM 32
#define RESET_GPIO_NUM -1
#define XCLK_GPIO_NUM 0
#define SIOD_GPIO_NUM 26
#define SIOC_GPIO_NUM 27
#define Y9_GPIO_NUM 35
#define Y8_GPIO_NUM 34
#define Y7_GPIO_NUM 39
#define Y6_GPIO_NUM 36
#define Y5_GPIO_NUM 21
#define Y4_GPIO_NUM 19
#define Y3_GPIO_NUM 18
#define Y2_GPIO_NUM 5
#define VSYNC_GPIO_NUM 25
#define HREF_GPIO_NUM 23
#define PCLK_GPIO_NUM 22
bool cameraReady = false;
void setup() {
Serial.begin(115200);
delay(500);
Serial.println("ESP32-CAM OV5640 test starting");
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_sscb_sda = SIOD_GPIO_NUM;
config.pin_sscb_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;
// SVGA keeps the sensor cooler than the maximum resolution
config.frame_size = psramFound() ? FRAMESIZE_SVGA : FRAMESIZE_CIF;
config.jpeg_quality = 12;
config.fb_count = psramFound() ? 2 : 1;
esp_err_t err = esp_camera_init(&config);
if (err != ESP_OK) {
Serial.printf("Camera init failed with error 0x%x\n", err);
return;
}
sensor_t *s = esp_camera_sensor_get();
Serial.printf("Camera init OK, sensor PID: 0x%04X\n", s->id.PID);
cameraReady = true;
}
void loop() {
if (!cameraReady) {
delay(1000);
return;
}
camera_fb_t *fb = esp_camera_fb_get();
if (!fb) {
Serial.println("Frame capture failed");
} else {
Serial.printf("Captured frame: %u x %u pixels, %u bytes\n",
(unsigned)fb->width, (unsigned)fb->height, (unsigned)fb->len);
esp_camera_fb_return(fb);
}
delay(5000);
}
Die ESP32-CAM-Platine mit der 5-MP-Kamera OV5640 ist ein ESP32-Modul mit eingebauter Kamera. Es nimmt Bilder auf und überträgt sie per WLAN, ohne weitere Bauteile. Einsatzgebiete sind Überwachung, Fernkontrolle, automatische Fotografie und Bilderkennung.
Das Tutorial verwendet die ESP32-CAM-Platine AI-Thinker als Plattform, programmiert über die Arduino IDE. Die Platine hat keinen USB-Anschluss, deshalb erfolgt das Hochladen des Programms über einen USB-Seriell-Adapter FT232RL. Die Stromversorgung erfolgt separat über ein Netzteil mit 5 VDC und mindestens 2 A. Das Programm startet die Kamera und stellt einen Videostream über einen einfachen Webserver bereit.

So funktioniert es:
Der Sensor OV5640 erfasst das Bild und sendet es über 8 parallele Datenleitungen (D0 - D7) an den ESP32. Synchronisiert wird die Übertragung durch die Signale XCLK (Takt für den Sensor), PCLK (Pixeltakt), VSYNC (Bildbeginn) und HREF (gültige Zeile). Die Konfiguration des Sensors, also Auflösung, Belichtung und Weißabgleich, erfolgt über einen I2C- / SCCB-Bus auf den Leitungen SIOD (GPIO26) und SIOC (GPIO27). Der Pin PWDN (GPIO32) kann den Sensor abschalten, wenn er nicht benötigt wird.
Die folgende Rechnung zeigt, warum das Bild direkt im Sensor als JPEG komprimiert wird. Die maximale Auflösung beträgt 2592 x 1944 = 5 038 848 Pixel. Bei 2 Byte pro Pixel (Format RGB565) hätte ein Bild knapp über 10 MB (10 077 696 Byte), also mehr als die 4 MB PSRAM der Platine. Im JPEG-Format benötigt ein Bild deutlich weniger Speicher und passt problemlos in den Speicher.
Bei der Auflösung SVGA (800 x 600 = 480 000 Pixel) hat ein JPEG-Bild je nach Szene und der im Code gewählten Qualität etwa 10 - 40 KB. In unseren Tests betrug der Mittelwert bei Qualität 12 etwa 13 KB pro Bild. Wenn das WLAN in der Praxis 400 KB/s liefert und ein Bild 40 KB groß ist, ergibt sich 400 / 40 = 10 Bilder pro Sekunde. Oberhalb der HD-Auflösung liefert der Sensor bei einem XCLK-Takt von 20 MHz nur 4 - 6 Bilder pro Sekunde. Die maximale Auflösung ist daher für Einzelfotos reserviert, für den Videostream werden SVGA oder HD gewählt. Die Bibliothek esp32-camera bietet als maximale Auflösung QSXGA mit 2560 x 1920 Pixeln, etwas weniger als die 2592 x 1944 Pixel des Sensors.
Anschluss:
Die Platine wird über eine separate Stromquelle mit 5 VDC und mindestens 2 A am Pin 5V versorgt. Versorgen Sie sie nicht über den USB-Seriell-Adapter, denn Adapter und USB-Port liefern nicht den Spitzenstrom, den die Kamera OV5640 zusammen mit dem WLAN benötigt. Außerdem ist der 3,3-V-Ausgang des Adapters für diese Platine nicht geeignet. Der Pin VCC des FT232RL bleibt unverbunden, und der Jumper des Adapters wird auf 3,3 V gesetzt, damit die Signale TXD und RXD den logischen Pegel von 3,3 V der GPIOs des ESP32 haben. Die seriellen Leitungen werden über Kreuz verbunden: TXD des Adapters geht an U0R, RXD des Adapters an U0T. Die Brücke zwischen IO0 und GND wird nur während des Hochladens des Programms gesetzt.
| Board-Pin | Wird verbunden mit | Funktion |
|---|---|---|
| 5V | Netzteil 5 VDC, Klemme + | Versorgung der Platine, mindestens 2 A |
| GND (Header 5V) | Netzteil 5 VDC, Klemme - | Masse der Versorgung |
| U0R (GPIO3) | FT232 TXD | Empfang serieller Daten auf der Platine |
| U0T (GPIO1) | FT232 RXD | Senden serieller Daten von der Platine |
| GND (neben U0T) | FT232 GND | Gemeinsame Masse mit dem Adapter |
| IO0 | GND (Pin neben IO0) | Temporäre Brücke für den Programmiermodus |
Das folgende Bild zeigt den Anschluss der Platine am FT232-Programmer.

Tasten, Einstellungen und Anzeigen:
| Element | Funktion | Bedienung |
|---|---|---|
| Taste RESET | Setzt den Mikrocontroller ESP32 zurück. | Kurz drücken, nachdem IO0 mit GND verbunden wurde, um in den Ladebetrieb zu wechseln. Danach die Brücke entfernen und erneut drücken, um das Programm zu starten. |
| Brücke IO0 - GND | Wählt den Startmodus. | Beim Reset gesetzt, wartet die Platine auf das Hochladen eines Programms. Beim Reset ohne Brücke startet die Platine das Programm aus dem Flash. |
| Weiße LED (Blitz) | Beleuchtet die Szene für die Kamera, gesteuert über GPIO4. | Leuchtet, wenn GPIO4 HIGH ist. Im Programm des Tutorials bleibt sie aus. |
| Rote Status-LED | Anzeige auf der Rückseite der Platine, gesteuert über GPIO33. | Leuchtet, wenn GPIO33 LOW ist. Wird vom Programm des Tutorials nicht verwendet. |
Zum Hochladen verbinden Sie IO0 mit GND, drücken RESET und laden das Programm hoch. Die Platine ist im richtigen Modus, wenn die Arduino IDE den Upload ohne Verbindungsfehler startet.
Entfernen Sie nach dem Hochladen die Brücke zwischen IO0 und GND und drücken Sie RESET. Die Platine führt nun das Programm aus, und im Serial Monitor erscheinen die Startmeldungen.
Die weiße LED bleibt im Programm aus. Wenn Sie zusätzliche Beleuchtung wünschen, steuern Sie GPIO4 im Code an. Beachten Sie dabei, dass die LED bei maximaler Helligkeit etwa 130 mA zusätzlich verbraucht. In unseren Tests benötigte die Platine mit der Kamera OV5640 bei 5 V etwa 340 - 360 mA, mit aktiver Kamera und ausgeschalteter LED.
Board und Bibliotheken:
Öffnen Sie in der Arduino IDE File - Preferences und fügen Sie im Feld Additional Boards Manager URLs die Adresse https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json ein. Öffnen Sie danach Tools - Board - Boards Manager, suchen Sie nach esp32 und installieren Sie das Paket esp32 by Espressif Systems in einer aktuellen Version (2.0.x oder neuer).
Wählen Sie nach der Installation die Platine AI Thinker ESP32-CAM unter Tools - Board - esp32 aus. Die folgenden Screenshots zeigen die Konfigurationsschritte in der Arduino IDE.
Im Library Manager muss keine Bibliothek installiert werden, denn esp_camera.h und WiFi.h sind im Paket esp32 by Espressif Systems bereits enthalten.
Der Code:
Das Programm initialisiert die Kamera mit der Pinbelegung der Platine AI-Thinker, verbindet sich mit dem WLAN und sendet den JPEG-Videostream an einen Client, der mit Port 80 verbunden ist. Ersetzen Sie vor dem Hochladen den Namen und das Passwort des Netzwerks.
/*
ESP32-CAM (AI-Thinker) with OV5640 5MP camera - WiFi MJPEG video stream
Board selected in Arduino IDE: "AI Thinker ESP32-CAM" (Tools > Board > esp32)
Board package: esp32 by Espressif Systems (installed from Boards Manager)
Boards Manager URL (File > Preferences): https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json
Libraries: none to install, esp_camera.h and WiFi.h come with the esp32 package
Upload wiring: FT232 TXD -> U0R, FT232 RXD -> U0T, FT232 GND -> GND,
5V supply (min 2 A) on the 5V pin, IO0 bridged to GND only during upload
*/
#include "esp_camera.h"
#include <WiFi.h>
// ---- Wi-Fi credentials (replace with your own) ----
const char* WIFI_SSID = "YOUR_WIFI_SSID";
const char* WIFI_PASSWORD = "YOUR_WIFI_PASSWORD";
// ---- AI-Thinker camera pin map ----
#define PWDN_GPIO_NUM 32
#define RESET_GPIO_NUM -1
#define XCLK_GPIO_NUM 0
#define SIOD_GPIO_NUM 26
#define SIOC_GPIO_NUM 27
#define Y9_GPIO_NUM 35
#define Y8_GPIO_NUM 34
#define Y7_GPIO_NUM 39
#define Y6_GPIO_NUM 36
#define Y5_GPIO_NUM 21
#define Y4_GPIO_NUM 19
#define Y3_GPIO_NUM 18
#define Y2_GPIO_NUM 5
#define VSYNC_GPIO_NUM 25
#define HREF_GPIO_NUM 23
#define PCLK_GPIO_NUM 22
// White flash LED on GPIO4 (also SD card DATA1)
#define FLASH_LED_GPIO_NUM 4
WiFiServer server(80);
// Configure and start the camera
bool startCamera() {
camera_config_t config = {}; // start from a zeroed structure
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; // 20 MHz clock for the sensor
config.pixel_format = PIXFORMAT_JPEG; // the sensor compresses the image itself
if (psramFound()) {
config.frame_size = FRAMESIZE_SVGA; // 800x600, a good balance for streaming
config.jpeg_quality = 12; // lower number = better quality, bigger file
config.fb_count = 2; // two frame buffers for smoother streaming
config.fb_location = CAMERA_FB_IN_PSRAM;
config.grab_mode = CAMERA_GRAB_LATEST; // always send the newest frame
Serial.println("PSRAM found, using SVGA with 2 frame buffers");
} else {
config.frame_size = FRAMESIZE_CIF;
config.jpeg_quality = 15;
config.fb_count = 1;
config.fb_location = CAMERA_FB_IN_DRAM;
config.grab_mode = CAMERA_GRAB_WHEN_EMPTY;
Serial.println("No PSRAM, using CIF with 1 frame buffer");
}
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;
}
// Read the sensor ID to confirm which camera is attached
sensor_t *s = esp_camera_sensor_get();
Serial.printf("Camera init OK, sensor PID: 0x%04X\n", s->id.PID);
if (s->id.PID != OV5640_PID) {
Serial.println("Warning: the attached sensor is not an OV5640");
}
return true;
}
// Read and ignore the HTTP request header sent by the browser
void skipRequest(WiFiClient &client) {
unsigned long start = millis();
while (client.connected() && millis() - start < 1000) {
if (client.available()) {
String line = client.readStringUntil('\n');
if (line.length() <= 1) break; // blank line ends the header
}
}
}
// Send frames to the client until it disconnects
void streamTo(WiFiClient &client) {
client.print("HTTP/1.1 200 OK\r\n");
client.print("Content-Type: multipart/x-mixed-replace; boundary=frame\r\n\r\n");
Serial.println("Streaming started");
uint32_t frames = 0;
while (client.connected()) {
camera_fb_t *fb = esp_camera_fb_get(); // get one JPEG frame
if (!fb) {
Serial.println("Frame capture failed");
break;
}
size_t len = fb->len;
client.print("--frame\r\n");
client.print("Content-Type: image/jpeg\r\n");
client.printf("Content-Length: %u\r\n\r\n", (unsigned)len);
size_t sent = client.write(fb->buf, len);
client.print("\r\n");
esp_camera_fb_return(fb); // give the buffer back to the driver
if (sent != len) break; // client is gone
frames++;
}
Serial.printf("Client disconnected after %u frames\n", (unsigned)frames);
}
void setup() {
Serial.begin(115200);
delay(500);
Serial.println();
Serial.println("ESP32-CAM OV5640 stream example");
// Keep the white flash LED off
pinMode(FLASH_LED_GPIO_NUM, OUTPUT);
digitalWrite(FLASH_LED_GPIO_NUM, LOW);
if (!startCamera()) {
return; // stop here if the camera did not start
}
// Connect to Wi-Fi
WiFi.mode(WIFI_STA);
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
WiFi.setSleep(false); // no Wi-Fi power saving, better for streaming
Serial.print("Connecting to WiFi");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println();
Serial.print("WiFi connected, IP address: ");
Serial.println(WiFi.localIP());
Serial.print("Open http://");
Serial.print(WiFi.localIP());
Serial.println("/ in a browser to see the stream");
server.begin();
}
void loop() {
WiFiClient client = server.available(); // wait for a browser
if (client) {
Serial.println("Client connected");
skipRequest(client);
streamTo(client);
client.stop();
}
}
So funktioniert der Code:
Der erste Teil enthält die Definitionen. Die Konstanten WIFI_SSID und WIFI_PASSWORD speichern die Zugangsdaten des Netzwerks. Die Zeilen mit PWDN_GPIO_NUM, XCLK_GPIO_NUM, SIOD_GPIO_NUM, SIOC_GPIO_NUM, Y2_GPIO_NUM - Y9_GPIO_NUM, VSYNC_GPIO_NUM, HREF_GPIO_NUM und PCLK_GPIO_NUM beschreiben die Pins zwischen dem ESP32 und dem Kameraanschluss, die mit der Tabelle in der Beschreibung übereinstimmen. FLASH_LED_GPIO_NUM ist GPIO4, und das Server-Objekt lauscht auf Port 80.
Die Funktion startCamera() füllt die Struktur camera_config_t mit den Kamerapins, dem XCLK-Takt von 20 MHz und dem Format PIXFORMAT_JPEG. Die Struktur wird leer initialisiert (= {}), damit nicht gesetzte Felder keine zufälligen Werte enthalten. Liefert psramFound() den Wert wahr, wird FRAMESIZE_SVGA mit zwei Bildpuffern im PSRAM (fb_count = 2) und dem Modus CAMERA_GRAB_LATEST gewählt, der immer das neueste Bild sendet. Andernfalls wird FRAMESIZE_CIF mit einem einzelnen Puffer im internen Speicher verwendet. Nach esp_camera_init() liest die Funktion den Sensor mit esp_camera_sensor_get(), gibt die Kennung PID aus, die für den OV5640 0x5640 lautet, und warnt, falls ein anderer Sensor angeschlossen ist.
Die Funktion skipRequest() liest den HTTP-Header der vom Browser gesendeten Anfrage und verwirft ihn bis zur ersten leeren Zeile. Die Funktion streamTo() sendet den Header multipart/x-mixed-replace und wiederholt danach in einer Schleife: Sie holt ein Bild mit esp_camera_fb_get(), sendet die Trennzeichenfolge, den Typ und die Länge, schreibt die JPEG-Daten mit client.write() und gibt den Puffer mit esp_camera_fb_return() frei. Die Schleife endet, wenn der Client die Verbindung trennt.
In setup() wird Serial mit 115200 Baud gestartet, die weiße LED bleibt aus, startCamera() wird aufgerufen, die Platine verbindet sich mit WiFi.begin() mit dem WLAN und die erhaltene IP-Adresse wird angezeigt. In loop() wartet das Programm mit server.available() auf einen Client und liefert bei Verbindung den Stream über streamTo().
Ergebnis:
Öffnen Sie den Serial Monitor mit 115200 Baud. Nach dem Start muss die erfolgreiche Initialisierung der Kamera mit der PID 0x5640 erscheinen, danach die IP-Adresse der Platine. Geben Sie die Adresse im Browser ein, dann erscheint das Bild in Echtzeit.
ESP32-CAM OV5640 stream example
PSRAM found, using SVGA with 2 frame buffers
Camera init OK, sensor PID: 0x5640
Connecting to WiFi......
WiFi connected, IP address: 192.168.1.57
Open http://192.168.1.57/ in a browser to see the stream
Client connected
Streaming started
Client disconnected after 412 frames
Häufige Probleme:
Der Upload bricht mit einem Verbindungsfehler ab. Die häufige Ursache ist der falsche Startmodus. Prüfen Sie, ob IO0 mit GND verbunden ist, drücken Sie RESET vor dem Hochladen und kontrollieren Sie, dass TXD an U0R und RXD an U0T angeschlossen ist und nicht direkt.
Nach dem Hochladen passiert nichts, und im Serial Monitor erscheint eine Meldung über das Warten auf das Hochladen eines Programms. Die Brücke zwischen IO0 und GND ist noch gesetzt. Entfernen Sie sie und drücken Sie RESET.
Die Platine startet ständig neu, oder es erscheint die Meldung Brownout detector was triggered. Die Stromversorgung ist unzureichend, meist weil die Platine über USB oder ein schwaches Netzteil versorgt wird. Verwenden Sie ein stabiles Netzteil mit 5 VDC und mindestens 2 A und kurze Kabel.
Es erscheint die Meldung Camera init failed mit einem Fehlercode. Das Flachbandkabel der Kamera ist nicht vollständig eingesteckt, oder die Klappe des FPC-Steckers ist nicht geschlossen. Trennen Sie die Stromversorgung, stecken Sie das Kabel mit den Kontakten in der richtigen Lage wieder ein und schließen Sie die Klappe.
Das Bild zeigt nach einer Betriebszeit Rauschen oder einen violetten Farbstich. Der Sensor OV5640 hat sich zu stark erwärmt. Montieren Sie einen Kühlkörper auf der Rückseite der Kamera, sorgen Sie für Belüftung und reduzieren Sie die Auflösung auf SVGA oder HD.
Die Platine verbindet sich mit dem WLAN, aber das Bild hängt sich auf oder hat nur wenige Bilder pro Sekunde. Das WLAN-Signal ist schwach, oder die Auflösung ist zu hoch. Stellen Sie die Platine näher an den Router und reduzieren Sie die Auflösung im Code.
Einschränkungen und Tipps:
Das Modul wird für einen dauerhaften Streaming-Betrieb rund um die Uhr nicht empfohlen, da sich die Kamera OV5640 auf dieser Platine stark erwärmt. Der Grund ist, dass die Platine für die Kamera OV2640 entwickelt wurde und den Kameraanschluss mit 3,3 V, 2,8 V und 1,2 V versorgt, während der OV5640 seinen Kern über einen internen Regler mit 1,5 V versorgt, der aus den 3,3 V erzeugt wird. Die Spannungsdifferenz wird direkt im Sensor in Wärme umgewandelt. Oberhalb von etwa 50 °C können Rauschen und ein violetter Farbstich im Bild auftreten.
Ohne Hardwareänderungen verwenden Sie einen Kühlkörper auf der Kamera, beschränken das Streaming auf höchstens SVGA oder HD und schalten den Sensor zwischen den Aufnahmen über das Register 0x3008 in den Standby (Wert 0x42 für Standby und 0x02 für aktiv). In unseren Tests sank der Verbrauch der Platine mit dem Sensor im Standby von etwa 338 mA auf 163 mA. Die maximale Auflösung der Bibliothek, 2560 x 1920 Pixel, eignet sich für Fotos.
Anwender mit Erfahrung im Löten von SMD-Bauteilen können die Erwärmung verringern, indem sie den 1,2-V-Regler neben dem Kameraanschluss durch einen 1,5-V-Regler ersetzen (zum Beispiel XC6206P152MR oder ME6206A15XG) und den internen Regler des Sensors per Software deaktivieren. Dazu wird Bit 3 des Registers 0x3031 (Wert 0x08) gesetzt, unmittelbar nach esp_camera_init(). Nach dieser Änderung blieb der Kühlkörper der Kamera in unseren Tests merklich kühler.
// Only on a board where the DVDD regulator was replaced with a 1.5 V one
sensor_t *s = esp_camera_sensor_get();
if (s->id.PID == OV5640_PID) {
s->set_reg(s, 0x3031, 0x08, 0x08); // bypass the internal 1.5 V core regulator
}
Deaktivieren Sie den internen Regler nicht auf einer unveränderten Platine, denn der Sensorkern würde dann unterhalb der minimalen Spannung arbeiten, mit der Gefahr beschädigter Bilder und Abstürze. Eine geänderte Platine eignet sich nicht mehr für die Kamera OV2640 und muss entsprechend gekennzeichnet werden.
Auf der Grundlage dieses Tutorials können Sie eine Überwachungskamera mit Zugriff über den Browser, ein System für periodische Fotos mit Speicherung auf einer microSD-Karte oder ein Projekt zur Objekterkennung bauen. Dabei können Sie die freien GPIOs für Bewegungssensoren oder weitere Module nutzen.