How to Use the Raspberry Pi4 Camera and PIR Sensor to Send Emails

by sarful in Circuits > Raspberry Pi

850 Views, 2 Favorites, 0 Comments

How to Use the Raspberry Pi4 Camera and PIR Sensor to Send Emails

How to Use the Raspberry Pi4 Camera And PIR Sensor  to Send Emails..jpg

Introduction :

In this tutorial, I’ll show you how to send emails containing pictures using a Raspberry Pi4 and a motion detector and the Python programming language. We will use a PIR motion detection sensor and whenever motion is detected, the Raspberry Pi4 Camera will take a picture and send an email with the picture attached.

In this tutorial I divide this project some step if you flow this step with me I hope you can do this

Step-1:
You have to need some change in your google account flow this step Login to your Gmail account by entering your login credentials.Click on your profile picture and then click on “Google account”.Under “Sign-in and Security” click “Connected apps and sites”.Click “Allow less secure apps” to turn it on.(By Default its Turn off)

More Link

Step-2

Components Required

  1. Raspberry Pi 4 Model B
  2. PIR Sensor5V Buzzer
  3. Connecting Wires
  4. Breadboard
  5. Power Supply

Circuit Diagram

How to Use the Raspberry Pi4 Camera And PIR Sensor  to Send Emails..jpg

The following Fritzing based images show all the connections with respect to the PIR Motion Sensor using Raspberry Pi4

Circuit Design:
Connect the VCC and GND pins of the PIR Motion Sensor to +5V and GND pins of the Raspberry Pi4. Connect the DATA Pin of the PIR Sensor to GPIO24 of the Raspberry Pi4.A 5V Buzzer is connected to GPIO20 And Raspberry pi4 Camera Connect to the PI Connector Slot. The other pin of the buzzer connected to GND.

The Python Code to Send Emails Before running the code, make sure the sender and receiver email addresses and the password of the email sender are all entered. The code will read the output from the sensor and, upon detecting motion, will capture an image and save it on the database folder. When you run the code for the first time, it will automatically create the folder. Once the camera captures an image, the image will be attached in the email and sent to the sender’s address.

Code

import RPi.GPIO as GPIO
import time
import datetime
import picamera
import os
import smtplib
from email import encoders
from email.mime.base import MIMEBase
from email.mime.multipart import MIMEMultipart


camera = picamera.PiCamera()
GPIO.setmode(GPIO.BCM)

GPIO.setup(23, GPIO.IN) #PIR
GPIO.setup(24, GPIO.OUT) #BUzzer

'''
ts = time.time()
st = datetime.datetime.fromtimestamp(ts).strftime('%Y-%m-%d %H:%M:%S')
'''



COMMASPACE = ', '

def Send_Email(image):
    sender = '###YOUREMAIL###'
    gmail_password = '###YOURPASSWORD###'
    recipients = ['##YOURRECIPENTEMAIL###']

    # Create the enclosing (outer) message
    outer = MIMEMultipart()
    outer['Subject'] = 'Attachment Test'
    outer['To'] = COMMASPACE.join(recipients)
    outer['From'] = sender
    outer.preamble = 'You will not see this in a MIME-aware mail reader.\n'

    # List of attachments
    attachments = [image]

    # Add the attachments to the message
    for file in attachments:
        try:
            with open(file, 'rb') as fp:
                msg = MIMEBase('application', "octet-stream")
                msg.set_payload(fp.read())
            encoders.encode_base64(msg)
            msg.add_header('Content-Disposition', 'attachment', filename=os.path.basename(file))
            outer.attach(msg)
        except:
            print("Unable to open one of the attachments. Error: ", sys.exc_info()[0])
            raise

    composed = outer.as_string()

    # Send the email
    try:
        with smtplib.SMTP('smtp.gmail.com', 587) as s:
            s.ehlo()
            s.starttls()
            s.ehlo()
            s.login(sender, gmail_password)
            s.sendmail(sender, recipients, composed)
            s.close()
        print("Email sent!")
    except:
        print("Unable to send the email. Error: ", sys.exc_info()[0])
        raise



try:
    time.sleep(2) # to stabilize sensor
    
            
    while True:
        ##Timeloop
        ts = time.time()
        st = datetime.datetime.fromtimestamp(ts).strftime('%Y-%m-%d %H:%M:%S')
        if GPIO.input(23):
            ##If loop
            GPIO.output(24, True)
            time.sleep(0.5) #Buzzer turns on for 0.5 sec
            print("Motion Detected at {}".format(st))
            ##Adds timestamp to image
            camera.capture('image_Time_{}.jpg'.format(st))
            image = ('image_Time_{}.jpg'.format(st))
            Send_Email(image)
            time.sleep(2)
            GPIO.output(24, False)
            time.sleep(5) #to avoid multiple detection

        time.sleep(0.1) #loop delay, should be less than detection delay

except:
    GPIO.cleanup()