Hackster is hosting Hackster Holidays, Ep. 6: Livestream & Giveaway Drawing. Watch previous episodes or stream live on Monday!Stream Hackster Holidays, Ep. 6 on Monday!
Jayakarthigeyan Prabakar
Created March 1, 2020 © MIT

Security Camera using KEMET Pyro Sensor and ESP32 Cam

Smart Wi-Fi Connected Security Camera with Email Alert System Using ESP32 Cam and KEMET Pyroelectric Infrared Sensor Module

BeginnerProtip8 hours49
Security Camera using KEMET Pyro Sensor and ESP32 Cam

Things used in this project

Hardware components

Proximity Sensor- Pyroelectric Infrared Sensor Module
KEMET Electronics Corporation Proximity Sensor- Pyroelectric Infrared Sensor Module
×1
Espressif ESP32 Camera
×1
Flash Memory Card, SD Card
Flash Memory Card, SD Card
×1
USB-A to Micro-USB Cable
USB-A to Micro-USB Cable
×1

Software apps and online services

Arduino IDE
Arduino IDE

Hand tools and fabrication machines

3D Printer (generic)
3D Printer (generic)
Soldering iron (generic)
Soldering iron (generic)

Story

Read more

Custom parts and enclosures

3D Print Base

3D Print Top

Schematics

Schematic

Code

HacksterKemet.ino

Arduino
ESP32-S Code
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("----------------");
  }
}

Credits

Jayakarthigeyan Prabakar

Jayakarthigeyan Prabakar

3 projects • 16 followers
Rapid Prototyper | Product Developer | Systems Designer | IoT Specialist | Hardware Design Team Leader | Author | Web and App Developer
Thanks to Chaitanya.

Comments