About Smart Email Alert Security Camera:
Smart email alert security camera is an IoT device which includes an ESP32-S interfaced with OV2640 camera module and KEMET’s Pyroelectric Infrared Sensors. ESP32-S module connects internet via Wi-Fi. The controller is programmed to sense the KEMET’s Pyroelectric Infrared Sensor. Whenever, the sensor detects a movement, the controller triggers the on board LED Flash of ESP32-S module and then captures a photo from the camera and stores it on the SD card. Then, it creates an email in which the captured photo is attached and sent as an email alert to the defined email on the program running on the ESP32-S.
Sensor detects, triggers LED flash, captures photo and sends it as email alert:
Email Alert:
Steps to build the prototype:
Step 1: Connect the sensor and USB cable to ESP-32S camera module
Step 2: Program the module
Download and install the following libraries for Arduino
https://github.com/mobizt/ESP32-Mail-Client
https://github.com/espressif/arduino-esp32/tree/master/libraries/SD_MMC
Upload the following code on ESP32-S
unsigned long now;
unsigned long previousMillis;
unsigned long interval = 20000;
///////////////////////////////////////////////////////////////////////////////////////////////////
#include <Arduino.h>
#include "ESP32_MailClient.h"
#include "SD_MMC.h"
#define WIFI_SSID "WIFISSID"
#define WIFI_PASSWORD "WIFIPASSWORD"
SMTPData smtpData; //The Email Sending data object contains config and data to send
void sendCallback(SendStatus info); //Callback function to get the Email sending status
String RFRead = "";
String RFReadX = "";
///////////////////////////////////////////////////////////////////////////////////////////////////
#include "esp_camera.h"
#include <EEPROM.h> // read and write from flash memory
#include "soc/soc.h" // Disable brownour problems
#include "soc/rtc_cntl_reg.h" // Disable brownour problems
#include "driver/rtc_io.h"
// define the number of bytes you want to access
#define EEPROM_SIZE 1
// Pin definition for 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
int pictureNumber = 0;
///////////////////////////////////////////////////////////////////////////////////////////////////
boolean detection = LOW;
///////////////////////////////////////////////////////////////////////////////////////////////////
void setup() {
pinMode (16, INPUT); // IR Sensor connected to GPIO16
pinMode(4, OUTPUT);
digitalWrite(4, LOW);
WRITE_PERI_REG(RTC_CNTL_BROWN_OUT_REG, 0); //disable brownout detector
Serial.begin(9600);
Serial.println();
Serial.print("Connecting to AP");
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
while (WiFi.status() != WL_CONNECTED)
{
Serial.print(".");
delay(200);
}
delay(1000);
Serial.println("");
Serial.println("WiFi connected.");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
Serial.println();
delay(1000);
if (!MailClient.sdBegin(14, 2, 15, 13)) {
Serial.println("Card Mount Failed");
return;
}
MailClient.Time.setClock(5, 30);
delay(1000);
///////////////////////////////////////////////////////////////////////////
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_QVGA; // FRAMESIZE_ + QVGA|CIF|VGA|SVGA|XGA|SXGA|UXGA
config.jpeg_quality = 10;
config.fb_count = 2;
} else {
config.frame_size = FRAMESIZE_SVGA;
config.jpeg_quality = 12;
config.fb_count = 1;
}
// Init Camera
esp_err_t err = esp_camera_init(&config);
if (err != ESP_OK) {
Serial.printf("Camera init failed with error 0x%x", err);
return;
}
///////////////////////////////////////////////////////////////////////////
previousMillis = millis();
}
/////////////////////////////////////////////////////////////////////////////
void loop() {
now = millis();
detection = digitalRead(16);
if (detection == HIGH && now - previousMillis > interval) {
Serial.println("Detection");
Serial.println(now - previousMillis);
previousMillis = millis();
RFReadX = "Detection";
detection = LOW;
}
if (RFReadX == "Detection") {
String DateTime = "Security Alert";
//////////////////////////////////////////////////////////////////////////////////
Serial.println("Capture Photo");
digitalWrite(4, HIGH);
camera_fb_t * fb = NULL;
// Take Picture with Camera
fb = esp_camera_fb_get();
if (!fb) {
Serial.println("Camera capture failed");
digitalWrite(4, LOW);
return;
}
digitalWrite(4, LOW);
// initialize EEPROM with predefined size
EEPROM.begin(EEPROM_SIZE);
pictureNumber = EEPROM.read(0) + 1;
// Path where new picture will be saved in SD Card
//String path = "/picture" + String(pictureNumber) + ".jpg";
String path = "/picture1.jpg";
fs::FS &fs = SD;
Serial.printf("Picture file name: %s\n", path.c_str());
File file = fs.open(path.c_str(), FILE_WRITE);
if (!file) {
Serial.println("Failed to open file in writing mode");
}
else {
file.write(fb->buf, fb->len); // payload (image), payload length
Serial.printf("Saved file to path: %s\n", path.c_str());
EEPROM.write(0, pictureNumber);
EEPROM.commit();
}
file.close();
esp_camera_fb_return(fb);
//////////////////////////////////////////////////////////////////////////////////
Serial.println("Sending email...");
smtpData.setLogin("smtp.gmail.com", 587, "sender@gmail.com", "password");
smtpData.setSender("KEMET ALERT", "sender@gmail.com");
smtpData.setPriority("High");
smtpData.addRecipient("receiver@gmail.com");
smtpData.setSubject(RFReadX);
smtpData.setMessage(DateTime, false);
smtpData.addAttachFile(path, "image/jpeg");
smtpData.setFileStorageType(MailClientStorageType::SD);
smtpData.setSendCallback(sendCallback);
if (!MailClient.sendMail(smtpData)) {
Serial.println("Error sending Email, " + MailClient.smtpErrorReason());
}
smtpData.empty();
deleteFile(SD, "/picture1.jpg");
RFReadX = "";
}
}
void deleteFile(fs::FS &fs, const char * path) {
Serial.printf("Deleting file: %s\n", path);
if (fs.remove(path)) {
Serial.println("File deleted");
} else {
Serial.println("Delete failed");
previousMillis = millis();
}
}
void sendCallback(SendStatus msg)
{
Serial.println(msg.info());
if (msg.success())
{
Serial.println("----------------");
}
}
Step 3. Print enclosures on 3D printer
Download the files present in the Custom parts and enclosures section and 3D print them.
Step 4. Pack the module inside 3D printed enclosure
Comments