Komponen · 12 mnt baca

Tutorial ESP32-CAM: Pengaturan, Pemrograman, Live Stream, dan Kartu SD

Cara memprogram ESP32-CAM: pinout AI-Thinker, upload dengan ESP32-CAM-MB dan USB-TTL, CameraWebServer, PSRAM, solusi error 0x105 dan brownout, LED flash, foto ke kartu SD.

ESP32-CAM adalah board kamera Wi-Fi yang terjangkau dan, walaupun ukurannya hanya 27 × 40 mm, membawa prosesor ESP32, kamera OV2640 2 megapiksel, slot kartu microSD, dan LED flash putih. Board ini bisa bergabung sendiri ke jaringan rumahmu, mengirim video langsung ke browser, mengambil foto, lalu menyimpannya ke kartu SD atau mengirimnya lewat internet. Board ini jadi andalan untuk kamera keamanan, kamera bel pintu, time-lapse pertumbuhan tanaman, dan mobil robot berkamera, tetapi karena tidak punya soket USB, cara memulainya sedikit berbeda dari board ESP32 yang mungkin sudah biasa kamu pakai.

Di panduan ini kamu akan mempelajari pinout ESP32-CAM AI-Thinker, cara memprogramnya dengan adaptor ESP32-CAM-MB atau adaptor USB-TTL (termasuk sambungan IO0-GND), cara mendapat gambar langsung di browser dengan contoh siap pakai CameraWebServer, dan pengaturan PSRAM serta partisi yang dipakai. Setelah itu kamu akan melihat penyebab error Camera init failed with error 0x105 dan brownout yang paling sering muncul, mengendalikan LED flash, dan membuat sketch yang menyimpan foto ke kartu microSD ketika tombol ditekan.

Modul kamera ESP32-CAM AI-Thinker
ESP32-CAM: modul ESP32-S, kamera OV2640, slot microSD, dan LED flash dalam satu board. Tidak ada soket USB, jadi kamu butuh adaptor untuk memprogramnya.

Apa itu ESP32-CAM dan bagaimana cara kerjanya?

Jantung board ini adalah modul ESP32-S yang membawa chip ESP32 dua inti dengan Wi-Fi dan Bluetooth. Kamera dicolokkan ke konektor 24 pin di board dengan kabel pita tipis (FPC). ESP32 mengirim sinyal clock 20 MHz (XCLK) ke kamera lewat GPIO 0 dan mengonfigurasinya lewat bus SCCB yang mirip I2C di GPIO 26 dan 27. Karena sensor OV2640 bisa mengompresi gambar ke JPEG sendiri, ESP32 menerima frame JPEG kecil, bukan piksel mentah. Frame-frame ini lewat bus data paralel 8-bit ke PSRAM 4 MB di board, lalu Wi-Fi meneruskannya ke browser atau server.

FiturNilai
ProsesorESP32 (modul ESP32-S), dua inti, sampai 240 MHz
NirkabelWi-Fi 802.11 b/g/n (hanya 2,4 GHz), Bluetooth 4.2 dan BLE
MemoriSRAM internal 520 KB + PSRAM 4 MB, flash 4 MB
KameraOV2640, 2 MP, sampai 1600×1200 (UXGA), output JPEG
PenyimpananSlot microSD (sampai 4 GB menurut dokumentasi resmi)
LampuLED flash putih (GPIO 4), LED status merah di bagian belakang (GPIO 33)
Daya5 V di pin 5V (disarankan) atau 3,3 V di pin 3V3
Arus (di 5 V)Sekitar 180 mA dengan flash mati, sekitar 310 mA dengan flash di kecerahan penuh; puncak Wi-Fi lebih tinggi
Ukuran27 × 40,5 × 4,5 mm

Pinout ESP32-CAM AI-Thinker: pin mana yang bebas?

Ada 16 pin di sepanjang dua sisi board, tetapi hanya sedikit yang benar-benar bebas: kamera sendiri memakai 15 GPIO dan slot microSD berbagi enam lagi. Tabel di bawah merangkum pin di tepi board dan kapan kamu bisa memakainya. Fitur pin ESP32 secara umum juga bisa kamu jelajahi di alat Pinout.

PinFungsiBebas dipakai?
5VInput daya (disarankan)-
3V3Input daya 3,3 V-
GND (3 pin)Ground-
VCCOutput daya (3,3 V secara bawaan)Jangan dipakai untuk memberi daya board
U0R (GPIO 3)RX serial: pemrograman dan Serial MonitorHanya kalau kamu tidak butuh port serial
U0T (GPIO 1)TX serial: pemrograman dan Serial MonitorHanya kalau kamu tidak butuh port serial
GPIO 0Clock kamera (XCLK) dan mode bootTidak; hanya disambung ke GND ketika upload
GPIO 16Tersambung ke PSRAM di banyak boardTidak
GPIO 2SD DATA0Kalau kartu SD tidak dipakai; pin strapping
GPIO 4SD DATA1 dan LED flashDi mode SD 1-bit atau tanpa SD
GPIO 12SD DATA2Di mode SD 1-bit atau tanpa SD; harus LOW ketika boot
GPIO 13SD DATA3Di mode SD 1-bit atau tanpa SD; pin bebas yang paling aman
GPIO 14SD CLKKalau kartu SD tidak dipakai
GPIO 15SD CMDKalau kartu SD tidak dipakai; pin strapping
GPIO 33LED merah (tidak ada di header)Hanya LED; menulis LOW menyalakannya
Pin VCC bukan input: pin ini adalah output regulator di board dan memberikan 3,3 V secara bawaan. Menghubungkan 5 V ke sini langsung menarik jalur daya 3,3 V naik ke 5 V dan bisa merusak ESP32, jadi selalu berikan daya ke pin 5V. Selain itu, kalau GPIO 12 HIGH ketika boot, ESP32 mencoba menjalankan flash-nya di 1,8 V dan board tidak mau menyala, jadi jangan hubungkan resistor pull-up atau modul yang menarik pin ini ke HIGH.

Bagaimana cara memprogram ESP32-CAM? Dua cara

Chip USB-serial yang membuat board ESP32 biasa bisa berbicara dengan komputermu tidak ada di ESP32-CAM. Untuk upload kode, kamu punya dua pilihan: adaptor ESP32-CAM-MB yang dipasang di bawah board (board dasar kecil dengan chip CH340 dan soket micro USB), atau konverter USB-TTL yang sudah kamu punya (FTDI, CH340, CP2102). Apa pun pilihanmu, logikanya sama: kalau GPIO 0 LOW ketika boot, ESP32 masuk mode download dan menunggu kode; kalau HIGH, ESP32 menjalankan program di flash. Tombol IO0 di adaptor MB dan kabel IO0-GND yang kamu tambahkan pada adaptor USB-TTL melakukan persis hal ini.

Adaptor USB-TTL CP2102
Adaptor USB-TTL CP2102: pin GND, 5V, TX, dan RX sudah cukup untuk memprogram ESP32-CAM.
Adaptor USB-TTLESP32-CAMCatatan
GNDGNDGround bersama
5V5VMemberi daya board; output 3,3 V adaptor tidak cukup
TXU0R (GPIO 3)Disilang: pemancar ke penerima
RXU0T (GPIO 1)Disilang: penerima ke pemancar
-Di antara IO0 dan GNDHanya ketika upload; kabel pendek di antara dua pin yang bersebelahan

Kalau adaptormu punya jumper pemilih 3,3 V / 5 V, atur ke 3,3 V agar jalur TX tetap di level yang cocok untuk pin ESP32. Namun beri daya board dari pin 5V adaptor. Output 3,3 V di kebanyakan adaptor hanya bisa memberikan sekitar 50–100 mA; begitu ESP32-CAM menyalakan Wi-Fi, catu itu ambruk dan board restart.

Pengaturan Arduino IDE: board, partition scheme, dan PSRAM

  1. Buka Boards Manager di Arduino IDE dan instal paket esp32 by Espressif Systems; panduan instalasi Arduino IDE menjelaskannya secara detail.
  2. Pilih board AI Thinker ESP32-CAM dari Tools > Board > esp32.
  3. Pastikan Partition Scheme diatur ke Huge APP (3MB No OTA/1MB SPIFFS); contoh kamera butuh ruang aplikasi minimal 3 MB.
  4. Hubungkan board ke adaptor dan pilih port baru dari Tools > Port (COMx di Windows, /dev/cu.usbserial... atau /dev/cu.wchusbserial... di macOS).
  5. Kalau tidak ada port yang muncul sama sekali, instal driver CH340 atau CP2102 dan pakai kabel USB yang bisa membawa data.
PengaturanNilai yang disarankanKenapa?
BoardAI Thinker ESP32-CAMPSRAM, flash 4 MB, dan partition scheme yang benar sudah diatur dari awal
Partition SchemeHuge APP (3MB No OTA/1MB SPIFFS)Ruang aplikasi 3 MB yang dibutuhkan CameraWebServer
PSRAMSelalu aktif di definisi board iniDengan ESP32 Dev Module, atur PSRAM: Enabled; ESP32 Wrover Module sudah mengaktifkannya
CPU Frequency240MHz (WiFi/BT)Kecepatan tertinggi untuk transfer gambar dan Wi-Fi
Flash Mode / Flash FrequencyQIO / 80MHzCoba DIO / 40MHz kalau upload atau boot gagal
Core Debug LevelNone (Info ketika mencari masalah)Di level Info, detail kamera dan FPS dicetak ke Serial Monitor
Upload Speed460800 (tetap di board ini)Kalau upload terus putus, pilih ESP32 Wrover Module dan coba 115200
Selalu buka Serial Monitor di 115200 baud. Pesan boot hanya muncul pada momen reset, jadi kalau layarnya kosong, tekan tombol RST di board. Kalau kamu melihat waiting for download, IO0 masih tersambung ke GND; lepaskan kabelnya, tekan RST lagi, dan programmu mulai berjalan.

Upload pertamamu, langkah demi langkah

  1. Sambungkan kabelnya: pasang board ke adaptor MB dengan pin yang sejajar, atau hubungkan adaptor USB-TTL seperti di tabel di atas. Kalau memakai adaptor USB-TTL, tambahkan juga kabel pendek di antara IO0 dan GND.
  2. Masukkan board ke mode download: di adaptor MB, tahan tombol IO0, tekan dan lepas RST, lalu lepaskan IO0. Dengan adaptor USB-TTL, cukup tekan RST selama kabel IO0-GND terpasang. Beberapa adaptor MB dengan rangkaian auto-reset bisa upload tanpa menekan tombol apa pun.
  3. Klik Upload di Arduino IDE. Output pertama-tama menampilkan Connecting..., diikuti progres penulisan dalam persen.
  4. Ketika baris Hard resetting via RTS pin... muncul, upload selesai. Kalau kamu memakai adaptor USB-TTL, lepaskan kabel IO0-GND sekarang.
  5. Buka Serial Monitor di 115200 baud dan tekan RST; program baru mulai berjalan.
C++ (Arduino IDE)
1// ESP32-CAM ilk yükleme testi / ESP32-CAM first upload test
2const int KIRMIZI_LED = 33;   // arkadaki kırmızı LED, ters mantık / red LED on the back, inverted logic
3
4void setup() {
5  Serial.begin(115200);
6  pinMode(KIRMIZI_LED, OUTPUT);
7  delay(500);
8
9  // PSRAM kontrolü / PSRAM check
10  if (psramFound()) {
11    Serial.print("PSRAM bulundu / PSRAM found: ");
12    Serial.print(ESP.getPsramSize());
13    Serial.println(" bayt / bytes");
14  } else {
15    Serial.println("PSRAM yok / No PSRAM");
16  }
17}
18
19void loop() {
20  digitalWrite(KIRMIZI_LED, LOW);    // LOW = yanar / LOW = on
21  delay(500);
22  digitalWrite(KIRMIZI_LED, HIGH);   // HIGH = söner / HIGH = off
23  delay(500);
24}

Kalau upload berhasil, LED merah kecil di bagian belakang board berkedip setiap setengah detik. LED ini memakai logika terbalik: menulis LOW menyalakannya dan HIGH mematikannya. Di Serial Monitor kamu seharusnya melihat sekitar 4 juta byte PSRAM; kalau tertulis No PSRAM, periksa pilihan board-mu, dan kalau tidak membantu, mungkin board-mu tidak punya chip PSRAM. Menjalankan tes singkat ini sebelum contoh kamera langsung memberi tahu apakah masalahnya ada di upload atau di kamera.

Contoh CameraWebServer: gambar langsung di browser

  1. Buka File > Examples > ESP32 > Camera > CameraWebServer.
  2. Pilih model kamera: di daftar pada tab board_config.h (versi baru) atau di bagian atas file utama (versi lama), tambahkan // di depan baris CAMERA_MODEL_ESP_EYE dan hapus // di depan baris CAMERA_MODEL_AI_THINKER.
  3. Masukkan nama dan password jaringan Wi-Fi 2,4 GHz-mu di baris ssid dan password.
  4. Masukkan board ke mode download dan upload sketch-nya; setelah itu lepaskan sambungan IO0 dan tekan RST.
  5. Di Serial Monitor kamu akan melihat baris seperti Camera Ready! Use 'http://192.168.1.45' to connect; buka alamat itu di browser ponsel atau komputer yang ada di jaringan yang sama.
  6. Mulai gambar langsung dengan tombol Start Stream di halaman, atau ambil satu foto dengan Get Still.
C++ (Arduino IDE)
1// board_config.h (eski sürümlerde CameraWebServer.ino) / (CameraWebServer.ino in older versions)
2//#define CAMERA_MODEL_ESP_EYE      // Has PSRAM  <- kapat / comment out
3#define CAMERA_MODEL_AI_THINKER     // Has PSRAM  <- aç / enable
4
5// CameraWebServer.ino
6const char *ssid = "AgAdi";          // Wi-Fi adı / Wi-Fi name
7const char *password = "Sifre123";   // Wi-Fi şifresi / Wi-Fi password

Antarmukanya berjalan di dua server terpisah: halaman pengaturan dan alamat /capture yang mengembalikan satu foto ada di port 80, sedangkan live stream ada di /stream pada port 81 (misalnya http://192.168.1.45:81/stream). Alamat stream ini bisa kamu tambahkan ke halaman web-mu sendiri atau ke software otomasi rumah. Di menu sebelah kiri kamu bisa mengubah resolusi, kualitas JPEG, kecerahan, kontras, dan white balance, dan kalau gambarnya terbalik, pakai sakelar V-Flip dan H-Mirror; versi yang lebih baru juga punya slider LED Intensity untuk flash. Board biasanya hanya melayani satu penonton live stream dalam satu waktu, jadi stream yang dibuka di tab kedua bisa macet. Kalau halamannya sama sekali tidak mau terbuka, pastikan ponselmu dan board ada di jaringan yang sama; untuk masalah koneksi, baca ESP32 tidak mau terhubung ke Wi-Fi.

Tabel resolusi dan FPS ESP32-CAM

Di atas kertas, sensor OV2640 bisa menghasilkan 15 frame per detik di 1600×1200, 30 di 800×600, dan 60 di ukuran CIF. Dalam praktiknya, frame rate lebih banyak ditentukan oleh koneksi Wi-Fi dan ukuran frame JPEG: ketika resolusi dan kualitas naik, setiap frame makin besar dan makin lambat melintasi jaringan. Nilai di bawah adalah rentang perkiraan yang terlihat dengan CameraWebServer pada sinyal Wi-Fi yang bagus dengan kualitas JPEG 10–12. Untuk mengukur board-mu sendiri, atur Core Debug Level ke Info; selama streaming, Serial Monitor mencetak baris seperti MJPG: ... (x fps) untuk setiap frame.

ResolusiPikselPerkiraan FPS (stream Wi-Fi)Cocok untuk
QQVGA160×12025–30Deteksi gerakan, jaringan yang sangat lemah
QVGA320×24020–30Mobil robot, video langsung yang mulus
CIF400×29615–25Tontonan mulus di layar kecil
VGA640×48010–20Tontonan langsung serbaguna
SVGA800×6008–15Gambar lebih tajam; ukuran terbesar yang bisa dipakai tanpa PSRAM
XGA1024×7685–10Gambar yang detail
HD1280×7204–8Bingkai lebar (16:9)
SXGA1280×10243–6Foto
UXGA1600×12002–5Foto dengan resolusi tertinggi

Di kodemu sendiri, resolusi, kualitas, dan orientasi bisa kamu ubah lewat objek sensor begitu kamera berhasil dimulai. Kualitas JPEG adalah angka dari 0 sampai 63, dan angka yang lebih kecil berarti kualitas lebih tinggi; turun di bawah 10 membuat frame makin besar dan bisa menghasilkan gambar yang setengah jadi.

C++ (Arduino IDE)
1// esp_camera_init() başarılı olduktan sonra / after esp_camera_init() succeeds
2sensor_t *s = esp_camera_sensor_get();
3s->set_framesize(s, FRAMESIZE_VGA);   // 640x480 çözünürlük / resolution
4s->set_quality(s, 12);                // 0-63: küçük = daha kaliteli, 10 altı önerilmez / lower = better, below 10 not advised
5s->set_vflip(s, 1);                   // görüntüyü dikey çevir / flip vertically
6s->set_hmirror(s, 1);                 // yatay ayna / mirror horizontally
7s->set_brightness(s, 1);              // parlaklık -2..2 / brightness -2..2

Kenapa pengaturan PSRAM ESP32-CAM sangat penting?

Memori internal ESP32 sebesar 520 KB, dan stack Wi-Fi memakai sebagian besar darinya. Sementara itu, satu frame JPEG 1600×1200 bisa memakan 100–250 KB tergantung adegan dan kualitasnya. Karena itu driver kamera menaruh frame buffer-nya di PSRAM. CameraWebServer memeriksa PSRAM dengan fungsi psramFound(): kalau ada, ia mulai di resolusi tertinggi dengan dua frame buffer; kalau tidak, ia membatasi resolusi ke SVGA (800×600) dan menyimpan satu buffer di memori internal.

Kalau kamu meminta resolusi tinggi selama PSRAM tidak aktif, Serial Monitor menampilkan frame buffer malloc failed diikuti Camera init failed with error 0xffffffff. Solusinya, pilih AI Thinker ESP32-CAM sebagai board (dengan ESP32 Dev Module, atur Tools > PSRAM: Enabled) atau turunkan resolusinya dan kurangi jumlah frame buffer menjadi 1. Beberapa klon murah mungkin sama sekali tidak punya chip PSRAM; baris PSRAM di sketch uji pertama langsung mengungkapnya.

Camera init failed with error 0x105 dan error kamera lainnya

Sebagian besar error kamera berasal dari salah satu dari tiga penyebab: model kamera yang salah di kode, kabel pita yang tidak terpasang dengan benar di konektornya, atau catu daya yang tidak memadai. Membaca kode error di Serial Monitor dengan cepat mempersempit penyebabnya:

Pesan Serial MonitorArtiSolusi
“Camera probe failed with error 0x105(ESP_ERR_NOT_FOUND)”ESP32 tidak menemukan kamera di bus SCCBPastikan CAMERA_MODEL_AI_THINKER dipilih, pasang ulang kabel pita, beri daya board dengan 5 V / 2 A
“Detected camera not supported” dan 0x106Situasi yang sama di versi driver yang lebih baru: kamera tidak ditemukan atau tidak dikenaliLangkah yang sama seperti 0x105; kalau masih terjadi, ganti modul kameranya
“frame buffer malloc failed” dan 0xffffffffMemori untuk frame buffer tidak bisa dialokasikanAktifkan PSRAM, turunkan resolusi, atur fb_count ke 1
“cam_hal: EV-VSYNC-OVF” atau “FB-OVF”Frame baru datang sebelum frame sebelumnya selesai diolah, jadi ada frame yang terlewatTidak berbahaya kalau sesekali; kalau sering, turunkan resolusi dan perbaiki sinyal Wi-Fi
“NO-SOI” (penanda awal JPEG tidak ada)Frame JPEG rusak atau tidak lengkapPeriksa catu daya dan kabel pita, atur xclk_freq_hz ke 10000000
Gambar hilang separuh, hijau, atau bergarisFrame tidak muat di buffer, atau catu dayanya berisikNaikkan nilai kualitas JPEG ke 12 atau lebih, perbaiki catu daya
Ketika memasang kabel pita, angkat tutup pengunci hitam di konektor, dorong kabel sampai masuk penuh dan lurus, lalu tutup lagi penguncinya. Jangan pernah mencolokkan atau mencabut kamera ketika board menyala; kamera dan ESP32 sama-sama bisa rusak. Ingat juga untuk melepas lapisan pelindung dari lensa modul kamera baru, kalau tidak gambarnya akan terlihat buram.

Error brownout dan catu daya yang tepat (5 V / 2 A)

Kalau Serial Monitor menampilkan Brownout detector was triggered dan board terus restart, tegangan catu ESP32 sempat turun di bawah level aman. ESP32-CAM menarik puncak arus yang singkat tetapi tinggi pada momen ia menyalakan pemancar Wi-Fi dan kamera mulai menangkap gambar. Port USB yang lemah, kabel jumper yang tipis dan panjang, atau output 3,3 V adaptor tidak sanggup mengikuti puncak ini. Inilah solusi permanennya:

  • Pakai catu daya yang memberikan 5 V dan minimal 2 A dan hubungkan ke pin 5V board; regulator di board menurunkannya ke 3,3 V.
  • Buat kabel daya pendek dan tebal; breadboard dan kabel jumper yang panjang menambah penurunan tegangan.
  • Tambahkan kapasitor elektrolit 470–1000 µF di antara pin 5V dan GND board, sedekat mungkin dengan board (kaki positif ke 5V).
  • Kalau memberi daya dari komputer, colokkan langsung ke port di bagian belakang PC, bukan ke USB hub.
  • Untuk pemakaian dengan baterai, pakai sel 18650 dengan modul boost 5 V; ini jauh lebih stabil daripada rangkaian baterai AA.
Baterai Li-ion 18650
Sel Li-ion 18650: bersama modul boost 5 V, sel ini memberi catu daya yang stabil untuk proyek ESP32-CAM bertenaga baterai.

Di internet kamu akan sering menemukan baris WRITE_PERI_REG(RTC_CNTL_BROWN_OUT_REG, 0), yang mematikan detektor brownout lewat kode. Baris ini menghentikan restart, tetapi tidak menyelesaikan masalahnya: tegangannya tetap turun, dan board sekarang bisa macet, menghasilkan frame rusak, atau kehilangan data ketika menulis ke flash. Pakai hanya untuk uji sementara; daftar lengkap pesan restart ada di panduan brownout dan Guru Meditation ESP32. Ketika memperkirakan daya tahan baterai, anggap board menarik rata-rata 180 mA selama streaming terus-menerus: 18650 2600 mAh dengan konverter boost berefisiensi 85% memberi sekitar 1600 mAh di sisi 5 V, yang berarti sekitar 9 jam streaming. Angkamu sendiri bisa dihitung dengan kalkulator daya tahan baterai; ingat bahwa bahkan dalam deep sleep board menarik sekitar 6 mA karena regulator dan PSRAM.

Mengendalikan LED flash (GPIO 4)

LED putih terang di bagian depan board dikendalikan lewat transistor yang tersambung ke GPIO 4, jadi pin hanya menyalakan transistor dan arus besar LED datang dari jalur daya. digitalWrite(4, HIGH) menyalakannya dan LOW mematikannya. LED ini sangat terang, dan kalau menyala lama, LED dan board sama-sama memanas; sebaiknya flash dinyalakan hanya beberapa ratus milidetik ketika mengambil foto. GPIO 4 juga jalur DATA1 kartu microSD, jadi ketika kartu bekerja di mode 4-bit, flash berkedip sendiri di setiap pembacaan dan penulisan. Untuk mencegahnya, mulai kartu SD dalam mode 1-bit (SD_MMC.begin("/sdcard", true)); di beberapa board, LED mungkin masih menyala sangat redup.

Menyimpan foto ke kartu microSD dengan ESP32-CAM

Sketch di bawah menyalakan flash, mengambil foto di 1600×1200, lalu menyimpannya ke kartu microSD sebagai foto1.jpg, foto2.jpg... setiap kali kamu menekan tombol di GPIO 13. Format kartu microSD sebagai FAT32 di komputermu; walaupun dokumentasi resmi menyebut kartu sampai 4 GB, kartu FAT32 16–32 GB biasanya bekerja dengan baik dalam praktiknya. Hubungkan satu kaki tombol ke GPIO 13 dan kaki lainnya ke GND; sketch mengaktifkan resistor pull-up internal, jadi tidak perlu resistor tambahan. Untuk cara kerja pengkabelan tombol, baca Cara Menghubungkan Push Button ke Arduino.

C++ (Arduino IDE)
1#include "esp_camera.h"
2#include "FS.h"
3#include "SD_MMC.h"
4
5// AI-Thinker ESP32-CAM kamera pinleri / AI-Thinker ESP32-CAM camera pins
6#define PWDN_GPIO_NUM     32
7#define RESET_GPIO_NUM    -1
8#define XCLK_GPIO_NUM      0
9#define SIOD_GPIO_NUM     26
10#define SIOC_GPIO_NUM     27
11#define Y9_GPIO_NUM       35
12#define Y8_GPIO_NUM       34
13#define Y7_GPIO_NUM       39
14#define Y6_GPIO_NUM       36
15#define Y5_GPIO_NUM       21
16#define Y4_GPIO_NUM       19
17#define Y3_GPIO_NUM       18
18#define Y2_GPIO_NUM        5
19#define VSYNC_GPIO_NUM    25
20#define HREF_GPIO_NUM     23
21#define PCLK_GPIO_NUM     22
22
23#define FLAS_LED  4    // beyaz flaş LED'i / white flash LED
24#define BUTON    13    // butonun diğer ucu GND'de / other button leg to GND
25
26int fotoNo = 1;        // sıradaki dosya numarası / next file number
27bool hazir = false;    // kamera ve SD hazır mı? / are camera and SD ready?
28
29bool kameraBaslat() {
30  camera_config_t config = {};
31  config.ledc_channel = LEDC_CHANNEL_0;
32  config.ledc_timer   = LEDC_TIMER_0;
33  config.pin_d0 = Y2_GPIO_NUM;
34  config.pin_d1 = Y3_GPIO_NUM;
35  config.pin_d2 = Y4_GPIO_NUM;
36  config.pin_d3 = Y5_GPIO_NUM;
37  config.pin_d4 = Y6_GPIO_NUM;
38  config.pin_d5 = Y7_GPIO_NUM;
39  config.pin_d6 = Y8_GPIO_NUM;
40  config.pin_d7 = Y9_GPIO_NUM;
41  config.pin_xclk     = XCLK_GPIO_NUM;
42  config.pin_pclk     = PCLK_GPIO_NUM;
43  config.pin_vsync    = VSYNC_GPIO_NUM;
44  config.pin_href     = HREF_GPIO_NUM;
45  config.pin_sccb_sda = SIOD_GPIO_NUM;
46  config.pin_sccb_scl = SIOC_GPIO_NUM;
47  config.pin_pwdn     = PWDN_GPIO_NUM;
48  config.pin_reset    = RESET_GPIO_NUM;
49  config.xclk_freq_hz = 20000000;           // 20 MHz kamera saati / 20 MHz camera clock
50  config.pixel_format = PIXFORMAT_JPEG;
51
52  if (psramFound()) {
53    config.frame_size   = FRAMESIZE_UXGA;   // 1600x1200
54    config.jpeg_quality = 10;               // küçük = daha kaliteli / lower = better quality
55    config.fb_count     = 2;
56    config.fb_location  = CAMERA_FB_IN_PSRAM;
57    config.grab_mode    = CAMERA_GRAB_LATEST;
58  } else {
59    config.frame_size   = FRAMESIZE_SVGA;   // PSRAM yoksa 800x600 / 800x600 without PSRAM
60    config.jpeg_quality = 12;
61    config.fb_count     = 1;
62    config.fb_location  = CAMERA_FB_IN_DRAM;
63    config.grab_mode    = CAMERA_GRAB_WHEN_EMPTY;
64  }
65
66  esp_err_t err = esp_camera_init(&config);
67  if (err != ESP_OK) {
68    Serial.printf("Camera init failed 0x%x (%s)\n", err, esp_err_to_name(err));
69    return false;
70  }
71  return true;
72}
73
74void fotoCek() {
75  digitalWrite(FLAS_LED, HIGH);              // flaşı yak / flash on
76  delay(150);                                // pozlama otursun / let exposure settle
77
78  camera_fb_t *fb = esp_camera_fb_get();     // eski kareyi at / discard the stale frame
79  if (fb) esp_camera_fb_return(fb);
80  fb = esp_camera_fb_get();                  // asıl fotoğraf / the real photo
81  digitalWrite(FLAS_LED, LOW);               // flaşı söndür / flash off
82
83  if (!fb) {
84    Serial.println("Kare alinamadi / Capture failed");
85    return;
86  }
87
88  String yol = "/foto" + String(fotoNo) + ".jpg";
89  File dosya = SD_MMC.open(yol, FILE_WRITE);
90  if (dosya) {
91    dosya.write(fb->buf, fb->len);           // JPEG verisini yaz / write the JPEG data
92    dosya.close();
93    Serial.printf("Kaydedildi / Saved: %s (%u bayt / bytes)\n", yol.c_str(), (unsigned)fb->len);
94    fotoNo++;
95  } else {
96    Serial.println("Dosya acilamadi / Could not open file");
97  }
98  esp_camera_fb_return(fb);                  // tamponu geri ver / return the buffer
99}
100
101void setup() {
102  Serial.begin(115200);
103  pinMode(BUTON, INPUT_PULLUP);
104
105  if (!kameraBaslat()) return;               // kamera yoksa dur / stop without a camera
106
107  // 1-bit mod: GPIO 4, 12 ve 13 boşta kalır / 1-bit mode keeps GPIO 4, 12 and 13 free
108  if (!SD_MMC.begin("/sdcard", true)) {
109    Serial.println("SD kart takilamadi / SD card mount failed");
110    return;
111  }
112  if (SD_MMC.cardType() == CARD_NONE) {
113    Serial.println("SD kart yok / No SD card");
114    return;
115  }
116
117  pinMode(FLAS_LED, OUTPUT);
118  digitalWrite(FLAS_LED, LOW);
119
120  // Var olan fotoğrafların üzerine yazma / don't overwrite existing photos
121  while (SD_MMC.exists("/foto" + String(fotoNo) + ".jpg")) fotoNo++;
122
123  hazir = true;
124  Serial.println("Hazir, butona bas / Ready, press the button");
125}
126
127void loop() {
128  if (!hazir) {                              // hata varsa bekle / wait if setup failed
129    delay(1000);
130    return;
131  }
132  if (digitalRead(BUTON) == LOW) {
133    delay(30);                               // buton sıçramasını (bounce) önle / debounce
134    if (digitalRead(BUTON) == LOW) {
135      fotoCek();
136      while (digitalRead(BUTON) == LOW) delay(10);   // bırakılmasını bekle / wait for release
137    }
138  }
139}

Karena sketch memulai kartu SD dalam mode 1-bit, ia hanya memakai GPIO 2, 14, dan 15, sehingga GPIO 4 tersisa untuk flash dan GPIO 13 untuk tombol. Sebelum mengambil foto, satu frame diambil lalu langsung dikembalikan: kamera menghasilkan frame terus-menerus, jadi frame pertama di buffer mungkin sudah tertangkap sebelum flash menyala, dan auto exposure butuh jeda singkat untuk menyesuaikan dengan cahaya baru. Nomor file ditentukan dengan melihat file yang sudah ada di kartu, jadi foto lama tidak tertimpa bahkan setelah restart. Untuk aturan umum mencatat data ke kartu SD, lihat panduan modul kartu SD.

MicroPython dan board kamera yang lebih baru

ESP32-CAM juga bisa diprogram dengan MicroPython, tetapi build MicroPython resmi tidak menyertakan driver kamera; kamu harus menulis firmware komunitas yang sudah ditambahi dukungan kamera. Karena itu jalur Arduino IDE jauh lebih mulus untuk pemula. Kalau kamu tidak mau repot dengan board tanpa soket USB, pertimbangkan juga board kamera berbasis ESP32-S3 dengan USB dan memori lebih besar (misalnya Seeed XIAO ESP32S3 Sense atau ESP32-S3-EYE); board ini juga muncul di daftar model CameraWebServer.

Ide proyek ESP32-CAM

  • Foto ketika ada gerakan: ambil foto ketika sensor PIR mendeteksi seseorang lalu kirim ke ponselmu; panduan langkah demi langkahnya ada di foto ESP32-CAM ke Telegram.
  • Rekaman time-lapse: biarkan board bangun setiap 10 menit, mengambil foto, menyimpannya ke kartu SD, lalu kembali ke deep sleep; amati tanaman tumbuh atau cuaca berubah.
  • Kamera bel pintu: potret depan pintumu ketika tombol bel ditekan dan kirim notifikasi dengan bot Telegram.
  • Mobil robot berkamera: kemudikan mobil sambil menonton live stream QVGA yang mulus di ponselmu.
  • Kamera hewan peliharaan: tonton live stream di jaringan rumahmu dan nyalakan flash dari halaman web ketika perlu.
  • Panel kontrol buatanmu sendiri: sematkan live stream di halaman web-mu sendiri dan tambahkan tampilan relay dan sensor di sampingnya; panduan WebSocket ESP32 menunjukkan caranya.

Kesalahan umum dan cara mengatasinya

GejalaKemungkinan penyebabSolusi
“Failed to connect to ESP32: No serial data received” (di versi lama “Timed out waiting for packet header”)Board tidak dalam mode download, atau TX dan RX salahSambungkan IO0 ke GND atau pakai tombol IO0, tekan RST; pastikan TX ke U0R dan RX ke U0T
“Wrong boot mode detected (0x13)”GPIO 0 tidak LOW ketika bootSelalu tekan RST setelah membuat sambungan IO0-GND
“waiting for download” di Serial MonitorIO0 masih tersambung ke GNDLepaskan kabel IO0 dan tekan RST
Karakter acak di Serial MonitorBaud rate salahAtur Serial Monitor ke 115200 baud
Board tidak ada di daftar portDriver belum terinstal, atau kabel khusus casInstal driver CH340 atau CP2102, pakai kabel data
Upload gagal ketika kartu SD terpasangGPIO 2 adalah jalur SD sekaligus pin strappingCabut kartu microSD selama upload
Gambar sangat lambat atau sering macetSinyal Wi-Fi lemah atau resolusi tinggiTurunkan ke VGA atau QVGA, dekatkan board ke router, pakai antena eksternal kalau perlu
Flash menyala redup terus-menerusKartu SD dalam mode 4-bit, atau GPIO 4 dibiarkan mengambangMulai kartu SD dalam mode 1-bit, atur GPIO 4 ke OUTPUT dan tulis LOW
Kalau ingin memasang antena eksternal (IPEX), posisi resistor 0 Ω mungil di samping antena menentukan antena mana yang dipakai board; mencolokkan antena saja tidak cukup, kamu juga harus memindahkan resistornya. Kalau board tidak mau boot atau kartu SD tidak mau mulai, lepaskan semua modul di GPIO 2, 12, dan 13 lalu coba lagi: GPIO 2 dan 12 adalah pin strapping, dan GPIO 13 adalah jalur DATA3 kartu SD, yang tidak boleh LOW selama kartu sedang diinisialisasi.

ESP32-CAM adalah cara termudah untuk membuat kamera Wi-Fi di board yang terjangkau, dan hampir setiap kesulitan yang kamu temui berasal dari sambungan pemrograman atau catu daya. Begitu kedua hal itu benar, board ini mengirim video langsung dari web server-nya sendiri, mengambil foto, dan menyimpannya ke kartu SD. Di aplikasi BlueGrays ada proyek ESP32 seperti koneksi Wi-Fi, web server, mDNS, pencatatan data ke microSD, dan alarm gerak dengan notifikasi Telegram, masing-masing dengan skema rangkaian langkah demi langkah dan kode siap pakai.

Pertanyaan umum

Bagaimana cara memprogram ESP32-CAM?

Karena ESP32-CAM tidak punya soket USB, kamu butuh adaptor ESP32-CAM-MB atau adaptor USB-TTL. Di Arduino IDE kamu memilih board AI Thinker ESP32-CAM dan memasukkan board ke mode download dengan menekan RST selama GPIO 0 tersambung ke GND (atau selama tombol IO0 di MB ditahan). Setelah upload, lepaskan sambungan IO0 dan tekan RST lagi.

Bisakah ESP32-CAM diprogram dengan Arduino Uno?

Bisa; kalau pin RESET Uno kamu hubungkan ke GND, chip USB-nya bekerja seperti jembatan USB-serial. Dalam kasus itu pengkabelannya lurus, tidak disilang: D0 (RX) Uno ke U0R, D1 (TX) ke U0T, dan IO0 tetap disambung ke GND. Karena sinyal Uno bertegangan 5 V, cara ini mendorong ESP32 sampai batasnya; untuk pemakaian rutin, adaptor MB atau adaptor USB-TTL 3,3 V lebih aman.

Berapa tegangan yang dibutuhkan ESP32-CAM?

Memberi daya board dengan 5 V di pin 5V adalah cara yang disarankan; regulator di board menurunkannya ke 3,3 V. Kamu juga bisa memberi 3,3 V di pin 3V3, tetapi kalau sumbernya tidak sanggup menangani puncak arus Wi-Fi, board akan terus restart. Catu daya yang bisa memberikan minimal 2 A mencegah sebagian besar error brownout.

Bagaimana cara mengatasi error Camera init failed di ESP32-CAM?

Kode error 0x105 atau 0x106 berarti kamera sama sekali tidak ditemukan: pertama pastikan CAMERA_MODEL_AI_THINKER dipilih di kode, lalu pastikan kabel pita terpasang penuh, dan beri daya board dengan 5 V / 2 A. Kalau masalahnya masih ada, mungkin modul kameranya rusak. Kalau kamu melihat 0xffffffff bersama “frame buffer malloc failed”, aktifkan PSRAM atau turunkan resolusinya.

Apakah ESP32-CAM bisa bekerja tanpa internet?

Bisa. Untuk menonton gambarnya kamu hanya butuh jaringan lokal, bukan internet; ESP32-CAM juga bisa membuat jaringan Wi-Fi sendiri dengan WiFi.softAP() dan kemudian dijangkau di browser lewat 192.168.4.1. Kamu bahkan bisa menjalankannya tanpa jaringan sama sekali sebagai kamera yang hanya menyimpan foto ke kartu microSD.

Bisakah ESP32-CAM merekam video?

Contoh siap pakai mengirim video langsung sebagai MJPEG dan mengambil foto satu per satu; contoh itu tidak langsung merekam file video. Ada proyek komunitas yang menulis frame JPEG berturut-turut ke kartu microSD untuk membuat file AVI, tetapi frame rate-nya terbatas bahkan di resolusi rendah. Board ini tidak punya mikrofon, jadi juga tidak bisa merekam suara.

Lihat semua proyek
LED Berkedip dengan ESP32
#103Pemula

LED Berkedip dengan ESP32

Mengajarkan penggunaan output GPIO dasar dengan ESP32. Kita membuat efek berkedip dengan menyalakan dan mematikan LED dari pin digital. Versi ESP32 dari proyek blink klasik di Arduino UNO; perintah blink dasar di lingkungan Arduino sama, tetapi susunan pin ESP32 dan level GPIO 3,3 V-nya berbeda dengan Arduino UNO.

4.7(37)
99
Kedipan LED Bawaan ESP32
#106Pemula

Kedipan LED Bawaan ESP32

Mengedipkan LED biru bawaan di ESP32 DevKit V1. Tidak perlu komponen eksternal! Proyek pertama yang sebaiknya kamu coba ketika membeli ESP32. GPIO 2 tersambung ke LED bawaan.

4.8(29)
53
Koneksi Wi-Fi STA ESP32 (dengan Layar LCD)
#127Mahir

Koneksi Wi-Fi STA ESP32 (dengan Layar LCD)

Di proyek ini, kita menyambungkan ESP32 ke jaringan Wi-Fi rumah dalam mode Station (STA) dengan cara yang aman dan tahan gangguan. Kita menyimpan SSID dan kata sandi di file secrets.h terpisah agar tidak bocor ke Git, menyiapkan mekanisme sambung ulang otomatis, dan menampilkan tingkat sinyal RSSI dan alamat IP di layar LCD I2C. LED bawaan bekerja sebagai indikator status. Ini adalah pengelola koneksi kelas produksi.

4.4(21)
34
Web Server Asinkron ESP32 (dengan Tampilan IP di LCD)
#129Mahir

Web Server Asinkron ESP32 (dengan Tampilan IP di LCD)

Di proyek ini, kita mengubah ESP32 menjadi web server asinkron yang bisa kamu kendalikan dari ponsel atau komputer di jaringan Wi-Fi yang sama. Berkat library ESPAsyncWebServer, server bisa memproses beberapa permintaan bersamaan (berbeda dengan WebServer.h klasik, yang memblokir pada satu permintaan). Kamu bisa membuka alamat IP ESP32 di browser dan mengklik tombol ON/OFF (rute /on dan /off) untuk menyalakan dan mematikan LED yang tersambung ke GPIO 5.

4.8(16)
26
mDNS ESP32: Mengakses Perangkat lewat bluegrays-esp.local (dengan Layar LCD)
#131Mahir
Premium

mDNS ESP32: Mengakses Perangkat lewat bluegrays-esp.local (dengan Layar LCD)

Di proyek ini, kita menambahkan layanan mDNS (Multicast DNS) ke ESP32, sehingga perangkat bisa diakses dengan nama host seperti bluegrays-esp.local, bukan alamat IP. Meskipun IP dari DHCP berubah, perangkat selalu bisa dijangkau dengan nama yang sama. Web server kecil di perangkat menerima perintah kendali LED dari browser lewat alamat http://bluegrays-esp.local/. Layar LCD I2C menampilkan nama host, alamat IP, dan status LED.

4.8(14)
23
Pencatat Data Suhu ESP32 (DHT22 + RTC DS1307 + microSD + OLED)
#144Mahir
Premium

Pencatat Data Suhu ESP32 (DHT22 + RTC DS1307 + microSD + OLED)

Buat pencatat suhu bercap waktu dengan ESP32! Baca suhu/kelembapan DHT22 setiap menit, ambil waktu sebenarnya dari RTC DS1307, dan catat ke kartu microSD sebagai CSV. OLED menampilkan suhu langsung (font besar), kelembapan, cap waktu, dan penghitung catatan. File /temp_log.csv bisa dibuka di Excel, Google Sheets, atau Python pandas; cocok untuk rumah kaca, suhu kamar, data laboratorium, penyimpanan makanan, atau sarang lebah.

4.7(7)
12
Sistem Alarm Gerakan ESP32 (PIR + Buzzer + LED + Telegram)
#145Mahir
Premium

Sistem Alarm Gerakan ESP32 (PIR + Buzzer + LED + Telegram)

Sistem alarm keamanan pintar yang menyalakan buzzer dan LED ketika sensor PIR mendeteksi gerakan, sekaligus mengirim notifikasi instan ke pemilik lewat Telegram. Cooldown 30 detik membatasi seberapa sering alarm berulang; mekanisme ini tidak memvalidasi deteksi PIR atau menghilangkan pemicu palsu. Cocok untuk rumah, garasi, gudang, atau ruang kerja. Dengan ESP32-CAM bisa ditambahkan notifikasi berfoto; dengan ESP32 DevKit V1 klasik, notifikasinya berupa teks.

0.0(0)
9