Используем модуль камеры Raspberry Pi и датчик движения для отправки фотографий в учетную запись на Gmail.
Комплектующие
- Raspberry Pi 3 B
- Модуль камеры Raspberry Pi
- Сенсор движения
Постараемся разобраться, как отправлять электронные письма, содержащие изображения, используя Raspberry Pi, детектор движения и язык программирования Python. Мы будем использовать датчик обнаружения движения, и при обнаружении движения камера Raspberry Pi сделает снимок и отправит электронное письмо с прикрепленным изображением.
Это руководство работает только с учетными записями Gmail, поэтому прежде чем продолжить, убедитесь, что у вас есть учетная запись Gmail. Также рекомендуем создать новую учетную запись Gmail, чтобы избежать возможных проблем с безопасностью.
Настройка параметров по умолчанию Gmail
По умолчанию Google не позволяет отправлять и получать электронные письма, содержащие код Python. Чтобы обновить этот параметр по умолчанию, включите «Разрешить менее безопасные приложения» (англ. - Allow less secure apps) в настройках своей учетной записи, выполнив следующие действия:
- Войдите в свою учетную запись Gmail, указав свои учетные данные.
- Нажмите на изображение своего профиля, а затем нажмите «Google account».
- В разделе «Вход и безопасность» (англ. - Sign-in and Security) нажмите «Подключенные приложения и сайты» (англ. - Connected apps and sites).
- Нажмите «Разрешить менее безопасные приложения» (англ. - 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.webp'))) 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.webp' % 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.webp'))) 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.webp' % 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()
На этом всё. Хороших вам проектов.