基于Raspberry Pi 3的自动感应小夜灯

树莓派入手已经有一段时间了,一直想折腾出一些名堂,于是在淘宝逛各种传感器找灵感,猛然间瞥见之前买手机配件赠送的USB接口LED灯,于是我计上心头。

Angus

喜欢

4945
浏览
2
喜欢

> 更多图片

项目状态:已完成
开放度:公开
所属分类:电子
发布时间:2017-09-08
最近更新:2017-09-08

描述

淘宝买了一堆传感器,就是为了能把废弃的LED灯用上


详细说明

树莓派入手已经有一段时间了,一直想折腾出一些名堂,于是在淘宝逛各种传感器找灵感,猛然间瞥见之前买手机配件赠送的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)

整体效果大概就是这样:

链接表
  • http://www.angusfan.com/2017/03/31/autonightlight/