首页
社区
课程
招聘
[原创]初玩树莓派B 6人体红外感应报警
2016-9-26 22:13 13421

[原创]初玩树莓派B 6人体红外感应报警

2016-9-26 22:13
13421
初玩树莓派 B 6人体红外感应报警

bbs.pediy.com

        前面的LED灯我们操作使用的GPIO的输出功能,这次我们终于需要用到GPIO的输入功能了。由于这个人体红外感应模块的使用比较简单。所以我们实验完毕以后配合前面的蜂鸣器一起,做一个简单的人体感应报警器。

1 HC-SR501 感应模块简介
我们采用 HC-SR501型号的人体红外感应器来探测人体。更加详细的参数参考模块的使用说明书。








        对照前面的参数以及电路图,找到下面的左右针脚正负极,中间的PIN为感应输出,感应到人体时,输出3.3V高电平,检测不到信号时输出0。同时还要求工作电压在4.5V-20V之间。恰好树莓派的P1编号中第2,4号PIN都是5V的电压,满足要求,所以这次我们要接5V的电压。

        参数调节旋钮是用来扭动控制一些参数的。比如探测的延时时间,灵敏度等等。具体可以参看 HC -SR501的说明书。这里我们都使用默认值。

        但是有一个关键的L H模式调节阀门要介绍一下,右上角有三个针脚,按照我实物照片,假定从上到下为123 。还有一个黄色的套接头,图中套接头接通了2 3号,代表了H模式,这个套接头是可以拔下来的,然后插到上面来,接通1 2号,代表了L模式。
        L模式是不可重复触发,当探测到一次人体时,输出一次高电平,保持一段时间恢复低电平,在此期间如果还是检测到了人体也不再延长这个高电平的时间。等到低电平的封锁时间(前面默认是2.5S)过了以后才又开始检测。
        H模式是可以重复触发,如果一直感应到人体时,会一直输出高电平,直到探测不到人体后保持小段时间然后恢复低电平。

2 GPIO输入的上拉和下拉

        对于学习软件的人来说,软件的世界只有0和1,所以我接触硬件之前也是这么认为的。所以我在使用人体红外感应的时候遇到了一个问题,我认为只要设置GPIO的模式为INPUT,后面只需要读取针脚的状态0,1就行了。结果我遇到一个问题。当我在设置比如pin22(wiringpi标号为6)为INPUT模式,接上一根线后,这一条线另一端什么都不接,按理说这时应该输入为0V,但是我尝试读取发现并不是一直保持低电平,而是一会儿高,一会低,用手握住另外一端就会输出高电平。当我接pin3(wiringPi 标号为8)却始终是高电平。不得不查询各种资料,发现还有上拉和下拉这种说法。
        当我们给一个针脚接入GND,那么就是低电平,如果我们给一个针脚3.3V,那么就是高电平,状态是很确定的。如果我们什么都不接,那么这个针脚处于悬浮状态,很容易受到外接的干扰,可能是高也可能是低,也可能是处于高和低之间的状态。这时候我们就要明确指定这个针脚应该处于高或者低,不能让他处于悬浮状态。接入一个上拉电阻能够让这个针脚处于明确的高电平状态,接入一个下拉电阻能够让他处于明确的低电平状态。前面我们用作输出的时候都是明确给定了输出的高低状态。关于上拉电阻和下拉电阻,有一篇英文解释写的很不错,我也是参考这篇来看的,里面的测试大家也可以用树莓派测试一下。(http://www.bit-101.com/blog/?p=3813)。
        PIN3始终处于高电平状态是因为。这个PIN口是用于树莓派I2C设备的,内部外接了一个物理的上拉电阻。所以他的状态一直是高电平,作为INPUT不能使用这个PIN。
        PIN22 时高时低就是由于处于悬浮状态。所以我们要使用这个PIN就比如为他明确指定悬浮的时候是高还是低。wiringpi通过pullUpDnControl来控制这个变量。

3接线以及测试
        模块左边的针脚1接P1编号的PIN2 为5V的正极,模块右边的针脚3的负极接PIN6,模块中间的针脚2输出线接PIN22(wiringPi就是标号6)。

接线图如下:

图中我连蜂鸣器也接上去了。当我们检测到人体的时候。使用前一节的beep函数发出警告声音。

我们先初步检测一下模块有没有工作正常。测试HC-SR501不同的模式。

选择的H模式,套接头接下面两个脚。也就是可以重复触发,检测到人体,一直处于高电平。


可以看出中间是连续的检测,也就是高电平的时间随着人的活动延长了。

       
如果选择的L模式,套接头接上面两个脚。也就是不可以重复触发,检测到人体,输出高电平一段时间,后续一小段时间内检测到也不再延长这个高电平时间,必须等到锁定时间过了才会再次检测。

可以看出中间高电平的时间不是持续的。

检测的代码很简单:

#include <wiringPi.h> 
#include <unistd.h> 
#include <stdbool.h> 
#include <stdio.h> 


#define INFRAREDPIN 6 
int main() 
{ 
 int AnyBodyHere=0; 
 wiringPiSetup(); 
//设置为输入模式
 pinMode(INFRAREDPIN,INPUT); 
 //很重要。控制默认情况下此PIN处于下拉低电平状态
 pullUpDnControl(INFRAREDPIN,PUD_DOWN); 
 while(true) 
 { 
  //每一秒检测依次状态
  delay(1000); 
  //读取当前pin的输入状态
  AnyBodyHere=digitalRead(INFRAREDPIN); 
  if(AnyBodyHere) 
  { 
     printf("There is somebody here\n"); 
  } 
  else 
  { 
     printf("There is no one here\n"); 
  } 
 
 } 
 
}


我们稍微修改一下。在检测到人体的时候使用第五节的beep函数执行报警的操作,这里我们选择使用H模式,持续感应,感应到以后使用beep发声。这样就简单实现了人体感应后自动报警。
具体代码下载infrared.c参考。

[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

上传的附件:
收藏
免费 3
打赏
分享
最新回复 (3)
雪    币: 35386
活跃值: (19270)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
kanxue 8 2016-9-27 20:51
2
0
辛苦了,这文章明天公众号转发
雪    币: 5372
活跃值: (1912)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
wanttobeno 2016-9-28 08:33
3
0
感谢分享!默默想起了大学的单片机
雪    币: 0
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
ighack 2017-4-24 11:59
4
0
pullUpDnControl(INFRAREDPIN,PUD_DOWN); 
python里是怎么写啊
游客
登录 | 注册 方可回帖
返回