树莓派家庭安全系统

本项目使用HC-SR505人体检测模块传感器检测运动的人体,触发树莓派摄像头拍摄图像,并通过邮件系统进行警报。

欢迎进入我的哔哩哔哩频道进行学习!

一、项目相关设备

硬件设备:

  1. Raspberry Pi 4B
  2. HC-SR505人体感应模块
  3. OV5647摄像头模块
  4. 杜邦线(若干)

软件应用服务:

  1. 网易邮箱账户(至少两个)
  2. smtplib
  3. picamera2
  4. RPi.GPIO

二、项目描述

随着社会的发展和技术的进步,隐私及安全问题愈发需要重视,家庭安全面临的挑战也在不断增加,因此采用先进的技术手段来提升家庭安全水平变得至关重要。我们自己动手打造一个安全监控系统,用来保障了我们的家庭安全。

本项目通过使用树莓派4B作为主控系统,实现一个小型安全监控系统,应用Python脚本来控制树莓派的运行。首先,当有人接近我们家的时候,通过使用HC-SR505人体感应模块传感器,会立刻侦测到并向树莓派发送信号。第二步当树莓派检测到HC-SR505人体感应模块信号后,会立即调用摄像头捕获当前实时画面。最后,通过邮件系统将警告信息和实时画面发送到指定邮箱。

本项目可根据个人需求,自己打造一个家庭安全监控系统,既有趣又实用。

三、硬件设备

3.1 HC-SR505人体感应模块

HC-SR505小型人体感应模块是基于红外线技术的自动控制产品,灵敏度高,可靠性强,体积小,低电压工作模式。广泛应用于各类自动感应电器设备,尤其是干电池供电的自动控制产品。

HC-SR505

参数

描述 指标
工作电压范围 DC 4.5-20V
静态电流 <60uA
电平输出 高3.3V 低0V
触发方式 可重复触发(默认)
延时时间 默认8S±30%
感应角度 <100度锥角
感应距离 3米以内
工作温度 -20℃ 至 +80℃
感应透镜尺寸 直径:10mm(默认)

特点

  1. 全自动感应:人进入其感应范围则输出高电平,人离开感应范围则自动延时关闭高电平,输出低电平;
  2. 小体积:体积小可方便应用;
  3. 可重复触发方式:即感应输出高电平后,在延时时间段内,如果有人体在其感应范围活动,其输出将一直保持高电平,直到人离开后才延时将高电平变为低电平(感应模块检测到人体的每一次活动后会自己顺延一个延时时间段,并且以最后一次活动的时间为延时时间的起始点);
  4. 工作电压范围宽:默认工作电压DC4.5V-20V;
  5. 微功耗: 静态电流<50微安,特别适合干电池供电的自动控制产品;
  6. 输出高电平信号:可方便与各类电路实现对接。

3.2 OV5647摄像头模块

OV5647是一款性价比很高的摄像头模块,通常用于嵌入式系统和消费类电子产品中。

  1. 图像质量OV5647是一款500万像素的CMOS图像传感器,具有高分辨率和优秀的图像质量表现。它能够拍摄清晰、细节丰富的静态图像和视频。
  2. 应用领域OV5647常被用于嵌入式摄像头模块中,例如树莓派摄像头模块就采用了OV5647传感器。
  3. 特性OV5647具有低功耗、小尺寸、适应光照条件变化能力强等特点,使得它非常适合嵌入式系统和便携式设备的应用。
  4. 接口OV5647通常采用MIPI接口,这种接口能够提供高速、稳定的数据传输,适合于对图像数据要求较高的应用场景。

总的来说,OV5647是一款常见的高分辨率图像传感器,适用于各种需要图像捕捉功能的嵌入式和消费类电子产品中。

四、软件应用服务

4.1网易邮箱账户

本实验使用网易邮箱,一个用作发送方(需要授权码),另一个作为接收方邮箱(实际可以多个邮箱接收报警邮件)。

本实验发送邮箱为163邮箱,接收邮箱为yeah邮箱,均为网易旗下。

163邮箱

yeah邮箱

4.2smtplib

Pythonsmtplib提供了一种很方便的途径发送电子邮件。它对smtp协议进行了简单的封装。**SMTP(Simple Mail Transfer Protocol)**即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制邮件的中转方式。

4.3 picamera2

树莓派官方提供的picamera2库是针对libcamera驱动提供的python库。

树莓派的Picamera2是一个用于树莓派计算机的新的相机库,它是Picamera库的继承者。Picamera2旨在提供更简单、更强大的接口,以便用户能够更容易地控制相机并处理图像。这个库支持最新的树莓派相机模块,包括高分辨率和高帧率的视频捕捉。

Picamera2提供了许多高级功能,如自动曝光、自动白平衡、数字变焦等,同时也支持原始图像捕捉,这对于需要进行图像处理或分析的应来说非常有用。此外,它还支持多种格式和分辨率的输出,使适用于各种不同的项目需求。

4.4RPi.GPIO

RPi.GPIO是一个用于树莓派的Python 库,它允许用户通过Python代码控制树莓派的GPIO(通用输入输出)引脚。

主要特点:

  1. 简单的接口:RPi.GPIO提供了一个简单直观的编程接口,使得即使是初学者也能轻松控制GPIO引脚。

  2. 灵活的控制:用户可以设置引脚为输入或输出模式,读取输入信号或发送输出信号。

  3. 事件检测:RPi.GPIO支持事件驱动编程,可以对引脚输入变进行监控,并触发函数。

五、连接方式

连线图

六、程序

hss.py

from time import sleep
import time
import RPi.GPIO as GPIO

from utils import initGPIO, Email, Camera


def run():
subject = 'Security allert!!'
fromAddr = 'sangyc10@163.com'
toAddr = 'sang_yc@yeah.net'
with open('code','r',encoding='utf-8') as f:
code = f.read()

pin_PIR = 17
pin_in = [pin_PIR]
pin_out = []
initGPIO(pin_in, pin_out)

picam2 = Camera()
piEmail = Email(subject, fromAddr, toAddr, code)

try:
while True:
if GPIO.input(pin_PIR):
print("Motion...")
time.sleep(1)
picam2.get_capture_file("alarm.jpg") # 拍摄照片并保存为 "alarm.jpg"
time.sleep(10)
piEmail.send_html("alarm.jpg")
finally:
GPIO.cleanup() # 清理释放GPIO资源,重置GPIO端口的状态

if __name__ == '__main__':
run()

utils.py

from picamera2 import Picamera2, Preview
from libcamera import Transform
import smtplib
from email.mime.image import MIMEImage
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
import RPi.GPIO as GPIO
from datetime import datetime


def initGPIO(pin_in, pin_out):
GPIO.setmode(GPIO.BCM)
for i in pin_in:
GPIO.setup(i, GPIO.IN)
for j in pin_out:
GPIO.setup(j, GPIO.OUT)


class Email:
def __init__(self, subject, fromAddr, toAddr, code):
self.subject = subject
self.fromAddr = fromAddr
self.toAddr = toAddr
self.code = code

# self.msg = MIMEMultipart()
# self.msg['Subject'] = subject
# self.msg['From'] = fromAddr
# self.msg['To'] = toAddr

def send_html(self, file):
msg = MIMEMultipart()
msg['Subject'] = self.subject
msg['From'] = self.fromAddr
msg['To'] = self.toAddr

fp= open(file,'rb')
img = MIMEImage(fp.read())
fp.close()

img.add_header('Content-ID', '<img>')
msg.attach(img)

content = """
<img src='cid:img'>
"""
html_img = MIMEText(content, 'html', 'utf-8')
msg.attach(html_img)


self.server = smtplib.SMTP_SSL('smtp.163.com',465)
self.server.login(self.fromAddr, self.code)
self.server.send_message(msg)
self.server.quit()

class Camera:
def __init__(self):
self.picam2 = Picamera2() # 创建一个 Picamera2 实例
transform=Transform(vflip=1) # 垂直反转
camera_config = self.picam2.create_preview_configuration(transform=transform) # 创建摄像头预览配置
self.picam2.configure(camera_config) # 配置摄像头
self.picam2.start() # 启动摄像头

def __del__(self):
self.picam2.stop()

def get_capture_file(self, file_name):
self.picam2.capture_file(file_name)

七、结束语

树莓派家庭安全系统搭建完成!!!