树莓派入手已经有一段时间了,一直想折腾出一些名堂,于是在淘宝逛各种传感器找灵感,猛然间瞥见之前买手机配件赠送的USB接口LED灯,于是我计上心头,把它拆成了大概这个样子。
我想我大概可以做一个感应的小夜灯,正好我新租的房子客厅的灯开关在入户门处,晚上我们要去厕所就要摸黑过去,而狭窄的客厅障碍重重,略微有些危险,不小心撞到脚趾还是很痛的。说干就干,先采购设备。
预期设备:树莓派主机、人体红外传感器、LED灯珠。树莓派和LED灯珠已经有了,然后在淘宝买到了HC-SR501人体红外感应器。
传感器共有三个接口:VCC、GND及OUT,当有人进入感应范围时OUT输出高电平,当然OUT口加三级管等周围电路可以直接驱动LED发光,但我想把树莓派利用起来,所以用OUT够作为信号输出连接到树莓派,这里就需要了解树莓派的端口定义,定义如下图:
我用树莓派GPIO 14脚作为电源输出脚,直接连接到LED的正极上,负极接地。这样只要GPIO 14脚置高LED灯就可以亮。然后就是增加判定条件,得有人经过的时候才能亮灯,这是很就该红外感应器登场了,VCC接3.3V,GND接地,OUT口接GPIO 17脚,通过读取17脚的状态改变14脚输出,当有人出现在红外感应范围内时,OUT口会输出高电平,这时读取到GPIO 17为高电平时把GPIO 14脚也置为高电平以点亮LED。
逻辑上基本没有问题了,我这里用的是Python编写控制程序,Python有现成的GPIO库可以引用,大大减少了我们的工作量,说干就干,很快便搭建成功,这时发现整个系统略微有点Bug:不管白天晚上只要有人经过灯就会亮,这不符合设计初衷啊,白白浪费能源。后来研读HC-SR501的指导手册,发现模块有预留光敏电阻接口,而我买的一个ADC上也带光敏补偿但是我用不到,于是我就把光敏电阻拆下来焊到了红外传感器模块上,本指望能完美解决白天也亮灯的问题,万万没想到没起什么作用,折腾了一顿感觉整个逻辑都乱了,完全抓不到灯亮的规律,我估计光敏电阻坏掉了或者是型号不太对。一不做二不休,干脆直接买了一个光敏电阻模块。
模块有4个管脚,VCC接3.3V,GND接地,数字输出端口DO接到了GPIO 27脚,这样就要在程序里再增加一个判断,当光敏电阻感受不到光线时管脚输出高电平,也就是需要GPIO 27及GPIO 17均为高电平时GPIO 14输出高电平点亮LED。
程序部分如下,首先要给树莓派安装Python GPIO库
sudo apt-get -y python-pip
sudo pip install rpi.gpio
然后就可以直接引用该库了。
import RPi.GPIO as GPIO
import time
def init():
GPIO.setmode(GPIO.BCM)
GPIO.setup(14,GPIO.OUT)
GPIO.setup(17,GPIO.IN)
GPIO.setup(27,GPIO.IN)
def on():
GPIO.output(14, GPIO.HIGH)
def off():
GPIO.output(14, GPIO.LOW)
def is_open():
return GPIO.HIGH == GPIO.input(17)
def is_close():
return GPIO.LOW == GPIO.input(17)
def reshigh():
return GPIO.HIGH == GPIO.input(27)
def reslow():
return GPIO.LOW == GPIO.input(27)
def openLed():
init()
on()
def closeLed():
init()
off()
def clean():
GPIO.cleanup()
if __name__ == '__main__':
init()
while True:
if is_open() and reshigh():
on()
time.sleep(10)
else:
off()
time.sleep(0.5)
整体效果大概就是这样: