基于arduino的红外传感系统

一、作品背景
在这个科技飞速发展的时代,物联网已经成为了我们身边必不可少的技术模块,我这次课程设计做的是一个基于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发出和接收的数值看看是否一样,成功后,就可以通讯了。

六、结果

原文地址:https://www.cnblogs.com/jingxinbk/p/12409029.html

时间: 2024-07-31 16:53:16

基于arduino的红外传感系统的相关文章

基于Arduino的红外遥控

1.红外接收头介绍  一.什么是红外接收头?  红外遥控器发出的信号是一连串的二进制脉冲码.为了使其在无线传输过程中免受其他红外信号的干扰,通常都是先将其调制在特定的载波频率上,然后再经红外发射二极管发射出去,而红外线接收装置则要滤除其他杂波,叧接收该特定频率的信号并将其还原成二进制脉冲码,也就是解调. 二.工作原理  内置接收管将红外发射管发射出来癿光信号转换为微弱的电信号,此信号经由IC内部放大器进行放大,然后通过自动增益控制.带通滤波.解调变.波形整形后还原为遥控器发射出的原始编码,经由接

基于短消息的远程家电红外遥控系统

通过远程广域网控制家电设备是信息家电的主要发展方向之一.由于价格低廉.覆盖面广.使用方便等原因,短消息平台已经成为远程家电控制的重要方法. 本文研究和开发了一种基于短消息的远程红外遥控系统.该系统以Java语言应用程序作为客户控制终端,以短消息作为控制信号的传输平台,以家电常用的红外遥控器作为控制设备,形成了比较完备的远程家电控制系统原型. 本文首先分析了广域网传输技术.家电控制设备.客户控制终端等三个关键技术的选型问题,并据此提出了系统设计的总体结构. 随后,本文介绍了系统的硬件设计,着重讨论

分布式声波传感系统DAS

分布式声波传感系统请添加链接描述DAS产品介绍 1.分布式声传感(Distributed?Acoustic?Sensing,?DAS)技术: 利用相干瑞利散射光的相位而非光强来探测音频范围内的声音或振动等信号,?不仅可以利用相位幅值大小来提供声音或振动事件强度信息,还利用线性定量测量值来实现对声音或振动事件相位和频率信息的获取. DAS可以认为是一个移动干涉式声波传感器在传感光纤探测外界信号,当声音或振动引起该位置干涉光相位的线性变化,通过提取该位置不同时刻的干涉信号并解调,就可实现外界物理量的

基于Cobbler实现多版本系统批量部署

前言 运维自动化在生产环境中占据着举足轻重的地位,尤其是面对几百台,几千台甚至几万台的服务器时,仅仅是安装操作系统,如果不通过自动化来完成,根本是不可想象的.记得前面我们探究了基于PXE实现系统全自动安装,但PXE同时只能提供单一操作系统的批量部署,面对生产环境中不同服务器的需求,该如何实现批量部署多版本的操作系统呢?Cobbler便可以的满足这一实际需求,本文带来的是基于Cobbler实现多版本操作系统批量部署. Cobbler 简介 Cobbler是一款自动化操作系统部署的实现工具,由Pyt

RDIFramework.NET — 基于.NET的快速信息化系统开发框架 — 系列目录

RDIFramework.NET - 基于.NET的快速信息化系统开发框架 - 系列目录 RDIFramework.NET,基于.NET的快速信息化系统开发.整合框架,给用户和开发者最佳的.Net框架部署方案.  框架简单介绍 RDIFramework.NET,基于.NET的快速信息化系统开发.整合框架,为企业或个人在.NET环境下快速开发系统提供了强大的支持,开发人员不需要开发系统的基础功能和公共模块,框架自身提供了强大的函数库和开发包,开发人员只须集中精力专注于业务部分的开发,因此大大提高开

基于cobbler实现自动化安装系统

基于cobbler实现自动化安装系统 环境介绍 centos6.8 为centos6.8提供两块网卡 (非必要) 一块为桥接,方便xshell连接和测试 一块为vmnet3:用来搭建dhcp,tftp,和为客户端提供cobbler服务 前提,(确保安装TFTP,dhcp,rsync) # yum install httpd cobbler cobbler-web pykickstart debmirror 1.启动对应的服务 # service httpd start # service cob

Android弹幕实现:基于B站弹幕开源系统(4)-重构

?? Android弹幕实现:基于B站弹幕开源系统(4)-重构 弹幕在视频播放的APP中比较常见,但是逻辑比较复杂,现在在附录1,2,3的基础上,我再次对弹幕进行抽象和重构,把弹幕从底向上抽象成不同的层,便于复用. 第一步,抽象数据层.通常弹幕的来源是来源于后台的数据接口请求,在实时直播时候,是通过网络的轮询机制获取数据,那么,我把这部分代码抽出来设计成一个MGDanmakuHttpController,该类专注于数据的获取与分发: package zhangphil.danmaku; impo

Android弹幕实现:基于B站弹幕开源系统(1)

?? Android弹幕实现:基于B站弹幕开源系统(1) 如今的视频播放,流行在视频上飘弹幕.这里面做的相对比较成熟.稳定.使用量较多的弹幕系统,当推B站的弹幕系统,B站的弹幕系统已经作为开源项目在github上,其项目地址:https://github.com/Bilibili/DanmakuFlameMaster 以B站开源的弹幕项目为基础,现给出一个简单的例子,实现发送简单的文本弹幕.第一步,首先要在Android的build.gradle文件中引入B站的项目: repositories

基于arduino+web的物联网demo,web和微信控制

视频效果: 基于arduino+web的物联网demo,web和微信控制 基于arduino + web的物联网demo,实现了web和微信的多方式控制,折腾了好几周,终于完美解决了. 配件清单: Arduino uno3(主板) HLK-RM04(Uart串口转Wifi) 主板程序源码: String strs = ""; int led = 6; void setup() {    pinMode(led, OUTPUT);   Serial.begin(115200);//设置串