本科毕业设计,当时利用Raspberry Pi做的家庭监控系统,其中用了Python中的Flask框架。当时只是想把底层到Web的一条技术栈打通,就做了这么个东东,写个简单的小教程吧
项目地址:
https://github.com/avalonLZ/Flash_HomeMonitorSys
实物图:
登录界面及控制界面:
硬件开发环境:
Raspberry Pi + usb免驱摄像头 + usb免驱无线网卡(Pi 3中集成了无线网卡) + 两个LED灯 + DHT11温湿度传感器 + ULN2003步进电机驱动板 + 一个步进电机 + USB-TTL串口调试工具(非必须)
软件开发环境:
Debain系统 + motion开源库 + fswebcam抓图软件 + Flask框架
硬件连接示意图
按照以上硬件连接示意图将硬件设备接入树莓派,接下来就可以进行软件开发平台的搭建工作。
软件开发平台的搭建
1、首先是Debain系统的安装:
Raspberry Pi的Bootloader首先访问的是GPU内的Flash区域,Raspberry Pi出厂时将挂载TF卡的程序烧写进GPU的Flash中,所以想要让Raspberry Pi运行Debian Linux操作系统就需先将Debian烧写入TF卡中。此处建议使用Class10 TF卡,因为Class10相对读写速度较快,有利于程序在Raspberry Pi上的运行。
本次开发使用Win32diskimager对从Raspberry Pi官网下在的Debian系统进行TF卡烧写,本设计使用的是内核版本为4.1.13的Debian系统。烧写完成后将TF卡插入Raspberry Pi底部的MicroSD卡槽,启动Raspberry Pi。
2、利用USB-TTL串口调试工具进行开发(可以用SSH通讯代替,第三版的树莓串口和蓝牙的固件有冲突,所以不可用串口调试工具)
USB-TTL CH340串口调试工具和树莓连接图:
在开发计算机上下载Putty软件。将CH340模块插入电脑USB口,安装驱动程序。
打开Putty软件,在Connection type选项中选择Serial(串口模式),在Serial line文本框中修改COM口,修改为设备管理器中所显示COM口。在Speed文本框中输入通讯波特率115200。点击Putty右下角的Open开始通讯并将Raspberry Pi上电。等待树莓启动后,在Raspberrypi login:的光标后输入默认用户名pi并回车输入密码raspberry。之后便成功登入了系统。
3、WiFi模块的配置
接下来配置Raspberry Pi的WiFi模块。将WiFi模块插入USB口,在CLI界面输入命令:lsusb,出现所有采用USB协议通讯的设备。找到RTL8188CUS 802.11n WLAN Adapter设备,说明此时WiFi模块已被正确识别。接下来输入sudo iwlist wlan0 scan命令,将会列出附近所有WiFi信号的详细信息。在各个信号的SSID中找到家庭网络所命名的SSID,本次开发使用SSID为lz1。在确定可以检测到家庭网络后输入wpa_passphrase lz1(SSID用户名) 581218147(密码)并回车。出现下回显信息:
network={
ssid="lz1"
#psk="581218147"
psk=4690a5c5b75c028fc5e3ba2eed03c0b93a06121b27bda85ff510a308e03ce5ea
}
将此段信息复制并保存到/etc/wpa_supplicant/wpa_supplicant.conf文件内即在CLI界面输入sudo nano /etc/wpa_supplicant/wpa_supplicant.conf命令。保存退出后再输入sudo nano /etc/network/interfaces命令,进入interfaces文件内进行WiFi配置。在文件内用“#”注释其他配置信息并输入以下配置命令:
auto lo
iface lo inet loopback
iface eth0 inet dhcp
auto wlan0
allow-hotplug wlan0
iface wlan0 inet static
wpa-ssid “lz1”
wpa-psk “581218147”
address 192.168.191.2
保存退出后,在CLI界面先后分别输入sudo ifdown wlan0和sudo ifup wlan0命令重启wlan0,之后在输入ifconfig命令,出现wlan0 WiFi连接的详细信息:
wlan0 Link encap:Ethernet HWaddr e8:4e:06:26:e2:15
inet addr:192.168.191.2 Bcast:192.168.191.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:25 errors:0 dropped:11 overruns:0 frame:0
TX packets:8 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:3883 (3.7 KiB) TX bytes:872 (872.0 B)
可以看到此时设备已经正确获取了设置IP,至此WiFi模块配置完成。
4、Flask框架的安装
WiFi配置完成便可以访问到互联网。可以开始Flask平台的搭建,首先需要安装Python2.7版本,因为此Raspberry Pi下的Debian Linux操作系统自带了Python2.7版本,所以直接进行pip命令的安装。使用sudo apt-get install python-pip命令直接下载安装pip即可。安装完成后可以使用pip –help命令查看是否成功安装,若成功安装便会在窗口显示“Usage: pip COMMAND [OPTIONS]”等说明帮助。之后使用pip对flask进行安装。执行sudo pip install flask命令。窗口出现“Successfully installed flask Werkzeug Jinja2 itsdangerous MarkupSafe”字样说明已经成功安装Flask,可以写一个.py文件进行简单测试。执行cd /home/pi/Desktop命令进入桌面,使用mkdir test命令新建一个test文件夹并进入。使用sudo nano test.py命令并在其中输入以下代码:
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello World!'
if __name__ == '__main__':
app.run("192.168.191.2")
如此创建一个简单的Flask工程,测试Flask环境是否已经搭建完成。在同一网段终端设备的浏览器地址栏输入http://192.168.191.2:5000/并回车,出现下图所示画面则说明Flask应用框架开发平台搭建完成。
接下来开始使用摄像头部分的环境搭建。首先将USB摄像头接入Raspberry Pi的USB口,输入lsusb命令,回显出现Z-Star Microelectronics Corp. Venus USB2.0 Camera字样,则说明系统可以识别出该USB摄像头。再输入ls /dev/vid*查看是否有对应驱动程序,当回显/dev/video0时说明Linux已经有了USB摄像头的驱动程序。接下来便可以开始开源软件Motion的安装以及配置工作。
5、Motion的安装及其配置
在CLI中输入sudo apt-get install motion安装Motion,安装完成后输入sudo nano /etc/default/motion在该文件内,将start_motion_daemon=no,改为start_motion_daemon=yes表示允许后台运行,保存并退出。之后进入sudo nano /etc/motion/motion.conf 进行Motion的详细配置。在此次开发中配置如下:
daemon off #关闭Motion的守护进程(后台运行)功能。
videodevice /dev/video0 #使用video0库驱动摄像头。
# Values :
# V4L2_PIX_FMT_SN9C10X : 0 'S910'
# V4L2_PIX_FMT_SBGGR8 : 1 'BA81'
# V4L2_PIX_FMT_MJPEG : 2 'MJPEG'
# V4L2_PIX_FMT_JPEG : 3 'JPEG'
# V4L2_PIX_FMT_RGB24 : 4 'RGB3'
# V4L2_PIX_FMT_UYVY : 5 'UYVY'
# V4L2_PIX_FMT_YUYV : 6 'YUYV'
# V4L2_PIX_FMT_YUV422P : 7 '422P'
# V4L2_PIX_FMT_YUV420 : 8 'YU12'
v4l2_palette 5 #选择摄像头的采样模式,这个选项是根据摄像头自身所支持的采样模式来选择的,此次开发使用的USB摄像头支持UYVY模式所以选择5。
width 176 #图像宽度,受带宽影响为了图像传输顺畅暂时设置为176。
height 144 #图像高度,受带宽影响为了图像传输顺畅暂时设置为144。
framerate 10 # framerate为1秒帧率默认为2,最高100也就是一秒拍摄传输2张图像,经过比较测试发现此参数设置为10可以基本符合要求。
output_all off #不保存拍摄到的图像。
output_normal on #保存检测到运动物体时的图像。
ffmpeg_cap_new off #检测到运动物体时不进行摄像。
locate off #关闭本地查看功能。
target_dir /home/lz/motion-images #设置照片存放路径,需要将此路径设置成最低权限。
; thread /usr/local/etc/thread1.conf
#; thread /usr/local/etc/thread2.conf
#; thread /usr/local/etc/thread3.conf
#; thread /usr/local/etc/thread4.conf #以上四条设置是否开启多个摄像头采集画面,由于本次设计只采用一个摄像头,所以只启用了一条配置线程。其他的配置选项都可以按Motion的默认参数来配置。最后保存并退出配置文件,执行update-rc.d -f motion remove命令删除Motion开启启动项。
以上所配置的只是Motion众多配置中的冰山一角,Motion还支持很多强大的功能,如有需要还可以随时进行更改。至此,完成了Motion的配置,下面进行简单测试。退出配置文件后在终端窗口中输入sudo service motion start命令启动Motion,之后通过同一网段终端浏览器访问Raspberry Pi的8081端口,出现下图所示画面则说明配置成功,可以进行下一步开发。
6、外围模块设计-DHT11
根据DHT11的DataSheet编写相应的Python程序对模块进行驱动,具体实现函数见:
https://github.com/avalonLZ/Project/tree/master/Python/Python_Flask/Flask_HomeMonitorSystem-master/dht11.py
7、外围模块设计-驱动步进电机
在步进电机的驱动方面,是采用UNL2003高耐压、大电流复合晶体管阵列对28BYJ-48五线四相步进电机进行驱动。06号GPIO口作为INT1口的输入,13号GPIO口作为INT2的输入,19号GPIO口作为INT3的输入26号GPIO口作为INT4的输入。暂时使用了单四拍设计。具体实现函数见:
https://github.com/avalonLZ/Project/tree/master/Python/Python_Flask/Flask_HomeMonitorSystem-master/motor.py
8、Web前端设计
Web界面当时做的比较随意,并没有花很多时间去深入学习各种前端技术,简单的做了几个界面,Html及CSS见:
https://github.com/avalonLZ/Project/tree/master/Python/Python_Flask/Flask_HomeMonitorSystem-master/templates
9、用Flask框架实现后台逻辑
后台逻辑主要使用了Flask框架来实现,在HTTP协议中浏览器请求主要分为GET和POST请求两种类型。简单来说GET方式是从服务器中获取数据,而POST方式则是提交数据到服务器。本次后台设计也就主要以这两种请求方式分别设计实现函数。具体Python代码见:
https://github.com/avalonLZ/Project/tree/master/Python/Python_Flask/Flask_HomeMonitorSystem-master/app.py
至此整个家庭监控系统就搭建完成了,在Flask项目所在文件夹下使用sudo python app.py命令即可运行查看效果了,最后还可以将这个命令添加到Linux下的自启动脚本中,这样每当树莓派启动就会启动这个监控系统,同一网段的终端就可以通过浏览器对设备所处环境进行视频监控了(不过这视频流走的是MJPEG格式,如果是WiFi建立的局域网还是会存在1-2秒的延迟)。