Send Photo via Email With ESP32-CAM
در آموزش قبلی از سری آموزشهای مربوط به برد توسعه ESP32-CAM نحوه راه اندازی و استریم کردن تصاویر را به شما آموزش دادیم، در این آموزش تصاویر را از دوربین ESP Cam دریافت کرده با استفاده از این برد تصاویر را ثبت و به ایمیل مقصد ارسال کنیم، برای اطلاع از نحوه داه اندازی برد به این آموزش مراجعه کنید. برای آموزش های بیشتر به CiferTech مراجعه کنید، همچنین برای حمایت از من حتما پیج من در اینستاگرام را دنبال کنید. ^-^
تراشه ESP32
ESP32 نسل پیشرفته ESP8266 است. یکی از تفاوتهای آن بلوتوث داخلیاش میباشد. همچنین دارای هسته وایفای ۲,۴ گیگا هرتزی و بلوتوث داخلی تولید شده با تکنولوژی ۴۰ نانومتری شرکت TSMC میباشد. این ماژول دارای بهترین پرفورمنس در مصرف انرژی میباشد یعنی با کمترین مصرف انرژی بهترین نتیجه را برای ما به همراه دارد. اگر بخواهیم دقیقتر به این برد نگاه کنیم باید بگوییم که این یک chip است که پلتفرم NodeMCU در اون پیاده سازی شده که به این نوع چیپ ها System on a chip microcontrollers هم گفته میشود.
از دیگر امکانات ماژول ESP32-cam میتوان به دوربین OV2640 با قابلیت ثبت تصویر با فرمت JPEG, BMP, grayscale اشاره کرد. همچنین با LED flash مونتاژ شده بر روی این ماژول قادر به تصویر برداری در مکانهای تاریک نیز خواهید بود. یکی از ویژگیهای کاربردی این ماژول ورودی micro SD با قابلیت ارتقا تا ۴GB است که به کاربر اجازه ذخیره تصاویر را هم میدهد.
SMTP Server
STMP یا “Simple Mail Transfer Protocol” یک استاندارد برای ارسال اطلاعات به ایمیل می باشد پس در نتیجه برای ارسال اطلاعات از ESP32 باید از این سرویس استفاده کنیم، که در این آموزش برد ESP32-CAM مبدا و ایمیل ما مقصد می باشد و همچنین محتوای ارسالی نیز تصاویر ثبت شده می باشند. برای ارسال این اطلاعات نیاز به پیش نیاز هایی داریم در ابتدا به کتابخانه ESP32 MailClient library می پردازیم.
کتابخانه ESP32 MailClient library
با استفاده از این کتابخانه کاربر قادر خواهد بود فایل هایی برای منمونه با پسوند .txt با .jpg را برای سرویس ایمیل ارسال کند، که در این آموزش فایل مد نظر ما تصاویر ثبت شده ESP32-cam می باشد که فرمت آن ها نیز .jpg می باشد. خب حالا نوبت نصب این کتاخانه در بستر آردوینو IDE می باشد که چند مرحله بسیار ساده دارد؛ در اولین مرحله مسیر Sketch/Include library/Manage libraries را دنبال کنید.
در پنجره باز شده با وارد کردن نام کنابخانه مربوط که در اینجا “ESP32 MailClient” می باشد، اقدام دانلود و نصب کتابخانه بکنید.
در ادامه مانند تصویر زیر نرم افزار اقدام به دانلود فایل های مربوط میکند.
ایمیل ارسال کننده
خب در اینجا ما نیاز به یک ایمیل داریم داریم تا اطلاعات مورد نیاز ما از مقصد این ایمیل به inbox ایمیل اصلی ما ارسال شود که پیشنهاد میکنم از ایمیل های اصلی خود برای این منظور استفاده نکنید و اقدام به ساخت یک ایمیل جدید کنید به این دلیل که باید دسترسی هایی خاصی به این ایمیل داده شود. بعد از ساخت ایمیل جدید به این لینک مراجعه کنید و اقدام فعال کردن دسترسی مورد نیاز بکنید.
تنظیمات سرویس Gmail برای STMP:
- SMTP Server: smtp.gmail.com
- SMTP username: آدرس کامل جیمیل
- SMTP password: پسوورد جیمیل
- SMTP port (TLS): 587
- SMTP port (SSL): 465
- SMTP TLS/SSL required: yes
کد مرجع ESP32 ارسال ایمیل
با ویزایش کردن موارد مورد نیاز که در کد زیر ذکر شده اقدام به آپلود کردن کد در برد ESP32-cam بکنید. در صورتی که در فرآینده آپلود با مشکل مواجه شدید به آموزش مقدماتی ESP32-cam که در ابتدای آموزش نیز به آن اشاره شد مراجعه کنید.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 |
#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()); } |
در کد مواردی که در تصویر زیر به آن ها اشاره شده را با توجه به توضیحات ویرایش کنید.
تنظیمات ایمیل
همانطور که در بخش کد ها اشاره به مواردی که باید مورد ویرایش قرار بگیرند در این قسمت توضیحات تکمیلی برای شما ارائه خواهد شد. در این قسمت ایمیلی که ساختید و دسترسی هایی را برای آن فعال کردید را وارد کنید که در واقع همان ایمیل است که اطلاعات را برای ایمیل اصلی ما ارسال می کند.
1 2 |
<span style="font-size: 14px;">#define emailSenderAccount "آدررس ایمیل ارسال کننده" #define emailSenderPassword "پسوورد ایمیل ارسال کننده"</span> |
در قسمت بعد باید ایمیل اصلی خود که قرار است از طرق آن اطلاعات را دریافت کنید وارد کنید.
1 |
<span style="font-size: 14px;">#define emailRecipient "آدرس ایمیل دریافت کننده"</span> |
در قسمت تنظیمات SMTP از موارد زیر استفاده میکنیم به این دلیل سرویس ایمیلی که از آن استفاده میکنیم GMAIL می باشد.
1 2 |
<span style="font-size: 14px;">#define smtpServer "smtp.gmail.com" #define smtpServerPort 465</span> |
در قسمت emailSubject اسمی که دوست دارید اسمسل ها با آن نام برای شما ارسال شود را وارد کنید، در غیر این صورت هیچ ویرایشی برای روی آن انجام ندهید.
1 2 |
<span style="font-size: 14px;">#define emailSubject "اسم مدنظر شما" </span> |
کتابخانه های استفاده شده!
در این آموزش از چهار کتابخانه استفاده شده که به ترتیب؛ ESP32_MailClient.h که برای ارسال ایمیل از آن استفاده می شود، FS.h و SPIFFS.h که برای ذخیره و دسترسی به SPIFFS استفاده میشوند و در نهایت WiFi.h که برای برقراری اتصال ESP با شبکه محلی استفاده می شود.
1 2 3 4 5 6 7 |
<span style="font-size: 14px;">#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></span> |
قطعات مورد نیاز
ماژول ESP32-CAM