آردوینو آموزش آردوینو اینترنت اشیا IOT برد Esp32 برد ESP8266 برد Nodemcu خانه هوشمند ماژول دوربین

ارسال تصویر به ایمیل با ESP32-CAM

ارسال تصاویر به ایمیل ESP32-cam
نوشته شده توسط CiferTech

در آموزش قبلی از سری آموزش‌های مربوط به برد توسعه ESP32-CAM نحوه راه اندازی و استریم کردن تصاویر را به شما آموزش دادیم، در این آموزش تصاویر را از دوربین ESP Cam دریافت کرده با استفاده از این برد تصاویر را ثبت و به ایمیل مقصد ارسال کنیم، برای اطلاع از نحوه داه اندازی برد به این آموزش مراجعه کنید.

 


تراشه ESP32


ESP32 نسل پیشرفته ESP8266 است. یکی از تفاوت‌های آن بلوتوث داخلی‌اش می‌باشد. همچنین دارای هسته وایفای ۲,۴ گیگا هرتزی و بلوتوث داخلی تولید شده با تکنولوژی ۴۰ نانومتری شرکت TSMC می‌باشد. این ماژول دارای بهترین پرفورمنس در مصرف انرژی می‌باشد یعنی با کمترین مصرف انرژی بهترین نتیجه را برای ما به همراه دارد. اگر بخواهیم دقیق‌تر به این برد نگاه کنیم باید بگوییم که این یک chip است که پلتفرم NodeMCU در اون پیاده سازی شده که به این نوع چیپ ها System on a chip microcontrollers هم گفته می‌شود.

ارسال تصاویر به ایمیل ESP32-cam

از دیگر امکانات ماژول ESP32-cam می‌توان به دوربین OV2640 با قابلیت ثبت تصویر با فرمت JPEG, BMP, grayscale اشاره کرد. همچنین با LED flash مونتاژ شده بر روی این ماژول قادر به تصویر برداری در مکان‌های تاریک نیز خواهید بود. یکی از ویژگی‌های کاربردی این ماژول ورودی micro SD با قابلیت ارتقا تا ۴GB است که به کاربر اجازه ذخیره تصاویر را هم می‌دهد.

 


SMTP Server


SMTP یا “Simple Mail Transfer Protocol” یک استاندارد برای ارسال اطلاعات به ایمیل است. پس در نتیجه برای ارسال اطلاعات از ESP32 باید از این سرویس استفاده کنیم. در این آموزش برد ESP32-CAM مبدا و ایمیل ما مقصد است. همچنین محتوای ارسالی هم تصاویر ثبت شده توسط دوربین ESP32-Cam است. برای ارسال این اطلاعات نیاز به پیش نیازهایی داریم در ابتدا به کتابخانه ESP32 MailClient library می پردازیم.

ارسال تصاویر به ایمیل ESP32-cam


کتابخانه ESP32 MailClient library


با استفاده از این کتابخانه کاربر قادر خواهد بود فایل هایی برای نمونه با پسوند .txt با .jpg را برای سرویس ایمیل ارسال کند، که در این آموزش فایل مد نظر ما تصاویر ثبت شده ESP32-cam می باشد که فرمت آن ها نیز .jpg می باشد. خب حالا نوبت نصب این کتاخانه در بستر آردوینو IDE می باشد که چند مرحله بسیار ساده دارد؛ در اولین مرحله مسیر Sketch/Include library/Manage libraries را دنبال کنید.

ارسال تصاویر به ایمیل ESP32-cam

در پنجره باز شده با وارد کردن نام کنابخانه مربوط که در اینجا “ESP32 MailClient” می باشد، اقدام دانلود و نصب کتابخانه بکنید.

ارسال تصاویر به ایمیل ESP32-cam

در ادامه مانند تصویر زیر نرم افزار اقدام به دانلود فایل های مربوط میکند.

ارسال تصاویر به ایمیل ESP32-cam

 


ایمیل ارسال کننده


خب در اینجا ما نیاز به یک ایمیل داریم داریم تا اطلاعات مورد نیاز ما از مقصد این ایمیل به inbox ایمیل اصلی ما ارسال شود که پیشنهاد میکنم از ایمیل های اصلی خود برای این منظور استفاده نکنید و اقدام به ساخت یک ایمیل جدید کنید به این دلیل که باید دسترسی هایی خاصی به این ایمیل داده شود. بعد از ساخت ایمیل جدید به این لینک مراجعه کنید و اقدام فعال کردن دسترسی مورد نیاز بکنید.

ارسال تصاویر به ایمیل ESP32-cam

تنظیمات سرویس Gmail برای STMP:

  • SMTP Server: smtp.gmail.com
  • SMTP username: آدرس کامل جیمیل
  • SMTP password: پسوورد جیمیل
  • SMTP port (TLS): ۵۸۷
  • SMTP port (SSL): ۴۶۵
  • SMTP TLS/SSL required: yes

 


کد مرجع ESP32 ارسال ایمیل


 با ویزایش کردن موارد مورد نیاز که در کد زیر ذکر شده اقدام به آپلود کردن کد در برد ESP32-cam بکنید. در صورتی که در فرآینده آپلود با مشکل مواجه شدید به آموزش مقدماتی ESP32-cam که در ابتدای آموزش نیز به آن اشاره شد مراجعه کنید.

#include "esp_camera.h"
#include "SPI.h"
#include "driver/rtc_io.h"
#include "ESP32_MailClient.h"
#include <FS.h>
#include <SPIFFS.h>
#include <WiFi.h>

// REPLACE WITH YOUR NETWORK CREDENTIALS
const char* ssid = "اسم نقطه دسترسی وای فای";
const char* password = "پسوورد نقطه دسترسی";

// To send Email using Gmail use port 465 (SSL) and SMTP Server smtp.gmail.com
// YOU MUST ENABLE less secure app option https://myaccount.google.com/lesssecureapps?pli=1
#define emailSenderAccount    "آدررس ایمیل ارسال کننده"
#define emailSenderPassword   "پسوورد ایمیل ارسال کننده"
#define smtpServer            "smtp.gmail.com"
#define smtpServerPort        465
#define emailSubject          "ESP32-CAM Photo Captured"
#define emailRecipient        "آدرس ایمیل دریافت کننده"

#define CAMERA_MODEL_AI_THINKER

#if 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

// The Email Sending data object contains config and data to send
SMTPData smtpData;

// Photo File Name to save in SPIFFS
#define FILE_PHOTO "/photo.jpg"

void setup() {
  WRITE_PERI_REG(RTC_CNTL_BROWN_OUT_REG, 0); //disable brownout detector
  
  Serial.begin(115200);
  Serial.println();

  // Connect to Wi-Fi
  WiFi.begin(ssid, password);
  Serial.print("Connecting to WiFi...");
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println();
  
  if (!SPIFFS.begin(true)) {
    Serial.println("An Error has occurred while mounting SPIFFS");
    ESP.restart();
  }
  else {
    delay(500);
    Serial.println("SPIFFS mounted successfully");
  }
  
  // Print ESP32 Local IP Address
  Serial.print("IP Address: http://");
  Serial.println(WiFi.localIP());
   
  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;
  }

  // Initialize camera
  esp_err_t err = esp_camera_init(&config);
  if (err != ESP_OK) {
    Serial.printf("Camera init failed with error 0x%x", err);
    return;
  }
  
  capturePhotoSaveSpiffs();
  sendPhoto();
}

void loop() {

}

// Check if photo capture was successful
bool checkPhoto( fs::FS &fs ) {
  File f_pic = fs.open( FILE_PHOTO );
  unsigned int pic_sz = f_pic.size();
  return ( pic_sz > 100 );
}

// Capture Photo and Save it to SPIFFS
void capturePhotoSaveSpiffs( void ) {
  camera_fb_t * fb = NULL; // pointer
  bool ok = 0; // Boolean indicating if the picture has been taken correctly

  do {
    // Take a photo with the camera
    Serial.println("Taking a photo...");

    fb = esp_camera_fb_get();
    if (!fb) {
      Serial.println("Camera capture failed");
      return;
    }

    // Photo file name
    Serial.printf("Picture file name: %s\n", FILE_PHOTO);
    File file = SPIFFS.open(FILE_PHOTO, FILE_WRITE);

    // Insert the data in the photo file
    if (!file) {
      Serial.println("Failed to open file in writing mode");
    }
    else {
      file.write(fb->buf, fb->len); // payload (image), payload length
      Serial.print("The picture has been saved in ");
      Serial.print(FILE_PHOTO);
      Serial.print(" - Size: ");
      Serial.print(file.size());
      Serial.println(" bytes");
    }
    // Close the file
    file.close();
    esp_camera_fb_return(fb);

    // check if file has been correctly saved in SPIFFS
    ok = checkPhoto(SPIFFS);
  } while ( !ok );
}

void sendPhoto( void ) {
  // Preparing email
  Serial.println("Sending email...");
  // Set the SMTP Server Email host, port, account and password
  smtpData.setLogin(smtpServer, smtpServerPort, emailSenderAccount, emailSenderPassword);
  
  // Set the sender name and Email
  smtpData.setSender("ESP32-CAM", emailSenderAccount);
  
  // Set Email priority or importance High, Normal, Low or 1 to 5 (1 is highest)
  smtpData.setPriority("High");

  // Set the subject
  smtpData.setSubject(emailSubject);
    
  // Set the email message in HTML format
  smtpData.setMessage("<h2>Photo captured with ESP32-CAM and attached in this email.</h2>", true);
  // Set the email message in text format
  //smtpData.setMessage("Photo captured with ESP32-CAM and attached in this email.", false);

  // Add recipients, can add more than one recipient
  smtpData.addRecipient(emailRecipient);
  //smtpData.addRecipient(emailRecipient2);

  // Add attach files from SPIFFS
  smtpData.addAttachFile(FILE_PHOTO, "image/jpg");
  // Set the storage type to attach files in your email (SPIFFS)
  smtpData.setFileStorageType(MailClientStorageType::SPIFFS);

  smtpData.setSendCallback(sendCallback);
  
  // Start sending Email, can be set callback function to track the status
  if (!MailClient.sendMail(smtpData))
    Serial.println("Error sending Email, " + MailClient.smtpErrorReason());

  // Clear all data from Email object to free memory
  smtpData.empty();
}

// Callback function to get the Email sending status
void sendCallback(SendStatus msg) {
  //Print the current status
  Serial.println(msg.info());
}

 

در کد مواردی که در تصویر زیر به آن ها اشاره شده را با توجه به توضیحات ویرایش کنید.

ارسال تصاویر به ایمیل ESP32-cam

 


تنظیمات ایمیل


همانطور که در بخش کد ها اشاره به مواردی که باید مورد ویرایش قرار بگیرند در این قسمت توضیحات تکمیلی برای شما ارائه خواهد شد. در این قسمت ایمیلی که ساختید و دسترسی هایی را برای آن فعال کردید را وارد کنید که در واقع همان ایمیل است که اطلاعات را برای ایمیل اصلی ما ارسال می کند.

#define emailSenderAccount    "آدررس ایمیل ارسال کننده"
#define emailSenderPassword   "پسوورد ایمیل ارسال کننده"

 

در قسمت بعد باید ایمیل اصلی خود که قرار است از طرق آن اطلاعات را دریافت کنید وارد کنید.

#define emailRecipient        "آدرس ایمیل دریافت کننده"

 

در قسمت تنظیمات SMTP از موارد زیر استفاده میکنیم به این دلیل سرویس ایمیلی که از آن استفاده میکنیم GMAIL می باشد.

#define smtpServer "smtp.gmail.com"
#define smtpServerPort 465

 

در قسمت emailSubject اسمی که دوست دارید اسمسل ها با آن نام برای شما ارسال شود را وارد کنید، در غیر این صورت هیچ ویرایشی برای روی آن انجام ندهید.

#define emailSubject "اسم مدنظر شما"

 


کتابخانه های استفاده شده!


در این آموزش از چهار کتابخانه استفاده شده که به ترتیب؛ ESP32_MailClient.h که برای ارسال ایمیل از آن استفاده می شود، FS.h و SPIFFS.h که برای ذخیره و دسترسی به SPIFFS استفاده میشوند و در نهایت WiFi.h که برای برقراری اتصال ESP با شبکه محلی استفاده می شود.

#include "esp_camera.h"
#include "SPI.h"
#include "driver/rtc_io.h"
#include "ESP32_MailClient.h"
#include <FS.h>
#include <SPIFFS.h>
#include <WiFi.h>

 


قطعات مورد نیاز


ماژول ESP32-CAM

 

چنانچه در مراحل راه اندازی و انجام این پروژه با مشکل مواجه شدید، بدون هیچ نگرانی در انتهای همین پست، به صورت ثبت نظر سوالتان را مطرح کنید. من در سریع‌ترین زمان ممکن پاسخ رفع مشکل شما را خواهم داد. همچنین اگر ایرادی در کدها و یا مراحل اجرایی وجود دارند می‌توانید از همین طریق اطلاع رسانی کنید.

 

در پایان نظرات  و پیشنهادات خود را با ما درمیان بگذارید و با اشتراک گذاری این آموزش در شبکه های اجتماعی , از وبسایت دیجی اسپارک حمایت کنید.

 

درباره نویسنده

CiferTech

فقط 10 نوع آدم در این دنیا وجود داره، اونی که باینری میفهمه و اونی که باینری نمیفهمه! ^-^

~ اینستاگرام: CiferTech

تبادل نظر و رفع عیب با ثبت دیدگاه

۳۶ دیدگاه

  • سلام مهندس .
    من اقدام به ساخت این پروژه کردم .
    اما چند سوال دارم .
    خوب شما گفتید که ماژول عکس را میگیرد و به ایمیل من ارسال میکند. اما باید دکمه ریست ماژول را فشار دهیم تا عکس گرفته شود و به ایمیل من ارسال شود. یا اینکه خود ماژول اتوماتیک هر چند ثانیه یک با عکس میگیرد و به ایمیل من ارسال میکند.

      • سلام چه جوری میشه براش مشخص کرد اگه فلان کلید رو زدم عکس بگیره
        یه کلید به جز ریست ؟

        تنها راه برا این کار اینه بایه فرمان ولتاژ پایه ریست رو صفر کنیم ؟؟

        • با سلام، کد به شکلی تعریف شده که هر بار که ماژول شروع به کار می کند، مراحل عکسبرداری را انجام می دهد، که ما برای کنترل این پروسه از کلید ریست استفاده می کنیم.

  • برای ساخت پروژه همین یه ماژول کافیه؟چیزه دیگه ای یعنی نمیخوادتو یه فیلم من دیدیم اردینو uno استفاده کرده بود!!!!!

  • سلام مهندس.
    گفته بودین اموزش ساخت دوربین عکاسی با اردینو را میزارید.
    هنوز این اموزش را منتشر نکرده اید؟

    • کلمه که در آموزش ذکر شده را برای پیدا کردن کتابخانه جستجو کنید، همچنین نرم‌افزار آردوینو را به آخرین نسخه بروزرسانی کنید.

  • با سلام میشه این ماژول رو دائم کار کرد(همیشه عکس بفرسته)؟یا هر چند ثانیه دکمه رو فشار بدم؟ آیا امکانش هست اگه نیست لطفاً راهنمایی کنید.

  • سلام.این برنامه خیلی عالی بود ممنون. اما کیفیتش بسیااااااار پایینتر از مثال خود ای اس پی هستش و نمیدونم چرا میشه راهنمایی کنید؟

    • سلام، خیلی ممنون.
      دوربین این ماژول در کل از کیفیت مطلوبی برخوردار نیست، اما تمیز کردن لنز و تنظیم دستی فوکوس میتونه به ثبت تصویر مناسب تر کمک کنه.

  • سلام مهندس
    شما گفتید که برای ارسال تصویر به ایمیل باید دکمه ریست ماژول را فشرد
    اما من یه ایده به ذهنم رسید
    که خروجی رله یه کیت تایمر دو زمانه را به پایه ریست و منفی برد esp32 cam وصل کنم و با زمان دادن به تایمر دو زمانه هر چند ثانیه یک بار یا هر دقیقه یک بار توسط خروجی رله پایه های ریست و منفی برد esp32 cam بهم اتصال پیدا کنن و یه عکس برام ارسال بشه
    بنظرتون این ایده قابل اجرا است ؟؟

    • با سلام، بسیار عالی، البته از نظر تئوری قابل اجراست و در عمل هم فکر نمیکنم موردی داشته باشه، البته این مورد را بطوری نرم‌افزاری در کد هم می‌توان اجرا کرد.

  • سلام مهندس
    میشه کد زیر را داخل کد های این پروژه وارد کرد و و با عبور شخصی از جلوی سنسورpir عکس به ایمیل ارسال بشه ؟؟
    esp_sleep_enable_ext0_wakeup(GPIO_NUM_13,0);
    اگه میشه این کار را انجام داد میشه بگید باید کجای کد این پروژه این کد را باید وارد کنم

  • سلام مهندس
    میشه پروژه ساخت ایفون تصویری هوشمند با برد esp32 camرا بزارید
    که وقتی کسی زنگ ایفون را فشرد ماژول یک عکس برای من از طریق لینک پیامک بفرسته یا از طریق ربات بله

  • سلام مهندس میشه
    این پروژه را به شکل زیر انجام داد
    دو تا سروو موتور به پایه های برد esp32 cam وصل کنیم یکی از سروو ها را به کنار برد و سروو موتور دیگری را به زیر برد وصل میکنیم
    و داخل ایمیل مثلاً کلمه A 180 درجه را برای برد بفرستیم و برد esp32 cam به ۱۸۰ درجه بچرخه و برامون عکس را بفرسته کلمه A یعنی اینکه چپ و کلمه B مثلاً راست و کلمه C مثلاً بالا و کلمه D پایین که کلمه A و B برای سروو موتور زیر برد میشه که برد را به چپ و راست بچرخونه و کلمه C و D برای سروو موتور کنار برد که برد را به بالا و پایین بچرخونه و عدد ۱۸۰ و یا عدم های دیگر هم برای اینکه برد به چند درجه بچرخه

    • با سلام، من این مورد را تست نکردم، اما خواندن مقادیر در ایمیل و سپس فرمان گرفتن ESP امکان پذیر نیست، اما به روش های دیگری قابل اجرا شدن است.

  • سلام مهندس تشکر از آموزش شما
    میخواستم بپرسم که آیا ماژول دوربین رزبری پای که درگاه اون CSI است به ESP32CAM متصل میشه؟

  • سلام مرسی بابت آموزش کامل و خوبتون
    فقط یه سوال الان همه چی به درستی داره کار میکنه اما میخوام موقعی که عکس میخواد بگیره فلشم بزنه
    چه کدی رو باید اضافه کنم؟