ESP32-CAM: Chụp và gửi ảnh qua email bằng máy chủ SMTP

 Hướng dẫn này cho biết cách gửi ảnh đã chụp từ ESP32-CAM đến tài khoản email của bạn bằng Máy chủ SMTP. Chúng tôi sẽ chỉ cho bạn một ví dụ đơn giản chụp ảnh khi ESP32 khởi động và gửi nó dưới dạng tệp đính kèm trong email. Ảnh cuối cùng được chụp tạm thời được lưu trong ESP32 SPIFFS.

ESP32-CAM Chụp và Gửi ảnh qua Email bằng IDE Máy chủ SMTP Arduino

Để dự án này hoạt động, ESP32-CAM cần được kết nối với bộ định tuyến có quyền truy cập internet – cần được kết nối với mạng cục bộ của bạn.

Dự án này tương thích với bất kỳ bo mạch camera ESP32 nào có camera OV2640. Bạn chỉ cần đảm bảo rằng bạn sử dụng chức năng chỉ định pin phù hợp cho bo mạch mà bạn đang sử dụng: Bo mạch máy ảnh ESP32-CAM: Hướng dẫn gán pin và GPIO.

Thư viện eSP32 MailClient

Để gửi email bằng ESP32-CAM, chúng tôi sẽ sử dụng thư viện ESP32 MailClient. Thư viện này cho phép ESP32 gửi và nhận email có hoặc không có tệp đính kèm thông qua máy chủ SMTP và IMAP.

Trong dự án này, chúng tôi sẽ sử dụng SMTP để gửi email có tệp đính kèm. Tệp đính kèm là một bức ảnh được chụp bằng ESP32-CAM.

SMTP có nghĩa là Giao thức truyền thư đơn giản và nó là một tiêu chuẩn internet để truyền email. Để gửi email thông qua mã, bạn cần biết chi tiết máy chủ SMTP của mình. Mỗi nhà cung cấp email có một máy chủ SMTP khác nhau.

Cài đặt Thư viện Thư viện ESP32 MailClient

Trước khi tiếp tục hướng dẫn này, bạn cần cài đặt thư viện ESP32 MailClient. Thư viện này có thể được cài đặt thông qua Trình quản lý Thư viện IDE Arduino.

Trong IDE Arduino của bạn, hãy chuyển đến Phác thảo > Bao gồm Thư viện > Quản lý Thư viện…

Trình quản lý Thư viện sẽ mở ra. Tìm kiếm Ứng dụng thư điện tử ESP32 bởi Mobizt và cài đặt thư viện như hình dưới đây.

Cài đặt thư viện ESP32 Gửi Email Máy chủ SMTP Arduino IDE

Email người gửi (Tài khoản mới)

Chúng tôi khuyên bạn nên tạo một tài khoản email mới để gửi email đến địa chỉ email cá nhân chính của bạn. Không sử dụng email cá nhân chính của bạn để gửi email qua ESP32. Nếu có điều gì đó không ổn trong mã của bạn hoặc nếu bạn đưa ra quá nhiều yêu cầu do nhầm lẫn, bạn có thể bị cấm hoặc bị vô hiệu hóa tạm thời tài khoản của mình.

Chúng tôi sẽ sử dụng tài khoản Gmail.com mới được tạo để gửi email, nhưng bạn có thể sử dụng bất kỳ nhà cung cấp dịch vụ email nào khác. Email người nhận có thể là email cá nhân của bạn mà không có vấn đề gì.

Tạo tài khoản email người gửi

Tạo tài khoản email mới để gửi email bằng ESP32. Nếu bạn muốn sử dụng tài khoản Gmail, hãy truy cập liên kết này để tạo một tài khoản mới.

Gmail Tạo tài khoản mới

Cho phép các ứng dụng kém an toàn hơn

Cho phép các ứng dụng kém an toàn hơn truy cập vào tài khoản Gmail mới này để bạn có thể gửi email. Bạn có thể mở liên kết này để chuyển đến menu đó.

Gmail Cho phép các ứng dụng kém an toàn hơn gửi email bằng ESP32

Cài đặt máy chủ SMTP của Gmail

Nếu bạn đang sử dụng tài khoản Gmail, đây là các thông tin chi tiết về Máy chủ SMTP:

  • Máy chủ SMTP: smtp.gmail.com
  • Tên người dùng SMTP: Địa chỉ Gmail đầy đủ
  • Mật khẩu SMTP: Mật khẩu Gmail của bạn
  • Cổng SMTP (TLS): 587
  • Cổng SMTP (SSL): 465
  • SMTP TLS / SSL yêu cầu: đúng

Cài đặt Máy chủ Outlook SMTP

Đối với tài khoản Outlook, đây là các cài đặt Máy chủ SMTP:

  • Máy chủ SMTP: smtp.office365.com
  • Tên người dùng SMTP: Hoàn thành địa chỉ email Outlook
  • Mật khẩu SMTP: Mật khẩu Outlook của bạn
  • Cổng SMTP: 587
  • SMTP TLS / SSL Yêu cầu: đúng

Cài đặt Máy chủ SMTP Trực tiếp hoặc Hotmail

Đối với tài khoản Live hoặc Hotmail, đây là các cài đặt Máy chủ SMTP:

  • Máy chủ SMTP: smtp.live.com
  • Tên người dùng SMTP: Hoàn thành địa chỉ email Trực tiếp / Hotmail
  • Mật khẩu SMTP: Mật khẩu Windows Live Hotmail của bạn
  • Cổng SMTP: 587
  • SMTP TLS / SSL Yêu cầu: đúng

Nếu đang sử dụng nhà cung cấp dịch vụ email khác, bạn cần tìm kiếm cài đặt Máy chủ SMTP của nhà cung cấp dịch vụ đó. Bây giờ, bạn đã có mọi thứ sẵn sàng để bắt đầu gửi email với ESP32-CAM.

Mã – ESP32-CAM Gửi Email

Đoạn mã sau sẽ chụp ảnh khi ESP32-CAM khởi động lần đầu tiên và gửi nó đến tài khoản email của bạn. Trước khi tải mã lên, hãy đảm bảo bạn chèn cài đặt email người gửi cũng như email người nhận.

/*********
  Rui Santos
  Complete instructions at https://RandomNerdTutorials.com/esp32-cam-projects-ebook/
  
  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files.
  The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
*********/

#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 = "REPLACE_WITH_YOUR_SSID";
const char* password = "REPLACE_WITH_YOUR_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    "[email protected]"
#define emailSenderPassword   "SENDER_ACCOUNT_PASSWORD"
#define smtpServer            "smtp.gmail.com"
#define smtpServerPort        465
#define emailSubject          "ESP32-CAM Photo Captured"
#define emailRecipient        "[email protected]"

#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: %sn", 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());
}

Cách hoạt động của mã

Tiếp tục đọc để tìm hiểu cách hoạt động của mã hoặc bỏ qua phần Trình diễn. Đừng quên chèn thông tin đăng nhập mạng và cài đặt email của bạn vào mã. Ngoài ra, nếu bạn đang sử dụng kiểu máy ảnh không phải là ESP32-CAM AI-Thinker, đừng quên thay đổi chỉ định pin.

Nhập thư viện

Nhập các thư viện cần thiết. Các ESP32_MailClient.h được sử dụng để gửi email, FS.h và SPIFFS.h được sử dụng để truy cập và lưu tệp vào SPIFFS và WiFi.h thư viện được sử dụng để khởi tạo Wi-Fi và kết nối ESP32-CAM với mạng cục bộ của bạn.

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

Thông tin đăng nhập mạng

Chèn thông tin đăng nhập mạng của bạn vào các biến sau:

const char* ssid = "REPLACE_WITH_YOUR_SSID";
const char* password = "REPLACE_WITH_YOUR_PASSWORD";

Cài đặt Email

Nhập tài khoản người gửi email vào emailSenderAccount biến và mật khẩu của nó trên emailSenderPassword Biến đổi.

#define emailSenderAccount   "[email protected]"
#define emailSenderPassword  "SENDER_ACCOUNT_PASSWORD"

Chèn email của người nhận. Đây là email sẽ nhận các email được gửi bởi ESP32:

#define emailRecipient "[email protected]"

Chèn cài đặt SMTP của nhà cung cấp dịch vụ email của bạn vào các dòng sau. Chúng tôi đang sử dụng cài đặt cho tài khoản Gmail. Nếu bạn đang sử dụng một nhà cung cấp email khác, hãy thay thế bằng cài đặt SMTP tương ứng.

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

Viết chủ đề email trên emailSubject Biến đổi.

#define emailSubject "ESP32-CAM Photo Captured"

Tạo ra một STMPData đối tượng được gọi là smtpData chứa dữ liệu để gửi qua email và tất cả các cấu hình khác.

SMTPData smtpData;

Ảnh được chụp bằng máy ảnh ESP32 sẽ tạm thời được lưu trong SPIFFS dưới tên photo.jpg.

define FILE_PHOTO "/photo.jpg"

Chân máy ảnh ESP32

Xác định các chân được sử dụng bởi kiểu máy ảnh của bạn. Chúng tôi đang sử dụng ESP32-CAM 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

thành lập()

bên trong thành lập(), kết nối ESP32 với Wi-Fi.

// Connect to Wi-Fi
WiFi.begin(ssid, password);
Serial.print("Connecting to WiFi...");
while (WiFi.status() != WL_CONNECTED) {
  delay(500);
  Serial.print(".");
}
Serial.println();

Khởi tạo SPIFFS (SPI Flash File System) để lưu ảnh cuối cùng được chụp bằng ESP32-CAM.

if (!SPIFFS.begin(true)) {
  Serial.println("An Error has occurred while mounting SPIFFS");
  ESP.restart();
}
else {
  delay(500);
  Serial.println("SPIFFS mounted successfully");
}

In địa chỉ IP ESP32-CAM:

// Print ESP32 Local IP Address
Serial.print("IP Address: http://");
Serial.println(WiFi.localIP());

Các dòng sau định cấu hình máy ảnh và thiết lập cài đặt máy ảnh:

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;
}

Khởi tạo máy ảnh.

// 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;
}

Sau khi khởi tạo máy ảnh, hãy gọi capturePhotoSaveSpiffs () và gửi ảnh() chức năng. Các chức năng này được xác định ở cuối mã.

Hàm capturePhotoSaveSpiffs ()

Các capturePhotoSaveSpiffs () chức năng chụp ảnh và lưu ảnh trong ESP32 SPIFFS. Trong các dòng tiếp theo, bạn chụp ảnh và lưu vào bộ đệm khung fb:

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

Sau đó, tạo một tệp mới trong SPIFFS nơi ảnh sẽ được lưu.

Serial.printf("Picture file name: %sn", FILE_PHOTO);
File file = SPIFFS.open(FILE_PHOTO, FILE_WRITE);

Kiểm tra xem tệp đã được tạo thành công chưa. Nếu không, hãy in thông báo lỗi.

if (!file) {
  Serial.println("Failed to open file in writing mode");
}

Nếu một tệp mới được tạo thành công, hãy “sao chép” hình ảnh từ bộ đệm vào tệp mới tạo đó.

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");

Đóng tệp và xóa bộ đệm để sử dụng trong tương lai.

file.close();
esp_camera_fb_return(fb);

Cuối cùng, hãy kiểm tra xem ảnh đã được chụp và lưu thành công hay chưa. Chúng tôi có thể làm điều đó bằng cách kiểm tra kích thước tệp ảnh với checkPhoto () hàm số.

ok = checkPhoto(SPIFFS);

Các checkPhoto () , kiểm tra kích thước ảnh tệp. Nếu kích thước ảnh lớn hơn 100 byte, gần như chắc chắn ảnh đã được chụp và lưu thành công. Trong trường hợp đó, nó trả về 1.

bool checkPhoto( fs::FS &fs ) {
  File f_pic = fs.open( FILE_PHOTO );
  unsigned int pic_sz = f_pic.size();
  return ( pic_sz > 100 );
}

Nên Vâng biến bằng 1.

ok = checkPhoto(SPIFFS);

Trong trường hợp kích thước ảnh nhỏ hơn 100 byte, Vâng biến sẽ tiếp tục là 0 và nó sẽ tiếp tục cố gắng chụp ảnh mới và lưu nó.

hàm sendPhoto ()

Sau khi ảnh được lưu thành công trong SPIFFS, chúng tôi sẽ gửi ảnh qua email bằng cách gọi đến gửi ảnh() hàm số. Chúng ta hãy nhìn vào chức năng đó.

void sendPhoto( void ) {

Dòng sau đặt máy chủ SMTP Server, cổng SMTP, địa chỉ email tài khoản và mật khẩu được sử dụng để đăng nhập:

smtpData.setLogin(smtpServer, smtpServerPort, emailSenderAccount, emailSenderPassword);

Đặt tên người gửi và email người gửi. Trong trường hợp này, chúng tôi đang đặt tên người gửi thành ESP32-CAM.

smtpData.setSender("ESP32-CAM", emailSenderAccount);

Đặt ưu tiên email.

smtpData.setPriority("High");

Đặt chủ đề email.

smtpData.setSubject(emailSubject);

Dòng sau đặt thông báo. Bạn có thể gửi văn bản HTML hoặc văn bản thô. Trong trường hợp này, chúng tôi đang gửi một tin nhắn với một số HTML.

smtpData.setMessage("<h2>Photo captured with ESP32-CAM and attached in this email.</h2>", true);

Khi gửi tin nhắn ở định dạng HTML, bạn nên chuyển thật như một tham số thứ hai cho setMessage () phương pháp. Nếu bạn muốn gửi văn bản thô, hãy đặt sai.

//smtpData.setMessage("Photo captured with ESP32-CAM and attached in this email.", false);

Cuối cùng, đặt email người nhận. Đây là email sẽ nhận tin nhắn từ ESP32.

smtpData.addRecipient(emailRecipient);

Sau đó, để đính kèm một tệp, bạn chỉ cần gọi addAtatachFile () trên smtpData đối tượng và chuyển làm đối số đường dẫn tệp.

smtpData.addAttachFile(FILE_PHOTO, "image/jpg");

Cuối cùng, bạn cần đặt nơi lưu tệp của mình (SPIFFS hoặc thẻ SD). Chúng tôi đang sử dụng SPIFFS:

smtpData.setFileStorageType(MailClientStorageType::SPIFFS);

Đặt chức năng gọi lại sẽ được gọi khi gửi email.

smtpData.setSendCallback(sendCallback);

Các sendCallback () hàm trả về việc email đã được gửi thành công hay chưa.

Bây giờ chúng tôi đã thiết lập tất cả các chi tiết của smtpData, chúng tôi đã sẵn sàng để gửi email.

if (!MailClient.sendMail(smtpData))
  Serial.println("Error sending Email, " + MailClient.smtpErrorReason());

Sau khi gửi email, bạn có thể xóa tất cả dữ liệu khỏi smtpData sự vật.

smtpData.empty();

Trong ví dụ này, email được gửi một lần khi ESP32 khởi động, đó là lý do tại sao vòng() trống rỗng. Ý tưởng là điều chỉnh mã để sử dụng trong các dự án của riêng bạn.

void loop() {

}

Để gửi một email mới. Bạn chỉ cần đặt lại bo mạch của mình (nhấn ĐẶT LẠI trên bo mạch
), để nó khởi động lại và chạy lại mã.

Trình diễn

Sau khi thực hiện các thay đổi cần thiết đối với mã: sơ đồ chân máy ảnh, địa chỉ email của người gửi, mật khẩu email của người gửi, địa chỉ email của người nhận và thông tin đăng nhập mạng, bạn có thể tải mã lên bảng của mình.

Nếu bạn không biết cách tải mã lên ESP32-CAM, hãy đọc bài đăng sau:

  • Cách lập trình / tải mã lên ESP32-CAM AI-Thinker (Arduino IDE)

Sau khi tải lên, mở Serial Monitor và nhấn nút ĐẶT LẠI ESP32-CAM. ESP32 sẽ kết nối với Wi-Fi, chụp ảnh, lưu trong SPIFFS, kết nối với máy chủ SMTP và gửi email như hình dưới đây.

ESP32 CAM gửi ảnh qua email trình diễn màn hình nối tiếp

Sau một vài giây, bạn sẽ có một email mới từ ESP32-CAM trong hộp thư đến của mình. Như bạn có thể thấy trong hình ảnh bên dưới, tên email của người gửi là “ESP32-CAM” như chúng tôi đã xác định trong mã và chủ đề “Đã chụp ảnh ESP32-CAM”.

Email ESP32 CAM với Hộp thư đến đã nhận ảnh

Mở email và bạn sẽ thấy một bức ảnh được chụp bởi ESP32-CAM.

ESP32 CAM Gửi ảnh đến Email Hộp thư đến Gmail

Bạn có thể mở hoặc tải ảnh xuống để xem ở kích thước đầy đủ.

Ảnh chụp bằng ESP32 CAM Full Size

Kết thúc

Trong hướng dẫn này, bạn đã học cách gửi email có ảnh được chụp bằng ESP32-CAM. Ví dụ được trình bày càng đơn giản càng tốt: nó chụp ảnh và gửi qua email khi ESP32-CAM khởi động lần đầu tiên. Để gửi một email khác, bạn cần đặt lại bảng.

Dự án này không có ứng dụng thực tế, nhưng sẽ rất hữu ích nếu bạn hiểu cách gửi email có tệp đính kèm. Sau đó, sẽ khá dễ dàng để đưa tính năng này vào các dự án ESP32-CAM của riêng bạn.

Các dự án ESP32-CAM khác mà bạn có thể thích:

  • ESP32-CAM Đăng hình ảnh lên Máy chủ cục bộ hoặc Máy chủ đám mây bằng PHP (Trình quản lý ảnh)
  • ESP32-CAM HTTP POST Ảnh lên Máy chủ cục bộ hoặc Máy chủ đám mây
  • ESP32-CAM Chụp ảnh và lưu vào thẻ MicroSD
  • ESP32-CAM Chụp ảnh và Hiển thị trong Máy chủ Web

Tìm hiểu thêm về ESP32-CAM:

  • Xây dựng Dự án ESP32-CAM bằng Sách điện tử Arduino IDE
  • Các Dự án và Hướng dẫn về ESP32-CAM khác…

Cảm ơn vì đã đọc.

Comments

Popular posts from this blog

Máy chủ web ESP32 với BME680 – Trạm thời tiết (Arduino IDE)

esp32s cam arduino, esp32 cam module, esp32 camera