back to top

ESP32 Cam ile Güvenlik Sistemi Yaptık!!

Selam Makerlar

Güvenlik herkesin hassas olduğu bir konu; hem kendimiz hem de sevdiklerimiz için güvenli bir ortam sağlamak istiyoruz. Günümüzde teknoloji, ev ve iş yerlerimizin güvenliğini artırmak için pek çok imkan sunuyor. Ancak, güvenlik sistemleri genelde maliyetli olabiliyor. Bu nedenle, evde kendi başımıza yapabileceğimiz düşük maliyetli ve etkili bir güvenlik sistemi oluşturmak ilginç bir çözüm olarak karşımıza çıkıyor.

Bu blog yazısında, kolayca bulunabilen bileşenlerle ESP32-CAM tabanlı  bir güvenlik sistemi tasarlayacağız. Işık algılayıcılı (LDR) bu sistem, dış ortamdaki ışık seviyesi değiştiğinde otomatik olarak devreye girip fotoğraf çeker ve bu görüntüyü uzaktan erişimle görmemize olanak tanır. Hazırsanız, hem eğlenceli hem de pratik bir projeye başlayalım!

Kullanılan Malzemeler

Tüm Kodları İndir

Ne Yapacağız?

Okul dolabınızda, iş çekmecesinde, üzerini örttüğünüz bir çarşafın altında hatta yastığınızın altında bulunan bir eşyanız olduğunu varsayalım. Bu eşyanızı ortam değerindeki ışık kat sayısı belli bir değerin üzerine çıktığında anlık fotoğraf gönderilecek. Projeyi anladıysak devre elemanlarını tanıyalım ve sistemimizi oluşturmaya başlayalım. 

Devre Elemanlarını İnceliyoruz

Projeye başlarken, kullanacağımız her bir devre elemanını detaylıca anlamamız, daha güvenli ve verimli bir sonuç elde etmemize yardımcı olur. İşte projemizin temel bileşenleri ve görevleri:

  1. ESP32-CAM WiFi Bluetooth Geliştirme Kartı + OV2640 Kamera Modülü
    ESP32-CAM, projelerinizde fotoğraf çekip internet üzerinden paylaşmanızı sağlayan küçük ama güçlü bir cihaz. Hem WiFi hem de Bluetooth desteği sayesinde kolayca bağlantı kurabiliyor ve veri aktarımı yapabiliyor.

    • Kamera Özelliği: Modül üzerindeki OV2640 kamera, anlık görüntüleri yakalayıp hızlı bir şekilde işlememize olanak tanır. Bu kamera modülü düşük ışık koşullarında bile kaliteli görüntü sağlayarak, güvenlik açısından önemli bir avantaj sunar.

    • Kullanım Kolaylığı: Arduino IDE üzerinden kolayca programlanabilen ESP32-CAM, IoT (Internet of Things) projeler için de idealdir. Basit bir güvenlik kamerası yapmak veya uzaktan izleme sistemi kurmak için gereken tüm temel bileşenlere sahiptir.

  2. FTDI Programlama Kartı (3.3V – 5V Seçenekli)
    ESP32-CAM modülünü bilgisayara bağlayarak programlayabilmek için FTDI kartına ihtiyacımız var. USB bağlantısıyla çalışan bu kart, modül ile bilgisayar arasında veri transferini sağlar.

    • Voltaj Ayarları: ESP32-CAM modülü, 3.3V gerilim ile çalışır. FTDI kartı üzerindeki voltaj ayar anahtarı, 3.3V seçeneğine ayarlandığında ESP32-CAM için güvenli bir bağlantı kurmuş oluruz.

    • Kolay Bağlantı: Kart üzerindeki TX ve RX pinlerini ESP32-CAM üzerindeki U0R ve U0T pinlerine bağlamak yeterlidir. Bu bağlantı, bilgisayar ve modül arasındaki veri akışını sağlar.

  3. LDR (Işık Algılayıcı)
    Işık bağımlı direnç (LDR), ışık miktarına göre direncini değiştiren bir sensördür. Bu projede, ortam ışığındaki ani değişiklikleri tespit ederek ESP32-CAM’i tetiklemek için kullanacağız.

    • Çalışma Prensibi: LDR’nin direnci, ışık miktarı arttıkça düşer. Örneğin bir ışık açıldığında veya ortam aydınlandığında, LDR’nin direnci azalır ve bu değişiklik ESP32-CAM tarafından algılanır. Bu şekilde, istenmeyen bir hareket veya ani bir ışık değişikliği olduğunda sistem otomatik olarak fotoğraf çeker.

    • Pratik Kullanım: LDR sensörleri, güvenlik dışında da birçok projede kullanılır. Özellikle otomatik aydınlatma sistemleri, gece lambaları veya akıllı pencere perdeleri gibi projelerde işlevseldir.

  4. 1/4 W 10K Direnç Paketi
    LDR ile çalışırken bir direnç kullanmamız gerekiyor. Direnç, LDR'nin devreyle uyum içinde çalışmasını sağlar ve yanlışlıkla fazla akım çekmesini önler.

    • Gerilim Bölücü Devre: LDR ve direncin birlikte kullanımı, gerilim bölücü devre yapmamıza olanak tanır. Bu devredeki voltaj değişimleri, LDR üzerinden gelen ışık miktarına göre değişir. Böylece ESP32-CAM üzerindeki analog giriş pinine doğru bir voltaj ulaştırabiliriz.

    • Temel Görev: Direnç, devreyi dengeleyerek uzun süreli ve kararlı bir çalışma sağlar. Projemizin düzgün çalışması için önemlidir.

  5. Ayarlanabilir 3 A Voltaj Düşürücü Regülatör Kartı – LM2596-ADJ
    ESP32-CAM gibi hassas modüller belirli bir voltajla çalışır. 18650 pillerimiz 3.7V sağlarken, ESP32-CAM’in stabil çalışması için daha düşük bir voltaja ihtiyaç duyarız. Bu durumda devreye voltaj düşürücü kartımız giriyor.

    • Voltaj Ayarlama: LM2596 regülatör kartı, 3.7V’u 3.3V seviyesine düşürerek ESP32-CAM’e uygun hale getirir. Kart üzerindeki ayarlama potansiyometresi ile voltaj değerini tam ihtiyacımız olan seviyeye çekebiliriz.

    • Akım Dayanıklılığı: 3 Amper’lik yüksek akım kapasitesi sayesinde, sistemin stabil bir şekilde çalışmasını sağlar ve aşırı yüklenme durumlarında devreyi korur.

  6. 18650 3.7 V 2600mAh Li-ion Şarjlı Pil (2 adet)
    Bu şarjlı piller, ESP32-CAM gibi projelerde popüler olan bir güç kaynağıdır. Özellikle taşınabilirlik gerektiren projelerde tercih edilir.

    • Yüksek Kapasite: 2600mAh kapasiteli bu piller, projenizin uzun süre kesintisiz çalışmasını sağlar. İki adet kullanarak çalışma süresini daha da uzatabilirsiniz.

    • Dayanıklılık: Li-ion piller, tekrar şarj edilebilir yapısıyla uzun vadede ekonomik bir çözüm sunar. Ayrıca, güvenli çalışma sağlar ve düşük voltaj durumlarında sistemi otomatik olarak kapatır.

  7. 18650 Tekli Pil Yuvası (PCB Tip) – Pil Yatağı (2 adet)
    Pilleri güvenli ve düzenli bir şekilde devreye bağlayabilmek için pil yuvalarına ihtiyacımız var.

    • PCB Tipi Tasarım: Bu pil yuvaları, devre kartı uyumlu tasarıma sahip olup pillerin devreyle sağlam bir şekilde bağlanmasını sağlar. Bu, sistemin hareketli veya taşınabilir olduğunda bile güvenli bir bağlantı sunar.

    • İkili Kullanım: Projemizde iki adet pil kullanacağımız için her bir pil için ayrı bir yuva tercih ettik. Böylece, pillerin güvenli bir şekilde bağlanması sağlanır ve bağlantı sorunları ortadan kalkar.

  8. 40 Pin Ayrılabilen Dişi-Dişi F-F Jumper Kablo – 100 mm & 40 Pin Ayrılabilen Dişi-Erkek F-M Jumper Kablo – 100 mm
    Projede tüm bileşenleri bağlarken farklı türde jumper kablolar kullanacağız.

    • Modülerlik Sağlayan Yapı: Ayrılabilir yapısı sayesinde hangi bileşeni bağlamak istiyorsanız ona göre kablonun yönünü ayarlayabilirsiniz. Böylece kablo karmaşası olmadan temiz ve düzenli bir bağlantı elde edersiniz.

    • Çeşitli Bağlantı Seçenekleri: Dişi-dişi ve dişi-erkek kablolar, modüller arası farklı bağlantı ihtiyaçlarına göre uyarlanabilir. Bu, özellikle prototip oluşturma aşamasında büyük kolaylık sağlar.

ESP32-CAM ile FTDI Programlayıcı Kartın Devre Şeması

LDR  Devre Şeması 

Son Devre Şeması 

Kodlar

#include <WiFi.h>
#include <HTTPClient.h>
#include "esp_camera.h"
#include "esp_http_server.h"
#define CAMERA_MODEL_AI_THINKER // AI-Thinker ESP32-CAM modeli
#include "camera_pins.h"

// Wi-Fi bilgileri
const char* ssid = "";         // Wi-Fi ağ adınız
const char* password = ""; // Wi-Fi şifreniz
// Telegram bot bilgileri
#define BOT_TOKEN ""  
#define CHAT_ID ""  
#define LDR_PIN 12 

// HTTP sunucusu tanımlama
httpd_handle_t server = NULL;

// Son fotoğrafın çekildiği zaman
unsigned long lastCaptureTime = 0;
unsigned long lastLDRCheckTime = 0;  
// Bekleme süresi (30 saniye = 30000 milisaniye)
const unsigned long captureInterval = 30000;
const unsigned long ldrInterval = 1000; 

// Son çekilen fotoğrafı depolamak için pointer
camera_fb_t *lastCapturedFrame = NULL;

bool wifi_durum = false;
bool mesaj_durum = false;

void setup() {
  Serial.begin(115200);  
  pinMode(LDR_PIN, INPUT); 
  analogReadResolution(12); //0-4095
  analogSetAttenuation(ADC_11db); //0V - 3.6V arası
}

void loop() {
  unsigned long currentMillis = millis(); // Mevcut zaman

  // LDR'yi belirli bir aralıkta kontrol et
  if (currentMillis - lastLDRCheckTime >= ldrInterval) {
    int ldrValue = analogRead(LDR_PIN);
    Serial.print("LDR PotiValue: "); 
    Serial.println(ldrValue);
    lastLDRCheckTime = currentMillis;

    if(ldrValue > 350 && wifi_durum == false) {
      // Wi-Fi'ye bağlan
      WiFi.begin(ssid, password);
      Serial.print("Wi-Fi'ye bağlanılıyor");
      while (WiFi.status() != WL_CONNECTED) {
        delay(1000);
        Serial.print(".");
      }
      Serial.println();
      Serial.println("Wi-Fi bağlantısı başarılı!");
      wifi_durum = true;
    }
    
    if(wifi_durum == true && mesaj_durum == false) {
      // Telegram'a mesaj gönder
      sendTelegramMessage("LDR'de değişiklik mevcut!! Kamera Açılıyor...");
      mesaj_durum = true;
      startCamera(); // Kamera başlatma işlemi
    }
  }
}

// Kamera başlatma işlemi
void startCamera() {
  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;   // JPEG formatında çekim
  config.frame_size = FRAMESIZE_VGA;      // 640x480 çözünürlük
  config.jpeg_quality = 12;               // JPEG kalitesi
  config.fb_count = 1;                    // Tek kare buffer

  esp_err_t err = esp_camera_init(&config);
  if (err != ESP_OK) {
    Serial.printf("Kamera başlatılamadı, hata: 0x%x", err);
    return;
  }
  
  // HTTP sunucusunu başlat
  startServerCam();
  Serial.println("Kamera başlatıldı!");

  // IP adresini seri monitöre yazdır
  String ip_ = WiFi.localIP().toString();
  String yazi = "http://" + ip_;
  sendTelegramMessage(yazi);
}

// HTTP sunucusu başlatma
void startServerCam() {
  httpd_config_t config = HTTPD_DEFAULT_CONFIG();

  // Sunucu başlatılıyor
  if (httpd_start(&server, &config) == ESP_OK) {
    httpd_uri_t capture_uri = {
        .uri       = "/",  // Tarayıcıda ana sayfa (/)
        .method    = HTTP_GET,
        .handler   = capture_handler, // Görüntü yakalama fonksiyonu
        .user_ctx  = NULL
    };
    httpd_register_uri_handler(server, &capture_uri); // Handler'ı kaydet
  } else {
    Serial.println("HTTP sunucusu başlatılamadı.");
  }
}

// Fotoğraf çekme işlevi (capture_handler)
esp_err_t capture_handler(httpd_req_t *req) {
  unsigned long currentTime = millis(); // Şu anki zaman

  // Son çekimden beri geçen süre kontrolü
  if (currentTime - lastCaptureTime >= captureInterval) {
    // Yeni fotoğraf çekiyoruz
    if (lastCapturedFrame != NULL) {
      esp_camera_fb_return(lastCapturedFrame); // Önceki görüntüyü serbest bırak
    }

    lastCapturedFrame = esp_camera_fb_get(); // Kameradan yeni görüntü al

    if (!lastCapturedFrame) {
      Serial.println("Görüntü alınamadı");
      httpd_resp_send_500(req);
      return ESP_FAIL;
    }

    lastCaptureTime = currentTime; // Son çekim zamanını güncelle
  }

  // HTTP yanıtı ayarları (JPEG formatında)
  httpd_resp_set_type(req, "image/jpeg");
  httpd_resp_set_hdr(req, "Content-Disposition", "inline; filename=capture.jpg");

  // Bellekteki son fotoğrafı yanıt olarak gönder
  return httpd_resp_send(req, (const char *)lastCapturedFrame->buf, lastCapturedFrame->len);
}

// Telegram mesajı gönderme
void sendTelegramMessage(String message) {
  HTTPClient http;
  String url = "https://api.telegram.org/bot";
  url += BOT_TOKEN;
  url += "/sendMessage?chat_id=";
  url += CHAT_ID;
  url += "&text=";
  url += message;

  http.begin(url); // URL'yi başlat
  int httpResponseCode = http.GET(); // GET isteği gönder
  
  if (httpResponseCode > 0) {
    String response = http.getString();
    Serial.println("Mesaj gönderildi, Telegram yanıtı:");
    Serial.println(response);
  } else {
    Serial.print("Mesaj gönderilemedi, hata kodu: ");
    Serial.println(httpResponseCode);
  }
  
  http.end(); // HTTP bağlantısını kapat
}

Son Çıkan Yazılar

CEVAP VER

Lütfen yorumunuzu giriniz!
Lütfen isminizi buraya giriniz