入室监控—树莓派上挂红外传感器(python)

入室监控概要:

  • 树莓派上挂一个红外传感器,探测是否有人进入
  • 有人进入,探测光强
  • 光强不够,控制继电器开灯,否则不开灯
  • 打开摄像机拍照,并使用ftp把数据发到后台FTP服务器上
  • 后台服务器跑web服务器,安卓APP接收

树莓派上挂一个红外传感器*

一个简单的被动式红外线传感器可以让你检测运动状态。这个传感器有三个引脚,可用于连接到Raspberry Pi的GPIO端。当该模块检测到运动状态时,其中一个引脚会输出高电压,输出电压大约为3.3V。如果持续检测到运动状态,那么该引脚的电压则保持该电压水平,直至检测不到运动状态时才会恢复为零。另两个引脚分别为5V和GND

红外传感器
入室监控—树莓派上挂红外传感器(python)_第1张图片
入室监控—树莓派上挂红外传感器(python)_第2张图片
对照前面的参数以及电路图,找到下面的左右针脚正负极,中间的PIN为感应输出,感应到人体时,输出3.3V高电平,检测不到信号时输出0。同时还要求工作电压在4.5V-20V之间。恰好树莓派的P1编号中第2,4号PIN都是5V的电压,满足要求,所以这次我们要接5V的电压。 参数调节旋钮是用来扭动控制一些参数的。比如探测的延时时间,灵敏度等等。具体可以参看 HC -SR501的说明书。这里我们都使用默认值。
入室监控—树莓派上挂红外传感器(python)_第3张图片
入室监控—树莓派上挂红外传感器(python)_第4张图片
但是有一个关键的L H模式调节阀门要介绍一下,右上角有三个针脚,按照我实物照片,假定从上到下为123还有一个黄色的套接头,图中套接头接通了2 3号,代表了H模式,这个套接头是可以拔下来的,然后插到上面来,接通1 2号,代表了L模式。 L模式是不可重复触发,当探测到一次人体时,输出一次高电平,保持一段时间恢复低电平,在此期间如果还是检测到了人体也不再延长这个高电平的时间。等到低电平的封锁时间(前面默认是2.5S)过了以后才又开始检测。H模式是可以重复触发,如果一直感应到人体时,会一直输出高电平,直到探测不到人体后保持小段时间然后恢复低电平

GPIO的上拉和下拉
当我们给一个针脚接入GND,那么就是低电平,如果我们给一个针脚3.3V,那么就是高电平,状态是很确定的。如果我们什么都不接,那么这个针脚处于悬浮状态,很容易受到外接的干扰,可能是高也可能是低,也可能是处于高和低之间的状态。这时候我们就要明确指定这个针脚应该处于高或者低,不能让他处于悬浮状态。接入一个上拉电阻能够让这个针脚处于明确的高电平状态,接入一个下拉电阻能够让他处于明确的低电平状态。前面我们用作输出的时候都是明确给定了输出的高低状态。关于上拉电阻和下拉电阻,有一篇英文解释写的很不错,我也是参考这篇来看的,里面的测试大家也可以用树莓派测试一下。(http://www.bit-101.com/blog/?p=3813)。
PIN3始终处于高电平状态是因为。这个PIN口是用于树莓派I2C设备的,内部外接了一个物理的上拉电阻。所以他的状态一直是高电平,作为INPUT不能使用这个PIN。
PIN22 时高时低就是由于处于悬浮状态。所以我们要使用这个PIN就比如为他明确指定悬浮的时候是高还是低。

接线
模块左边的针脚1接P1编号的PIN2 为5V的正极,模块右边的针脚3的负极接PIN6,模块中间的针脚2输出线接PIN22

检测代码:

import RPi.GPIO asGPIO
import time
 
#初始化
def init():
    GPIO.setwarnings(False)
    GPIO.setmode(GPIO.BOARD)
    GPIO.setup(12,GPIO.IN)
    GPIO.setup(21,GPIO.OUT)
    pass
 
#蜂鸣器鸣叫函数
def beep():
    while GPIO.input(12):
        GPIO.output(21,GPIO.LOW)
        time.sleep(0.5)
        GPIO.output(21,GPIO.HIGH)
        time.sleep(0.5)
#感应器侦测函数
def detct():
    #因为是仅仅试验,所以只让它循环运行100次
    for i in range(1,101):
        #如果感应器针脚输出为True,则打印信息并执行蜂鸣器函数
        if GPIO.input(12) == True:
            print "Someone isclosing!"
            beep()
        #否则将蜂鸣器的针脚电平设置为HIGH
        else:
            GPIO.output(21,GPIO.HIGH)
            print "Noanybody!"
        time.sleep(2)
 
time.sleep(5)
init()
detct()
#脚本运行完毕执行清理工作
GPIO.cleanup()

《RPi.GPIO模块函数说明:
RPi.GPIO.setmode(naming_system)
设置将GPIO针的命名方式。naming_system可用的取值有 RPi.GPIO.BCM 和 RPi.GPIO.BOARD,分别代表boardcom命名系统和树莓派板子上的命名系统。而因为使用BCM 的时候(据说)不同的版本BVM针脚定义不一样,所以同一套程序在多个树莓派系统上使用的时候建议用BOARD。

要检测哪个引脚编号系统已被设置模式(例如,由另一个Python模块配置过模式):
mode = GPIO.getmode()
模式将是GPIO.BOARD,GPIO.BCM或None

可能在Raspberry Pi的GPIO上有多个脚本/电路。因此,如果RPi.GPIO检测到引脚已被配置为默认(输入)以外的其他引脚,则在尝试配置脚本时会收到警告。要禁用这些警告:
GPIO.setwarnings(False)

RPi.GPIO.setup(channel, state)
将标号为channel的针设置为state模式。channel取值为1~26,state取值为RPi.GPIO.IN 或者RPi.GPIO.OUT,分别表示输入和输出。例如 RPi.GPIO.setup(1, RPi.GPIO.IN)表示将1号针设置为输入模式;RPi.GPIO.setup(3, RPi.GPIO.OUT)表示将3号针设置为输出模式。具体哪个号是哪根取决于setmode()中设置成什么。

RPi.GPIO.output(channel, state)
将标号为channel的针设置为state指定的电平。channel取值为1~26,state取值为RPi.GPIO.HIGH 和RPi.GPIO.LOW,或者1和0,或者True和False,表示高电平和低电平。例如RPi.GPIO.output(1, 1) 表示把1号针设置为高电平,RPi.GPIO.output(3, Flase) 表示将3号针设置为低电平。具体哪个号是哪根取决于setmode()中设置成什么。

RPi.GPIO.input(channel)
获取将标号为channel的针的电平砖头。channel取值为1~26。例如RPi.GPIO.input(1) 表示获取1号针的状态。

RPi.GPIO.cleanup()
清除掉之前RPi.GPIO.setup()设置的状态。退出程序之前一定要调用,否则下次调用的时候会报错。》

你可能感兴趣的:(入室监控—树莓派上挂红外传感器(python))