一、作品背景
在这个科技飞速发展的时代,物联网已经成为了我们身边必不可少的技术模块,我这次课程设计做的是一个基于arduino+树莓派+OneNet的红外报警系统,它主要通过识别人或者动物的运动来判断是否有人在附近再通过蜂鸣器的响叫来实现报警功能。
红外报警系统在生活中的应用也很广泛,例如博物馆的展品,家里的安防系统,公司的安防系统等,但是如何准确的报警,保证红外线的正确识别是这个系统的主要问题,本次的实践综合这些因素提出了比较靠谱的解决方案,用智能网关解决这一系列的问题。
二、元件原理
热释电红外传感器的主要材料,是钽酸锂(LiTao3)、硫酸三甘酞(LATGS)和钛锆酸铅(PZT)。它是在钛酸钡一类压电晶体上,上下表面设有电极,并在表面加有黑色膜。当有红外线间歇地照射时,其表面温度上升,使晶体内部的原子排列产生变化,即引起自发极化电荷。称此现象为热释电效应,为热电效应之一种。热释电效应产生的表面电荷是暂时的,只要它出现,便很快被空气中的各离子所中和。为此,用热释电效应制作红外传感器时,多是在它的元件前面加有机械式的周期遮光装置,以便使自发极化电荷周期性地出现,只有检测移动物体时不用。由于热释传感器的输出阻抗很大,输出电压信号又极微弱,故在传感器内部附加一只场效应管与一个薄膜电阻Rg,使其阻抗进行变换。Rs为负载电阻,有的热释传感器无Rs,需外接。为实现不同的检测目的,在进入红外线的窗口上设有滤光镜,将不需要的光谱滤掉。
作为人体检测的热释红外传感器,多是用双元件组成。双元件的特点一是当入射的能量顺序地射到两个元件时,由于两只元件为串联,其输出比一只元件高一倍;另是由于两只元件为逆向相连接,对于相同且同时输入的能量将相互抵消,如太阳光中的红外线干扰和环境温度变化所引起的误差等。防止外人人侵的热释电红外传感器应用电路,如当有人进入欲保护的视野范围内时,传感器即产生一交流感应电压,其频率与人体移动速度有关,通常在5~6Hz左右。它可控制10~12m的移动人体,其视野约70度 。
蜂鸣器的发声原理由振动装置和谐振装置组成,而蜂鸣器又分为无源他激型与有源自激型。
无源他激型蜂鸣器的工作发声原理是:方波信号输入谐振装置转换为声音信号输出。
有源自激型蜂鸣器的工作发声原理是:直流电源输入经过振荡系统的放大取样电路在谐振装置作用下产生声音信号。
三、解决方案
在前面我们了解到红外线报警系统要想成功就得让他对正确的事情进行报警和反馈,那么我就依据这个给定一个合理的解决方案。
因为我们这个系统主要是用于防范错误的人对自己的财产造成威胁,那么我们的红外线报警器的报警模式就是基于是否有人靠近来报警,因为红外报警器分为主动式和被动式两种。主动式红外报警器,是报警器主动发出红外线报警器,是报警器主动发出红外线,红外线碰到障碍物,就会反弹回来,被报警器探头接受如果探头监测到,红外线是静止不动的,也就是不断发出红外线又不断反弹的,那么报警器就不会报警。当有会动的物体触犯了这根看不到的红线的时候,探头就会监测到异样,就会报警。
在家中没有人的情况下,我们选择了被动式的报警模式,也就是监测是否在无人的情况下有人靠近你所需要保护的对象,这样就可以有效的报警并且确保报警的准确性。
四、红外报警系统原理构架
在我看来红外线报警系统分为三个部分:arduino+树莓派;树莓派+OneNet;arduino+树莓派+OneNet;
1、arduino+树莓派
我们要想把arduino和树莓派相连我们就得知道它们是靠什么通信的,前面说过arduino和树莓派的连接方式有两种USB和GPIO引脚,我们主要用的是USB连接,结构是示意图如下图所示:
2、树莓派+OneNet
第二步就是把树莓派和OneNet连接在一起,树莓派相当于一个Linux的系统,在这个系统上代有python的IDE环境(当然你也可以用c#或者java,这里我们主要说python),我们需要在编写一个python的函数来连接云和树莓派,在OneNet的众多协议中,我采用了http协议,虽然这个协议不如其他协议功能那么多,但是对于初学着来说却是很友好,使用http的全局推送连接OneNet连接示意图,如下所示:
3、arduino+树莓派+OneNet
最后就是需要把三个东西都连接起来,要想把arduino的数据传输到OneNet上就是把arduino的串口状态发送到OneNet上,我们已经知道了树莓派是如何收到串口,我们现在需要把这个数据打包发送给OneNet,接下来我们通过这要的原理来完成我们红外线系统的结构示意图:
如上图所示这是三个模块的设备连接图,但是它们的原理是红外线采集到信息后发送状态给arduino,状态正确蜂鸣器发出声音,arduino再把接收到的状态通过串口发送给树莓派,树莓派接收到消息后,把其用字符串的形式发送给OneNet,原理图如下所示:
五、实验设计
1、Arduino模块设计
Arduino模块相比较与其他模块来说不必要考虑连接问题,我们只需要把代码烧入到Aduino中就可以了,因为烧入到arduino的代码在其通电后可以自己运行,我们只需要让它发送串口方便以后读取数据就行。
代码如下:
int PIR_sensor = A5;
int Buzzerpin = 3;
int val = 100;
void Alarm() //蜂鸣器警报
{
for(int i=0;i<100;i++){
digitalWrite(Buzzerpin,HIGH); //发声
delay(2);
digitalWrite(Buzzerpin,LOW); //不发声
delay(2);
//修改延时时间,改变发声频率
}
}
void setup(){
pinMode(PIR_sensor,INPUT); //设置人体红外接口为输入状态
pinMode(Buzzerpin,OUTPUT); //设置蜂鸣器接口为输出状态
Serial.begin(9600);
}
void loop(){
int val=digitalRead(PIR_sensor); //定义参数存储人体红外传感器读到的状态
//Serial.print("someone is coming:");
if(val==1)
val=101;
else
val=100;
Serial.println(val);
delay(500);
if(val == 101) //如果检测到运动,发出警报
{
Alarm();
}
else {
return;
}
delay(100);
}
2、树莓派模块设计
对于树莓派模块的设计,我们需要了解到树莓派靠什么读取到arduino发送的信息,我们这里了解到一个pyserial库和一个serial.red()函数,其中Serial库是一个串口通信专用的模块,它可以读取串口中的信息并打印,串口通信是指外设和计算机间,通过数据信号线 、地线、控制线等,按位进行传输数据的一种通讯方式。这种通信方式使用的数据线少,在远距离通信中可以节约通信成本,但其传输速度比并行传输低。串口是计算机上一种非常通用的设备通信协议。pyserial模块封装了python对串口的访问,为多平台的使用提供了统一的接口。其中serial.red()是读取这个串口信息的函数。
树莓派代如下:
python代码如下(连接OneNET):
import datetime
import json
import time
import requests
import serial
APIKEY = 'IvjydOIULd13LSCsO4By069pt=Y='
apiurl = 'http://api.heclouds.com/devices/579157258/datapoints'
apiheaders = {'api-key': APIKEY, 'Content-Length': '120'}
def get_input():
port="COM3"
serialFromArduino=serial.Serial(port,9600,timeout=1)
serialFromArduino.flushInput()
while True:
if (serialFromArduino.inWaiting() > 0):
input = serialFromArduino.read(1)
print((input).decode('UTF-8'))
return input
def http_put():
Infrared = int(get_input())
#temperature = get_input()
#temperature = random.randint(60,100)
CurTime = datetime.datetime.now()
payload = {'datastreams': [{"id": "girlA", "datapoints": [{"at": CurTime.isoformat(), "value":Infrared}]}]}
# payload = {"datastreams": [{"id": "girlA", "datapoints": [{"value": 11}]}]}
print("当前时间为: %s" % CurTime.isoformat())
print("上传值为: %.3f" % Infrared)
jdata = json.dumps(payload) # 对数据进行JSON格式化编码
# 打印json内容
print(jdata)
r = requests.post(apiurl, headers=apiheaders, data=json.dumps(payload))
return r
while True:
time.sleep(2)
resp = http_put()
print("OneNET请求结果:\n %s" % resp)
3、OneNET模块
在这个模块中我们需要知道,树莓派和onenet是如何相连的,查阅开发者文档,我用http全局推送,把树莓派从arduino中得到的串口数据发送到OneNet上,既然要读串口,发送消息,那么我们就得先定义库函数,在OneNet中把消息发送得用requests,打印则用json。头文件定义如下图所示:
Requests是用Python语言编写的,基urllib3来改写的,采用Apache2 Licensed 来源协议的HTTP库,它比urllib更加方便,可以节约我们大量的工作,完全满足HTTP测试需求,一句话---Python实现的简单易用的HTTP库。
在百度词条中,JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式。它基于 ECMAScript (欧洲计算机协会制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。实际上 json的格式和 python中的字典很像,也是由键值对组成,但是 python中的值可以为任何对象(列表、字典、字符串、数字等等),而 json中的值只能是数组(列表)、字典、字符串、数组、布尔值中的一中或几种。
平台以HTTP POST请求形式向第三方平台URL地址推送数据,第三方平台接收到数据后需要返回 HTTP 200,否则OneNET会认为此次推送无效并重试,json库一共有三个方法,分别是 dump、dumps、load、loads。其中 dump和 dumps是用来把把字典和数组转换为 json格式的,dump把转换结果直接写入文件,dumps返回字符串。load和 loads是把 json格式的数据转换为字典格式,load直接从 json文件中读取数据并返回字典对象,loads把字符串形式的 json数据转换成字典格式。
用JSON打印的时候会用到dump和dumps,那么他们两个有什么区别呢?查阅资料我知道了,dump的函数原型是 dump(obj, fp) 第一个参数 obj是要转换的对象,第二个参数 fp是要写入数据的文件对象。dumps的函数原型是 dumps(obj) 参数是要转换的对象。(如果要转换的对象里有中文字符的话,要把 ensure_ascii设置为 False否则中文会被编码为 ascii格式)下面是json打印内容的函数:
在树莓派连接OneNet中,最重要的还是apikey和设备的url,这两个是设备连接上OneNet的必要条件,在pythone中,我们可以直接把apikey和url赋值给一个函数,然后再把接受到的数据发送给url,通过得到的apikey进入设备,APIkey主要用于API调用时的鉴权参数,key如下分为两种:
Master-APIkey:产品下唯一的管理员权限的APIKey,具有管理产品下所有设备的权限
Device-APIkey:设备级APIkey,具备与之关联的所有设备的访问权限
URL是英语Uniform Resource Locator的简称,中文统一资源定位符的意思。是对可以从互联网上得到的资源位置和访问方法的一种简洁表示,是互联网上标准资源的地址。互联网上的每个文件都有一个唯一的URL,它包含的信息指出文件的位置以及浏览器应该怎么处理它。可以分为绝对URL和相对URL 。
(1)绝对URL:显示文件的完整路径,这意味着绝对URL本身所在的位置与被引用的实际文件的位置无关。
(2)相对URL :以包含URL本身的文件夹的位置为参考点,描述目标文件夹的位置。
还有一个知识点就是token,在OneNet的全局推送中,云平台上可以添加全局推送,在此时你就可以看到token的出现,而且token也是双方连通的一个认证,如下图所示:
那么token是什么呢,token是一种令牌,令牌是一种能够控制站点占有媒体的特殊帧,以区别数据帧及其他控制帧。token其实说的更通俗点可以叫暗号,在一些数据传输之前,要先进行暗号的核对,不同的暗号被授权不同的数据操作。基于 Token 的身份验证方法
使用基于 Token 的身份验证方法,在服务端不需要存储用户的登录记录。大概的流程是这样的:
1.客户端使用用户名跟密码请求登录
2.服务端收到请求,去验证用户名与密码
3.验证成功后,服务端会签发一个 Token,再把这个 Token 发送给客户端
4.客户端收到 Token 以后可以把它存储起来,比如放在 Cookie 里或者 Local Storage 里
5.客户端每次向服务端请求资源的时候需要带着服务端签发的 Token
6.服务端收到请求,然后去验证客户端请求里面带着的 Token,如果验证成功,就向客户端返回请求的数据。
Token在OneNet中也可以起到调试作用,看看端口是否连通。当一切都连通的时候我们就可以通过串口和OneNet发出和接收的数值看看是否一样,成功后,就可以通讯了。
六、结果