248   227   72    

Используем камеру Raspberry Pi для отправки электронных писем

Используем модуль камеры Raspberry Pi и датчик движения для отправки фотографий в учетную запись на Gmail.

Комплектующие

  • Raspberry Pi 3 B
  • Модуль камеры Raspberry Pi
  • Сенсор движения

Постараемся разобраться, как отправлять электронные письма, содержащие изображения, используя Raspberry Pi, детектор движения и язык программирования Python. Мы будем использовать датчик обнаружения движения, и при обнаружении движения камера Raspberry Pi сделает снимок и отправит электронное письмо с прикрепленным изображением.

Это руководство работает только с учетными записями Gmail, поэтому прежде чем продолжить, убедитесь, что у вас есть учетная запись Gmail. Также рекомендуем создать новую учетную запись Gmail, чтобы избежать возможных проблем с безопасностью.

Настройка параметров по умолчанию Gmail

По умолчанию Google не позволяет отправлять и получать электронные письма, содержащие код Python. Чтобы обновить этот параметр по умолчанию, включите «Разрешить менее безопасные приложения» (англ. - Allow less secure apps) в настройках своей учетной записи, выполнив следующие действия:

  1. Войдите в свою учетную запись Gmail, указав свои учетные данные.
  2. Нажмите на изображение своего профиля, а затем нажмите «Google account».
  3. В разделе «Вход и безопасность» (англ. - Sign-in and Security) нажмите «Подключенные приложения и сайты» (англ. - Connected apps and sites).
  4. Нажмите «Разрешить менее безопасные приложения» (англ. - Allow less secure apps).

Теперь вы можете использовать Gmail, чтобы получать электронные письма, содержащие код Python.

Подключаем датчик движения к Raspberry Pi

Подключите контакты VCC и GND датчика движения к 5V и GND Raspberry Pi, затем подключите вывод OUT датчика движения к GPIO17. Убедитесь, что вы подключили камеру к Raspberry Pi и включили её. Используйте схему соединений ниже.

Код Python для отправки писем

Перед запуском кода убедитесь, что все адреса электронной почты отправителя и получателя и пароль отправителя электронной почты введены. Код считывает выходные данные датчика (обнаружив движение), делает снимок и сохраняет его в папке.

Когда вы запускаете код в первый раз, он автоматически создает папку. Как только камера сделает снимок, изображение будет прикреплено к электронному письму и отправлено на адрес отправителя.

Скопируйте и вставьте приведенный ниже код в новый файл с расширением .py (например - dvizhenie.py) и запустите код с помощью команды:

python dvizhenie.py

Код программы:

import os
import glob
import picamera
import RPi.GPIO as GPIO
import smtplib
from time import sleep

# Importing modules for sending mail
from email.MIMEMultipart import MIMEMultipart
from email.MIMEText import MIMEText
from email.MIMEBase import MIMEBase
from email import encoders

sender = 'example@gmail.com'
password = 'abcd1234'
receiver = 'example@gmail.com'

DIR = './Database/'
FILE_PREFIX = 'image'
            
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BOARD)
GPIO.setup(11, GPIO.IN)  # Read output from PIR motion sensor

def send_mail():
    print 'Sending E-Mail'
    # Create the directory if not exists
    if not os.path.exists(DIR):
        os.makedirs(DIR)
    # Find the largest ID of existing images.
    # Start new images after this ID value.
    files = sorted(glob.glob(os.path.join(DIR, FILE_PREFIX + '[0-9][0-9][0-9].jpg')))
    count = 0
    
    if len(files) > 0:
        # Grab the count from the last filename.
        count = int(files[-1][-7:-4])+1

    # Save image to file
    filename = os.path.join(DIR, FILE_PREFIX + '%03d.jpg' % count)
    # Capture the face
    with picamera.PiCamera() as camera:
        pic = camera.capture(filename)
    # Sending mail
    msg = MIMEMultipart()
    msg['From'] = sender
    msg['To'] = receiver
    msg['Subject'] = 'Movement Detected'
    
    body = 'Picture is Attached.'
    msg.attach(MIMEText(body, 'plain'))
    attachment = open(filename, 'rb')
    part = MIMEBase('application', 'octet-stream')
    part.set_payload((attachment).read())
    encoders.encode_base64(part)
    part.add_header('Content-Disposition', 'attachment; filename= %s' % filename)
    msg.attach(part)
    server = smtplib.SMTP('smtp.gmail.com', 587)
    server.starttls()
    server.login(sender, password)
    text = msg.as_string()
    server.sendmail(sender, receiver, text)
    server.quit()

while True:
    i = GPIO.input(11)
    if i == 0:  # When output from motion sensor is LOW
        print "No intruders", i
        sleep(0.3)
    elif i == 1:  # When output from motion sensor is HIGH
        print "Intruder detected", i
        send_mail()

После запуска программы, когда Raspberry Pi обнаруживает движение, происходит следующее:

Объяснение кода

Рассмотрим, что делает каждый раздел кода в отдельности. Сначала мы добавим пакеты и модули, необходимые для этого проекта. Пакет GPIO помогает контролировать контакты GPIO нашего Raspberry Pi. Пакет Picamera используется для камеры Raspberry Pi, а пакет Smtplib позволяет нам настроить сервер Gmail.

import os
import glob
import picamera
import RPi.GPIO as GPIO
import smtplib
from time import sleep

Нам нужны четыре модуля, чтобы отправлять электронные письма от Raspberry Pi на Gmail:

from email.MIMEMultipart import MIMEMultipart
from email.MIMEText import MIMEText
from email.MIMEBase import MIMEBase
from email import encoders

Нам нужно добавить адрес электронной почты получателя, адрес электронной почты и пароль отправителя:

sender = 'example@gmail.com'
password = 'abcd1234'
receiver = 'example@gmail.com'

Затем мы можем задать путь к каталогу и префикс файла, в который будут сохраняться изображения:

DIR = './Database/'
FILE_PREFIX = 'image'

Так как мы собираемся получить выходные данные датчика, мы объявляем вывод 11 как входной. Любые предупреждения GPIO следует игнорировать.

GPIO.setwarnings(False)
GPIO.setmode(GPIO.BOARD)
GPIO.setup(11, GPIO.IN)  # Считать вывод с датчика движения PIR (пассивный инфракрасный датчик)

В функции send_mail() система проверит, был ли каталог для файлов создан или нет. Если он не создан, он будет создан. Затем она будет искать идентификатор изображений и сохранять новые изображения с новым идентификатором. Затем самое последнее изображение будет прикреплено к электронному письму и отправлено на адрес получателя.

def send_mail():
    print 'Sending E-Mail'
    # Create the directory if not exists
    if not os.path.exists(DIR):
        os.makedirs(DIR)
    # Find the largest ID of existing images.
    # Start new images after this ID value.
    files = sorted(glob.glob(os.path.join(DIR, FILE_PREFIX + '[0-9][0-9][0-9].jpg')))
    count = 0
    
    if len(files) > 0:
        # Grab the count from the last filename.
        count = int(files[-1][-7:-4])+1

    # Save image to file
    filename = os.path.join(DIR, FILE_PREFIX + '%03d.jpg' % count)
    # Capture the face
    with picamera.PiCamera() as camera:
        pic = camera.capture(filename)
    # Sending mail
    msg = MIMEMultipart()
    msg['From'] = sender
    msg['To'] = receiver
    msg['Subject'] = 'Movement Detected'
    
    body = 'Picture is Attached.'
    msg.attach(MIMEText(body, 'plain'))
    attachment = open(filename, 'rb')
    part = MIMEBase('application', 'octet-stream')
    part.set_payload((attachment).read())
    encoders.encode_base64(part)
    part.add_header('Content-Disposition', 'attachment; filename= %s' % filename)
    msg.attach(part)
    server = smtplib.SMTP('smtp.gmail.com', 587)
    server.starttls()
    server.login(sender, password)
    text = msg.as_string()
    server.sendmail(sender, receiver, text)
    server.quit()

In the while loop, it will read the input from pin 11 and, if the input is equal to 1, the send_mail() function will be called to send an email.
while True:
    i = GPIO.input(11)
    if i == 0:  # When output from motion sensor is LOW
        print "No intruders", i
        sleep(0.3)
    elif i == 1:  # When output from motion sensor is HIGH
        print "Intruder detected", i
        send_mail()

На этом всё. Хороших вам проектов.

Ардуино+