در آموزش قبلی از سری آموزشهای مربوط به برد توسعه ESP32-CAM نحوه راه اندازی و استریم کردن تصاویر را به شما آموزش دادیم، در این آموزش تصاویر را از دوربین ESP Cam دریافت کرده با استفاده از این برد تصاویر را ثبت و به ایمیل مقصد ارسال کنیم، برای اطلاع از نحوه داه اندازی برد به این آموزش مراجعه کنید.
تراشه ESP32
ESP32 نسل پیشرفته ESP8266 است. یکی از تفاوتهای آن بلوتوث داخلیاش میباشد. همچنین دارای هسته وایفای ۲,۴ گیگا هرتزی و بلوتوث داخلی تولید شده با تکنولوژی ۴۰ نانومتری شرکت TSMC میباشد. این ماژول دارای بهترین پرفورمنس در مصرف انرژی میباشد یعنی با کمترین مصرف انرژی بهترین نتیجه را برای ما به همراه دارد. اگر بخواهیم دقیقتر به این برد نگاه کنیم باید بگوییم که این یک chip است که پلتفرم NodeMCU در اون پیاده سازی شده که به این نوع چیپ ها System on a chip microcontrollers هم گفته میشود.
از دیگر امکانات ماژول 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 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): ۵۸۷
- 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()); }
در کد مواردی که در تصویر زیر به آن ها اشاره شده را با توجه به توضیحات ویرایش کنید.
تنظیمات ایمیل
همانطور که در بخش کد ها اشاره به مواردی که باید مورد ویرایش قرار بگیرند در این قسمت توضیحات تکمیلی برای شما ارائه خواهد شد. در این قسمت ایمیلی که ساختید و دسترسی هایی را برای آن فعال کردید را وارد کنید که در واقع همان ایمیل است که اطلاعات را برای ایمیل اصلی ما ارسال می کند.
#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>
قطعات مورد نیاز
چنانچه در مراحل راه اندازی و انجام این پروژه با مشکل مواجه شدید، بدون هیچ نگرانی در انتهای همین پست، به صورت ثبت نظر سوالتان را مطرح کنید. من در سریعترین زمان ممکن پاسخ رفع مشکل شما را خواهم داد. همچنین اگر ایرادی در کدها و یا مراحل اجرایی وجود دارند میتوانید از همین طریق اطلاع رسانی کنید.
در پایان نظرات و پیشنهادات خود را با ما درمیان بگذارید و با اشتراک گذاری این آموزش در شبکه های اجتماعی , از وبسایت دیجی اسپارک حمایت کنید.
سلام مهندس .
من اقدام به ساخت این پروژه کردم .
اما چند سوال دارم .
خوب شما گفتید که ماژول عکس را میگیرد و به ایمیل من ارسال میکند. اما باید دکمه ریست ماژول را فشار دهیم تا عکس گرفته شود و به ایمیل من ارسال شود. یا اینکه خود ماژول اتوماتیک هر چند ثانیه یک با عکس میگیرد و به ایمیل من ارسال میکند.
با سلام، در آموزش توضیحات کامل داده شده؛ با هر بار ریست کردن یک تصویر می شود.
سلام چه جوری میشه براش مشخص کرد اگه فلان کلید رو زدم عکس بگیره
یه کلید به جز ریست ؟
تنها راه برا این کار اینه بایه فرمان ولتاژ پایه ریست رو صفر کنیم ؟؟
با سلام، کد به شکلی تعریف شده که هر بار که ماژول شروع به کار می کند، مراحل عکسبرداری را انجام می دهد، که ما برای کنترل این پروسه از کلید ریست استفاده می کنیم.
برای ساخت پروژه همین یه ماژول کافیه؟چیزه دیگه ای یعنی نمیخوادتو یه فیلم من دیدیم اردینو uno استفاده کرده بود!!!!!
فقط یک usb to ttl برای پروگرام کردن برد لازم دارید. در آموزش قبل توضیحات لازم داده شده.
سلام مهندس.
گفته بودین اموزش ساخت دوربین عکاسی با اردینو را میزارید.
هنوز این اموزش را منتشر نکرده اید؟
با سلام، خیر این آموزش هنوز منتشر نشده.
سلام. توی این پروژه چه اتفاقی بیافته تراشه عکس میگیره میفرسته؟
دکمه داره دوربین؟
سلام، با هر بار فشردن دکمه ریست، یک عکس ارسال خواهد شد.
ببخشید من هرچی میزنم کتابخانه mail client رو پیدا نمیکنه برا نصب چیکار کنم؟
کلمه که در آموزش ذکر شده را برای پیدا کردن کتابخانه جستجو کنید، همچنین نرمافزار آردوینو را به آخرین نسخه بروزرسانی کنید.
دلیل ارور camera_canfing_t was not declared in this scopeچیه؟
معمولا نباید از این قسمت ارور بگیره! کد ها رو تغییر ندید و کتابخانه هایی که استفاده شده را بروزرسانی کنید.
با سلام میشه این ماژول رو دائم کار کرد(همیشه عکس بفرسته)؟یا هر چند ثانیه دکمه رو فشار بدم؟ آیا امکانش هست اگه نیست لطفاً راهنمایی کنید.
بله با تغییر در کد برنامه این امکان وجود دارد.
ببخشید دوباره مزاحم شدم تا چند متر می تونه عکس بفرسته؟
مقصد ارسال تصاویر ایمیل شماست پس فاصله در این سناریو مفهومی نداره.
با سلام برای این ماژول اینترنت هم میخواد؟یعنی برای فرستادن عکس اینترنت لازمه؟
سلام، بله ssid و پسوورد در کد، نیازمند مشخص شدن است.
سلام مهندس
میشه هر دو ایمیل ارسال کننده و دریافت کننده را روی یه موبایل درست کنیم ؟؟
و اینکه فروش ماژول پروگرام برد esp32cam را شروع نکردید ؟؟
با سلام
بله مشکلی نیست در این مورد.
بزودی فروش محصول شروع میشه، ممنونیم از توجه شما.
سلام.این برنامه خیلی عالی بود ممنون. اما کیفیتش بسیااااااار پایینتر از مثال خود ای اس پی هستش و نمیدونم چرا میشه راهنمایی کنید؟
سلام، خیلی ممنون.
دوربین این ماژول در کل از کیفیت مطلوبی برخوردار نیست، اما تمیز کردن لنز و تنظیم دستی فوکوس میتونه به ثبت تصویر مناسب تر کمک کنه.
سلام مهندس
شما گفتید که برای ارسال تصویر به ایمیل باید دکمه ریست ماژول را فشرد
اما من یه ایده به ذهنم رسید
که خروجی رله یه کیت تایمر دو زمانه را به پایه ریست و منفی برد esp32 cam وصل کنم و با زمان دادن به تایمر دو زمانه هر چند ثانیه یک بار یا هر دقیقه یک بار توسط خروجی رله پایه های ریست و منفی برد esp32 cam بهم اتصال پیدا کنن و یه عکس برام ارسال بشه
بنظرتون این ایده قابل اجرا است ؟؟
با سلام، بسیار عالی، البته از نظر تئوری قابل اجراست و در عمل هم فکر نمیکنم موردی داشته باشه، البته این مورد را بطوری نرمافزاری در کد هم میتوان اجرا کرد.
سلام مهندس
میشه کد زیر را داخل کد های این پروژه وارد کرد و و با عبور شخصی از جلوی سنسورpir عکس به ایمیل ارسال بشه ؟؟
esp_sleep_enable_ext0_wakeup(GPIO_NUM_13,0);
اگه میشه این کار را انجام داد میشه بگید باید کجای کد این پروژه این کد را باید وارد کنم
سلام، باید حالت خواب را راهاندازی و سپس با کدی که فرستادید برای لحظاتی این حالت را غیر فعال کنید. میتوانید از آموزش زیر برای این مورد استفاده کنید.
https://digispark.ir/create-spy-cam-with-esp32-cam-and-pir-motion-sensor/
سلام مهندس
میشه پروژه ساخت ایفون تصویری هوشمند با برد esp32 camرا بزارید
که وقتی کسی زنگ ایفون را فشرد ماژول یک عکس برای من از طریق لینک پیامک بفرسته یا از طریق ربات بله
سلام، خیلی ایده عالیه، حتما در آموزش های آینده اجراش میکنیم.
سلام مهندس میشه
این پروژه را به شکل زیر انجام داد
دو تا سروو موتور به پایه های برد esp32 cam وصل کنیم یکی از سروو ها را به کنار برد و سروو موتور دیگری را به زیر برد وصل میکنیم
و داخل ایمیل مثلاً کلمه A 180 درجه را برای برد بفرستیم و برد esp32 cam به ۱۸۰ درجه بچرخه و برامون عکس را بفرسته کلمه A یعنی اینکه چپ و کلمه B مثلاً راست و کلمه C مثلاً بالا و کلمه D پایین که کلمه A و B برای سروو موتور زیر برد میشه که برد را به چپ و راست بچرخونه و کلمه C و D برای سروو موتور کنار برد که برد را به بالا و پایین بچرخونه و عدد ۱۸۰ و یا عدم های دیگر هم برای اینکه برد به چند درجه بچرخه
با سلام، من این مورد را تست نکردم، اما خواندن مقادیر در ایمیل و سپس فرمان گرفتن ESP امکان پذیر نیست، اما به روش های دیگری قابل اجرا شدن است.
سلام مهندس تشکر از آموزش شما
میخواستم بپرسم که آیا ماژول دوربین رزبری پای که درگاه اون CSI است به ESP32CAM متصل میشه؟
با سلام، خیر. اما برد ESP32-CAM دارای مدل های متنوعی از دوربین است.
سلام مرسی بابت آموزش کامل و خوبتون
فقط یه سوال الان همه چی به درستی داره کار میکنه اما میخوام موقعی که عکس میخواد بگیره فلشم بزنه
چه کدی رو باید اضافه کنم؟
با سلام، ممنونم.
پین مربوط به LED فلش در برد GPIO 4 هست، باید به این پین فرمان بدید در زمان تصویربرداری.
login password is not valid
چرا این ارور رو میده با این که رمز من درسته
پسووردتون درست نیست، بررسی کنید.
سلام وقتتون بخیر
ببخشید واسه فعال کردن گزینه دسترسی به برنامه با امنیت کمتر مینویسه این گزینه دیگر وجود ندارد
چه باید کنم؟؟؟
ممنون میشم راهنمایی کنید
با سلام
در برخی اکانت های ایمیلی متفاوت است. این روالی که در آموزش اعلام شده است برای نسخههای قدیمی ایمیلی بوده است.
سلام اگه گزینه امنیت کمتر رو خاموش نکنیم پروژه دیگه کار نمیکنه یعنی دیگه عکس ارسال نمیکنه
و سوال دوم میشه با ایمیل یاهو این کار رو کرد ؟
اگه میشه آموزشش رو بزارید ممنون میشم
با سلام
بله دقیقا بایستی این موضوع را رعایت کنید. در غیر این صورت بایستی از سرورهای SMTP استفاده کنید. در خصوص ایمیل یاهو هم بنده تست نکردهام، کافیست راجع به آن جستجو کنید.
با سلام و عرض خسته نباشید
این پیام در آخر می آید :login password is not valid چندین با هم رمز ایمیل را تغیر دادم ولی درست نشد. لطفا راهنمایی کنید.
با سلام
بایستی گزینه مربوط به پذیرش سیستم های سوم شخص را فعال کنید.