Nodemcu yada esp32cam ile fotoğraf aktarımı

sms ile “fotoğraf çek” dediğim zaman fotoğraf çekip bana gönderen (mail yada herhangi bir yolla) hobi amaçlı bir sistem düşünüyorum. nasıl yapabilirim?

sms okuması yapması için bir gsm shield kullanılması gerek ayrıca mail yada diğer yollarla göndermesi içinde esp gibi internete bağlanılacak bir modül fotoğraf çekmesi için de dediğiniz gibi bir kamera lazım toplam masraf biraz fazla haberiniz olsun :+1:

peki başka bir yolla yapılabilir mi, alternatifi var mıdır?

Benim bildiğim maalesef yok. :disappointed_relieved:

1 Beğeni

Merhaba,
Bir yol daha var aslında. SMS yoluyla değilde direk internet üzerinden yapabiliriz. ESP32’nin server açıp maile fotoğraf gönderme imkanı var. Blynk üzerinden butona basarsınız ve maile fotoğrafınız düşer. Öyle bir sistem büyük ihtimal yapabilirim yada direk blynk üzerinden canlı olarak ESP32’nin kamerasını canlı olarak izleyebilirsiniz. :slightly_smiling_face:

dediğiniz sistemi nasıl yapabilirim? proje malzemeleri filan

Evet böyle bir yol daha var fakat sms yoluyla olduğu için projenin amacını bozar diye düşünmüştüm :sweat_smile:

Sanırım bir adet bundan lazım ve bir adet telefon :sweat_smile:

bunun kütüphanesinde projeme benzer kod varmı acaba?

Sanırım blynk kütüphanesi var fakat maile fotoğraf atması lazım onun için ayrı bir kütüphane gerekebilir.

1 Beğeni

@ElectroHands IFTTT kullanabiliriz daha mantıklı ve kolay bir çözüm olur server kullanmamıza gerek kalmaz.

Hocam hangi yollu yapıcaksınız one göre kodları hazırlamaya başlıyacağım.
Blynk düğmeli versiyon için ESP32 kameralı versiyon, sd kart modülü(içine fotoğraflar atması için), program atabilmek için FTDI Programlama Kartı(arduino da kullanılabilir) bir de ESP32’yi koyacağınız yerin wifi interneti olması gerekiyor. Canlı bir şekilde izleyecekseniz yine programlama modülü ve ESP32 yeterli. :slightly_smiling_face:

hocam blynk düğmeli güzel ancak siz mi yazacaksınız?

Evet fakat yolda gösterebiliriz kodları sen yazmak istersen :smiley:

Kodların bi kısmı kütüphaneyle birlikte zaten hazır olarak veriliyor sadece kodda bi kaç değişiklik yapıcağım. :slightly_smiling_face: Bu arada sd kart zorunlu yanlışlıkla isteğe göre yazdım.

hocam yani sizi meşgul etmeyelim bununla o yüzden böyle dedim yoksa sıkıntı yok ama iyi olur ben öğrenciyim tam bilmiyorum teşekkür ederim

Tamamdır kodları hallettim. Bağlantı şeması şu videodaki ile aynı PIR sensör kullanmıyacaksınız kalan kısmı hepsi aynı.

KODLAR;

 /********************************************************************************************************************
 *  Kart Özellikleri
 *  Board           : "ESP32 Wrover Module"
 *  Upload Speed    : "921600"
 *  Flash Frequency : "80MHz"
 *  Flash Mode      : "QIO"
 *  Partition Scheme: "Hue APP (3MB No OTA/1MB SPIFFS)"
 *  Core Debug Level: "None"
 *  COM Port        : Her bağlantıda farklı olabilir.
 *********************************************************************************************************************/
 #include <WiFi.h>             //BLYNK için kütüphanelerrr
 #include <WiFiClient.h>
 #include <BlynkSimpleEsp32.h>
 char auth[] = "BurayaYaz";  //Buraya BLYNK tokeninizi yazın
#include "esp_camera.h"
#include "FS.h"
#include "SPI.h"
#include "SD.h"
#include "EEPROM.h"
#include "driver/rtc_io.h"
#include "ESP32_MailClient.h"

//Uygulama modelini AI THINKER olarak seçiyoruz.
//#define CAMERA_MODEL_WROVER_KIT
//#define CAMERA_MODEL_ESP_EYE
//#define CAMERA_MODEL_M5STACK_PSRAM
//#define CAMERA_MODEL_M5STACK_WIDE
#define CAMERA_MODEL_AI_THINKER

#include "camera_pins.h"

#define ID_ADDRESS            0x00
#define COUNT_ADDRESS         0x01
#define ID_BYTE               0xAA
#define EEPROM_SIZE           0x0F

uint16_t nextImageNumber = 0;
char ssid[] = "YourNetworkName";  //buraya wifininiz adını yazın
char pass[] = "YourPassword";     //buraya wifinizin parolasını yazın
#define WIFI_SSID             "xxxxxxxxxxxxxxx"    // Kameranın bağlanacağı wifi SSID girilmeli.
#define WIFI_PASSWORD         "xxxxxxxxxxxxxxx"    // Kameranın bağlanacağı wifi şifresi girilmeli.

#define emailSenderAccount    "[email protected]"                    // e-mail gönderimi için gmail port 465 (SSL) kullanılıyorsa, "daha az güvenli uygulama erişimi" aktif edilmeli. https://myaccount.google.com/lesssecureapps?pli=1
#define emailSenderPassword   "xxxxxxxxxxxxxx"                    // e-mail şifresi.

#define emailRecipient        "[email protected]"   //#define komutu ile birden fazla alıcı tanımlanabilir.

//E-posta gönderme veri nesnesi, gönderilecek yapılandırma ve verileri içerir.
SMTPData smtpData;

//E-posta gönderme durumunu almak için geri arama işlevi.
void sendCallback(SendStatus info);

void setup() 
{
  Serial.begin(115200);
  Serial.println();
  Serial.println("Booting...");

  pinMode(4, INPUT);              //LED flash için GPIO pini ataması yapıyoruz.
  digitalWrite(4, LOW);
  rtc_gpio_hold_dis(GPIO_NUM_4);  //Uyku moduna geçmeden önce etkinleştirilmişse pin tutmayı devre dışı bırakıyoruz.

  //WiFi Bağlantısı
  Serial.print("Connecting to AP");
  WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
  while (WiFi.status() != WL_CONNECTED)
  {
    Serial.print(".");
    delay(200);
  }

  Serial.println("");
  Serial.println("WiFi connected.");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
  Serial.println();
    
  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_UXGA;
    config.jpeg_quality = 10;
    config.fb_count = 2;
  } else 
  {
    config.frame_size = FRAMESIZE_SVGA;
    config.jpeg_quality = 12;
    config.fb_count = 1;
  }

#if defined(CAMERA_MODEL_ESP_EYE)
  pinMode(13, INPUT_PULLUP);
  pinMode(14, INPUT_PULLUP);
#endif

  //Güvenlik Kamerasını başlatıyoruz.
  esp_err_t err = esp_camera_init(&config);
  if (err != ESP_OK) 
  {
    Serial.printf("Camera init failed with error 0x%x", err);
    return;
  }

  //Kamera parametrelerini ayarlıyoruz.
  sensor_t * s = esp_camera_sensor_get();
  s->set_contrast(s, 2);    //min=-2, max=2
  s->set_brightness(s, 2);  //min=-2, max=2
  s->set_saturation(s, 2);  //min=-2, max=2
  delay(100);               //wait a little for settings to take effect
  
  //SD kartı mount ediyoruz.
  Serial.println("Mounting SD Card...");
  MailClient.sdBegin(14,2,15,13);

  if(!SD.begin())
  {
    Serial.println("Card Mount Failed");
    return;
  }

  // EEPROM'u başlatıyoruz.
  if (!EEPROM.begin(EEPROM_SIZE))
  {
    Serial.println("Failed to initialise EEPROM"); 
    Serial.println("Exiting now"); 
    while(1);   //Bir hata oluştuysa bu satırda bekleniyor.  
  }

/*
  EEPROM.get(COUNT_ADDRESS, nextImageNumber);
  Serial.println(nextImageNumber);
  nextImageNumber += 1;
  EEPROM.put(COUNT_ADDRESS, nextImageNumber);
  EEPROM.commit();
  while(1);
  */
  
  /*ERASE EEPROM BYTES START*/
  /*
  Serial.println("Erasing EEPROM...");
  for(int i = 0; i < EEPROM_SIZE; i++)
  {
    EEPROM.write(i, 0xFF);
    EEPROM.commit();
    delay(20);
  }
  Serial.println("Erased");
  while(1);
  */
  /*ERASE EEPROM BYTES END*/  

  if(EEPROM.read(ID_ADDRESS) != ID_BYTE)    //Eğer geçerli bir resim numarası değilse
  {
    Serial.println("Initializing ID byte & restarting picture count");
    nextImageNumber = 0;
    EEPROM.write(ID_ADDRESS, ID_BYTE);  
    EEPROM.commit(); 
  }
  else                                      // resim numarasını geçerli olana kadar bir sonrakini alarak değiştiriyoruz.
  {
    EEPROM.get(COUNT_ADDRESS, nextImageNumber);
    nextImageNumber +=  1;    
    Serial.print("Next image number:");
    Serial.println(nextImageNumber);
  }

  // Yeni bir fotoğraf karesi alınıyor.
  camera_fb_t * fb = NULL;
    
  // Kameranın frame buffer bilgisi alınıyor.
  fb = esp_camera_fb_get();
  if (!fb) 
  {
    Serial.println("Camera capture failed");
    Serial.println("Exiting now"); 
    while(1);   // Bir hata oluştuysa bu satırda bekleniyor.
  }

  //Fotoğraf SD karta kaydediliyor.
  //Fotoğraf için veri yolu ve isim oluşturuluyor.
  String path = "/IMG" + String(nextImageNumber) + ".jpg";
    
  fs::FS &fs = SD;

  //Yeni bir dosya oluşturuluyor.
  File file = fs.open(path.c_str(), FILE_WRITE);
  if(!file)
  {
    Serial.println("Failed to create file");
    Serial.println("Exiting now"); 
    while(1);   //Bir hata oluştuysa bu satırda bekleniyor.    
  } 
  else 
  {
    file.write(fb->buf, fb->len); 
    EEPROM.put(COUNT_ADDRESS, nextImageNumber);
    EEPROM.commit();
  }
  file.close();

  //Kameranın frame buffer bilgisi gönderiliyor.
  esp_camera_fb_return(fb);
  Serial.printf("Image saved: %s\n", path.c_str());

  //E-posta gönderimi
  Serial.println("Sending email...");
  //E-posta ana bilgisayarını, bağlantı noktasını, hesabı ve şifresini ayarlıyoruz. 
  smtpData.setLogin("smtp.gmail.com", 587, emailSenderAccount, emailSenderPassword);
  
  //E-posta göndericisinin ismi ve e-mail adresi bilgisini ayarlıyoruz.
  smtpData.setSender("ESP32-CAM", emailSenderAccount);
  
  //E-posta önceliğini Normal olarak ayarlıyoruz. Öncelikli yapmak için High yapılabilir.
  smtpData.setPriority("Normal");

  //E-postanın konusunu belirliyoruz.
  smtpData.setSubject("Motion Detected - ESP32-CAM");
    
  //E-posta metninin yapısını text ya da html olarak düzenliyoruz.
  smtpData.setMessage("<div style=\"color:#003366;font-size:20px;\">Image captured and attached.</div>", true);

  //E-postanın gönderileceği alıcıları tanımlıyoruz. Birden fazla alıcı tanımlanabilir.
  smtpData.addRecipient(emailRecipient);
  //smtpData.addRecipient(emailRecipient2);
  
  //E-postaya SD karttan fotoğraf ekliyoruz.
  smtpData.addAttachFile(path);
  
  //Ekli dosyayı(fotoğrafı) okuyabilmek için hafıza tipini SD olarak ayarlıyoruz.
  smtpData.setFileStorageType(MailClientStorageType::SD);
  
  smtpData.setSendCallback(sendCallback);
  
  //E-posta gönderimini başlatıyoruz. 
  if (!MailClient.sendMail(smtpData))
    Serial.println("Error sending Email, " + MailClient.smtpErrorReason());

  //E-posta gönderimi tamamlandıktan sonra bir sonraki gönderim için nesnedeki tüm verileri temizliyoruz.
  smtpData.empty();

  pinMode(4, OUTPUT);              //LED flash için GPIO pini tanımlıyoruz.
  digitalWrite(4, LOW);            //Led flashı kapatıyoruz
  rtc_gpio_hold_en(GPIO_NUM_4);    //Enerji tasarrufu için LED flash'ı uyku modunda kapatıyoruz.
  Serial.println("Entering deep sleep mode");
  Serial.flush(); 
  esp_sleep_enable_ext0_wakeup(GPIO_NUM_13, 0);   //PIN 13 LOW olduğunda aktif moda geçiyoruz.
  delay(10000);                                   //PIR sensörün sağlıklı okuma yapabilmesi için 10 sn zaman tanıyoruz.
  esp_deep_sleep_start();
Serial.begin(9600);
Blynk.begin(auth, ssid, pass);
}

void loop() 
{
Blynk.run();

}

//E-posta gönderim durumunu izliyoruz.
void sendCallback(SendStatus msg)
{
  //Anlık durum bilgisini seri port ekranında görüntülüyoruz.
  Serial.println(msg.info());

  //E-posta başarılı bir şekilde gönderildiyse seri port ekranına bilgi yazıyoruz.
  if (msg.success())
  {
    Serial.println("E-posta gönderimi başarılı. Şimdi onlar düşünsün :)");
  }
}

Yeni sekme oluşturup adını camera_pins.h yap ve şu koddkarı oraya yapıştır;

#if defined(CAMERA_MODEL_WROVER_KIT)
#define PWDN_GPIO_NUM    -1
#define RESET_GPIO_NUM   -1
#define XCLK_GPIO_NUM    21
#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      19
#define Y4_GPIO_NUM      18
#define Y3_GPIO_NUM       5
#define Y2_GPIO_NUM       4
#define VSYNC_GPIO_NUM   25
#define HREF_GPIO_NUM    23
#define PCLK_GPIO_NUM    22

#elif defined(CAMERA_MODEL_ESP_EYE)
#define PWDN_GPIO_NUM    -1
#define RESET_GPIO_NUM   -1
#define XCLK_GPIO_NUM    4
#define SIOD_GPIO_NUM    18
#define SIOC_GPIO_NUM    23

#define Y9_GPIO_NUM      36
#define Y8_GPIO_NUM      37
#define Y7_GPIO_NUM      38
#define Y6_GPIO_NUM      39
#define Y5_GPIO_NUM      35
#define Y4_GPIO_NUM      14
#define Y3_GPIO_NUM      13
#define Y2_GPIO_NUM      34
#define VSYNC_GPIO_NUM   5
#define HREF_GPIO_NUM    27
#define PCLK_GPIO_NUM    25

#elif defined(CAMERA_MODEL_M5STACK_PSRAM)
#define PWDN_GPIO_NUM     -1
#define RESET_GPIO_NUM    15
#define XCLK_GPIO_NUM     27
#define SIOD_GPIO_NUM     25
#define SIOC_GPIO_NUM     23

#define Y9_GPIO_NUM       19
#define Y8_GPIO_NUM       36
#define Y7_GPIO_NUM       18
#define Y6_GPIO_NUM       39
#define Y5_GPIO_NUM        5
#define Y4_GPIO_NUM       34
#define Y3_GPIO_NUM       35
#define Y2_GPIO_NUM       32
#define VSYNC_GPIO_NUM    22
#define HREF_GPIO_NUM     26
#define PCLK_GPIO_NUM     21

#elif defined(CAMERA_MODEL_M5STACK_WIDE)
#define PWDN_GPIO_NUM     -1
#define RESET_GPIO_NUM    15
#define XCLK_GPIO_NUM     27
#define SIOD_GPIO_NUM     22
#define SIOC_GPIO_NUM     23

#define Y9_GPIO_NUM       19
#define Y8_GPIO_NUM       36
#define Y7_GPIO_NUM       18
#define Y6_GPIO_NUM       39
#define Y5_GPIO_NUM        5
#define Y4_GPIO_NUM       34
#define Y3_GPIO_NUM       35
#define Y2_GPIO_NUM       32
#define VSYNC_GPIO_NUM    25
#define HREF_GPIO_NUM     26
#define PCLK_GPIO_NUM     21

#elif defined(CAMERA_MODEL_AI_THINKER)
#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

#else
#error "Camera model not selected"
#endif

Bağlantıları yaptıktan sonra koddaki gerekli değişikleri yapın(kodda yorum satırı olarak yazdım). Fotoğraf göndermeniz için yeni bir e-posta hesabı açmanızı öneririm çünkü daha az güvenli olan bir kutucuğunu işaretlemeniz gerekiyor. İsterseniz bunu göze alarak kendi hesabınızıda bağlayabilirsiniz zaten. Şimdilik bu kadar bunları yaptıktan sonra BLYNK üzerinden GPIO15 pinine bir buton ayarlamanız gerekiyor o kısmı yapamazsanız onuda görsel örnekli anlatırım. Kolay gelsin. :slightly_smiling_face:

1 Beğeni

Parça listeside bu şekilde:

https://www.robotistan.com/sandisk-16-gb-microsd-80-mbs-class10-hafiza-karti

1 Beğeni