Разнообразные системы безопасности с каждым годом становятся все более востребованными в современном обществе. В данной статье мы рассмотрим создание системы безопасности на Raspberry Pi, которая будет не только предупреждать вас по Email о незаконном проникновении на объект (ваш дом), но также присылать вам на Email и фотографию нарушителя.
Для обнаружения нарушителя в нашей системе мы будем использовать пироэлектрический датчик (PIR Sensor) – при его обнаружении камера будет делать фотоснимок нарушителя, который будет немедленно отправляться вам на Email. Эту систему можно установить на входной двери вашего дома или офиса, а также любого другого объекта, который необходимо охранять от проникновения нежелательных лиц.
Необходимые компоненты
- Плата Raspberry Pi (купить на AliExpress).
- Камера для Raspberry Pi (купить на AliExpress).
- Пироэлектрический датчик движения (PIR Sensor) (купить на AliExpress).
- Светодиод (купить на AliExpress).
- Резистор 1 кОм (купить на AliExpress).
- Источник питания.
- Макетная плата.
- Соединительные провода.
Объяснение работы проекта
Принцип работы нашего проекта достаточно прост. Пироэлектрический датчик движения (PIR датчик) используется для обнаружения человека/нарушителя в поле своего действия, а камера делает фото в случае обнаружения человека/нарушителя. Более подробно про принципы работы PIR датчика можно прочитать в статье про детектор движения с использованием Arduino и PIR датчика.
При обнаружении движения (нарушителя) PIR датчик подает управляющий сигнал на плату Raspberry Pi, которая, в свою очередь, подает управляющий сигнал на камеру чтобы она сделала снимок. После этого плата Raspberry Pi создает Email с изображением (фото нарушителя) и передает его на заданный адрес. Кроме изображения в Email также будет содержаться сообщение получателю, мы использовали в качестве сообщения фразу “Please find the attachment”, но вы можете изменить это сообщения, внеся соответствующие изменения в код программы.
В имя сохраняемого изображения мы будем добавлять информацию о дате и времени снимка, поэтому вы легко сможете определить когда был сделан тот или иной снимок. Подобный подход мы использовали и в предыдущей статье про счетчик посетителей на основе платы Raspberry Pi, в которой вы можете ознакомиться с принципами работы с камерой в плате Raspberry Pi.
Схема проекта
Схема система безопасности на основе платы Raspberry Pi и камеры представлена на следующем рисунке.
В представленной схеме камера подключена к соответствующему слоту на плате Raspberry Pi, а PIR датчик подключен к контакту 18 платы. Светодиод подключен к контакту 17 платы Raspberry Pi через резистор 1 кОм.
Внешний вид камеры для Raspberry Pi показан на следующем рисунке.
Настройка платы Raspberry Pi
Для работы нашего проекта после первоначальной настройки операционной системы Raspberry Pi необходимо в нее файлы библиотеки для работы с камерой (Pi camera library files), это можно сделать с помощью следующих команд:
1 2 |
$ sudo apt-get install python-picamera $ sudo apt-get install python3-picamera |
После этого необходимо войти в меню настроек операционной системы чтобы включить в них использование камеры.
1 |
$ sudo raspi-config |
После этого выберите пункт Enable camera (включить использование камеры).
Далее необходимо перезагрузить Raspberry Pi чтобы изменения вступили в силу.
После настройки камеры нам еще необходимо установить программное обеспечение для передачи Email (электронной почты). В качестве него мы будем использовать ssmtp, который хорошо подходит для передачи Email с помощью командной строки или скрипта на Python. Нам необходимо установить две библиотеки чтобы передавать Email с помощью SMTP клиента:
1 2 |
sudo apt-get install ssmtp sudo apt-get install mailutils |
После установки этих библиотек необходимо открыть файл ssmtp.conf, внести в него изменения как показано на следующем рисунке и сохранить его. Чтобы сохранить и выйти из файла, нажмите ‘CTRL+x’, затем ‘y’, после чего нажмите ‘enter’.
1 |
sudo nano /etc/ssmtp/ssmtp.conf |
1 2 3 4 5 6 7 8 |
root=YourEmailAddress mailhub=smtp.gmail.com:587 hostname=raspberrypi AuthUser=YourEmailAddress AuthPass=YourEmailPassword FromLineOverride=YES UseSTARTTLS=YES UseTLS=YES |
После этого мы можем проверить настройку SMTP клиента при помощи передачи тестовой команды, показанной ниже. При выполнении этой команды, если все работает исправно, вы должны получить email на указанный адрес.
1 |
echo "Hello saddam" | mail -s "Testing..." saddam4201@gmail.com |
Объяснение программы для Raspberry Pi
Полный код программы приведен в конце статьи, здесь же мы кратко рассмотрим его основные фрагменты.
Первым делом в программе нам необходимо подключить используемые библиотеки, инициализировать необходимые переменные и контакты. Здесь следует отметить, что для передачи простых email библиотеки smtplib будет вполне достаточно, однако если вы хотите передать хорошо оформленное email с приложениями и т.д., то вам будет необходимо расширение этой библиотеки под названием MIME (Multipurpose Internet Mail Extensions).
1 2 3 4 5 6 7 8 9 |
import RPi.GPIO as gpio import picamera import time import smtplib from email.MIMEMultipart import MIMEMultipart from email.MIMEText import MIMEText from email.MIMEBase import MIMEBase from email import encoders from email.mime.image import MIMEImage |
После этого мы зададим адрес электронной почты для отправки писем и само сообщение, которое будет необходимо отправлять.
1 2 3 4 5 6 7 |
fromaddr = "raspiduino4201@gmail.com" toaddr = "saddam4201@gmail.com" mail = MIMEMultipart() mail['From'] = fromaddr mail['To'] = toaddr mail['Subject'] = "Attachment" body = "Please find the attachment" |
После этого мы создадим функцию def sendMail(data) для передачи писем.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
def sendMail(data): mail.attach(MIMEText(body, 'plain')) print data dat='%s.jpg'%data print dat attachment = open(dat, 'rb') image=MIMEImage(attachment.read()) attachment.close() mail.attach(image) server = smtplib.SMTP('smtp.gmail.com', 587) server.starttls() server.login(fromaddr, "your password") text = mail.as_string() server.sendmail(fromaddr, toaddr, text) server.quit() |
Функция def capture_image() будет использоваться для получения изображения нарушителя с датой и временем снимка.
1 2 3 4 5 6 7 8 9 |
def capture_image(): data= time.strftime("%d_%b_%Y|%H:%M:%S") camera.start_preview() time.sleep(5) print data camera.capture('%s.jpg'%data) camera.stop_preview() time.sleep(1) sendMail(data) |
После этого мы инициализируем камеру и зададим необходимые для нее настройки.
1 2 3 4 |
camera = picamera.PiCamera() camera.rotation=180 camera.awb_mode= 'auto' camera.brightness=55 |
И, наконец, мы будем считывать показания с выхода PIR датчика – если на нем будет напряжение высокого уровня (high), то будет вызываться функция capture_image() для получения снимка нарушителя и передачи Email с этим изображением. Мы будем использовать функцию sendmail() внутри функции capture_image() для передачи Email.
1 2 3 4 5 6 7 8 9 10 |
while 1: if gpio.input(pir)==1: gpio.output(led, HIGH) capture_image() while(gpio.input(pir)==1): time.sleep(1) else: gpio.output(led, LOW) time.sleep(0.01) |
В проекте данной системы безопасности для обнаружения нарушителя вместо PIR датчика можно также применить ультразвуковой датчик или инфракрасный датчик.
Исходный код программы на Python
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 |
import RPi.GPIO as gpio import picamera import time import smtplib from email.MIMEMultipart import MIMEMultipart from email.MIMEText import MIMEText from email.MIMEBase import MIMEBase from email import encoders from email.mime.image import MIMEImage fromaddr = "raspiduino4201@gmail.com" # измените этот email адрес на тот, который необходим вам toaddr = "saddam4201@gmail.com" mail = MIMEMultipart() mail['From'] = fromaddr mail['To'] = toaddr mail['Subject'] = "Attachment" body = "Please find the attachment" led=17 pir=18 HIGH=1 LOW=0 gpio.setwarnings(False) gpio.setmode(gpio.BCM) gpio.setup(led, gpio.OUT) # инициализируем GPIO led в качестве цифрового выхода gpio.setup(pir, gpio.IN) # инициализируем GPIO pir в качестве цифрового входа data="" def sendMail(data): mail.attach(MIMEText(body, 'plain')) print data dat='%s.jpg'%data print dat attachment = open(dat, 'rb') image=MIMEImage(attachment.read()) attachment.close() mail.attach(image) server = smtplib.SMTP('smtp.gmail.com', 587) server.starttls() server.login(fromaddr, "your password") text = mail.as_string() server.sendmail(fromaddr, toaddr, text) server.quit() def capture_image(): data= time.strftime("%d_%b_%Y|%H:%M:%S") camera.start_preview() time.sleep(5) print data camera.capture('%s.jpg'%data) camera.stop_preview() time.sleep(1) sendMail(data) gpio.output(led , 0) camera = picamera.PiCamera() camera.rotation=180 camera.awb_mode= 'auto' camera.brightness=55 while 1: if gpio.input(pir)==1: gpio.output(led, HIGH) capture_image() while(gpio.input(pir)==1): time.sleep(1) else: gpio.output(led, LOW) time.sleep(0.01) |