Files
esp32-cam_camera/esp32-cam_camera.ino
T
2025-10-19 00:16:34 +03:00

156 lines
4.3 KiB
Arduino
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#include "esp_camera.h"
#include "SD_MMC.h"
#define CAMERA_MODEL_AI_THINKER
#include "camera_pins.h"
// 📸 Fotoğraf isimlendirme
const char *photoPrefix = "/photo_";
int photoNumber = 0;
// ⚙️ Donanım pinleri
#define BUTTON_PIN 12 // Fotoğraf çekme butonu
#define FLASH_GPIO_NUM 4 // Flaş LED pini
void setup() {
Serial.begin(115200);
Serial.setDebugOutput(false);
Serial.println("\n🚀 ESP32-CAM başlatılıyor...");
pinMode(BUTTON_PIN, INPUT_PULLUP);
pinMode(FLASH_GPIO_NUM, OUTPUT);
digitalWrite(FLASH_GPIO_NUM, LOW);
// 📷 Kamera konfigürasyonu
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;
if (psramFound()) {
config.frame_size = FRAMESIZE_SVGA;
config.jpeg_quality = 10;
config.fb_count = 2;
} else {
config.frame_size = FRAMESIZE_VGA;
config.jpeg_quality = 12;
config.fb_count = 1;
config.fb_location = CAMERA_FB_IN_DRAM;
}
// 🎥 Kamera başlat
esp_err_t err = esp_camera_init(&config);
if (err != ESP_OK) {
Serial.printf("❌ Kamera başlatma hatası! Hata kodu: 0x%x\n", err);
return;
}
// 💾 SD kart başlat
Serial.println("💾 SD kart başlatılıyor...");
if (!SD_MMC.begin("/sdcard", true)) {
Serial.println("❌ SD kart başlatılamadı!");
return;
}
uint8_t cardType = SD_MMC.cardType();
if (cardType == CARD_NONE) {
Serial.println("❌ SD kart takılı değil!");
return;
}
Serial.println("✅ SD kart başarıyla monte edildi!");
// 📂 En son fotoğraf numarasını bul
int lastPhoto = getLastPhotoNumber();
photoNumber = lastPhoto + 1; // Yeni fotoğraf numarası
Serial.printf("📷 Son fotoğraf numarası: %d → Yeni fotoğraf: photo_%d.jpg\n",
lastPhoto, photoNumber);
}
void loop() {
if (digitalRead(BUTTON_PIN) == LOW) {
Serial.println("📸 Butona basıldı! Fotoğraf çekiliyor...");
// 🔦 Flaş aç
digitalWrite(FLASH_GPIO_NUM, HIGH);
delay(200); // ışığın oturması için
// 📷 Fotoğraf al
camera_fb_t *fb = esp_camera_fb_get();
if (!fb) {
Serial.println("❌ Kamera görüntüsü alınamadı!");
digitalWrite(FLASH_GPIO_NUM, LOW);
return;
}
// 📁 Dosya adı oluştur
String photoFileName = String(photoPrefix) + String(photoNumber) + ".jpg";
Serial.printf("📄 Dosya adı: %s\n", photoFileName.c_str());
// 💾 SD karta yaz
File file = SD_MMC.open(photoFileName, FILE_WRITE);
if (!file) {
Serial.println("❌ SD karta yazma hatası (FILE_WRITE başarısız)");
} else {
file.write(fb->buf, fb->len);
file.close();
Serial.printf("✅ Fotoğraf kaydedildi: %s (Boyut: %d bayt)\n", photoFileName.c_str(), fb->len);
photoNumber++;
}
esp_camera_fb_return(fb);
delay(500);
digitalWrite(FLASH_GPIO_NUM, LOW); // Flaş kapat
delay(1000); // Titreşim engelleme
}
}
// 📂 SD karttaki en son fotoğraf numarasını bulan fonksiyon
int getLastPhotoNumber() {
int maxNum = -1;
File root = SD_MMC.open("/");
if (!root) {
Serial.println("❌ SD kart dizini açılamadı!");
return -1;
}
root.rewindDirectory(); // Tarama başından başlat
File file = root.openNextFile();
while (file) {
String name = file.name();
name.toLowerCase();
if (name.startsWith("photo_") && name.endsWith(".jpg")) {
int start = name.indexOf('_') + 1;
int end = name.indexOf('.');
if (start > 0 && end > start) {
int num = name.substring(start, end).toInt();
if (num > maxNum) maxNum = num;
}
}
file.close(); // Dosyayı kapat
file = root.openNextFile();
}
root.close();
return maxNum >= 0 ? maxNum : -1;
}