首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >2个PIR运动传感器检测人体存在

2个PIR运动传感器检测人体存在
EN

Stack Overflow用户
提问于 2016-04-23 13:35:39
回答 2查看 1.3K关注 0票数 0

当用户将双手放在PIR传感器上时,我很难编程两个PIR传感器在控制台中打印消息的逻辑。我已经成功地使用GPIO、GND和5v端口将PIR传感器连接到raspberry pi上。我目前拥有的代码确实会在控制台中打印出一条消息,每当有人在控制台上挥手时,我就会碰到一个消息,但是当有人在两个PIR传感器上挥手时,我很难修改代码以打印出错误消息。

http://i.imgur.com/IpJYwE6.png

我们可以使用GP4和GP17从传感器读取输入。

代码语言:javascript
复制
import RPi.GPIO as GPIO
import time

sensor = 4
sensor2 = 17
GPIO.setmode(GPIO.BCM)
GPIO.setup(sensor, GPIO.IN, GPIO.PUD_DOWN)

previous_state = False
current_state = False

while True:
    time.sleep(0.1)
    previous_state = current_state
    current_state = GPIO.input(sensor)
    if current_state(TRUE) != previous_state(FALSE):
        new_state = "HIGH" if current_state else "LOW"
        print("GPIO pin %s is %s" % (sensor, new_state))

这个程序很简单。Raspberry Pi GPIO引脚允许我们使用pin 4作为输入,然后它可以检测PIR模块何时发送电源。引脚不断地检查是否有任何更改,为此使用了一个while True循环。这是一个无限循环,所以程序将持续运行,除非我们用Ctrl + C手动停止它。

然后对引脚的前一个和当前状态使用两个布尔变量(真或假),前一个状态是当前状态在循环中的前一次状态。

在循环中,我们将以前的状态与当前的状态进行比较,以检测它们何时不同。如果没有变化,我们不想继续显示消息。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-04-23 14:24:10

目前,我还没有检查代码的语法错误,也没有访问Pi,但这是我在评论中提到的一个例子:

使用RPi.GPIO的add_event_detect中断驱动回调。然后您可以完全消除无限循环,让脚本在仍然对传感器作出反应的同时执行其他操作。您可以使用上升边缘之间的时间差来定义“同时”对您意味着什么(例如,传感器1和传感器2之间的最大差为1秒)。

代码语言:javascript
复制
import RPi.GPIO as GPIO
import time

GPIO.setmode(GPIO.BCM)
GPIO.setup(17, GPIO.IN, GPIO.PUD_DOWN)
GPIO.setup(4, GPIO.IN, GPIO.PUD_DOWN)

pir1_last = pir2_last = time.time()

def callback_func(pin):
    global pir1_last
    global pir2_last
    t_now = time.time()

    if GPIO.input(17):
        pir1_last = t_now
    if GPIO.input(4):
        pir2_last = t_now

    t_diff = abs(pir1_last - pir2_last)
    if t_diff < 0.5:
        print "it's been less than 0.5 seconds since both PIRs were activated"

# change GPIO.RISING to GPIO.FALIING if your PIRs are active low 
GPIO.add_event_detect(17, GPIO.RISING, callback=callback_func)
GPIO.add_event_detect(4, GPIO.RISING, callback=callback_func)

def main():
    while True:
        print "Not blocking! You're free to do other stuff here"
        time.sleep(10)

我不能完全确定它是否是传递给回调的引号(这就是为什么我也在读取回调中的引脚状态以确保)。如果将print(pin)添加到回调函数并打印一个引脚号,则没有理由进行读取,可以用以下方式替换回调:

代码语言:javascript
复制
def callback_func(pin):
    global pir1_last
    global pir2_last
    t_now = time.time()

    if pin == 17:
        pir1_last = t_now
    if pin == 4:
        pir2_last = t_now

    t_diff = abs(pir1_last - pir2_last)
    if t_diff < 0.5:
        print "it's been less than 0.5 seconds since both PIRs were activated"
票数 0
EN

Stack Overflow用户

发布于 2016-04-23 13:47:16

例如,为第二个传感器定义第二组状态变量。

代码语言:javascript
复制
previous_state_sensor2 = False
current_state_sensor2 = False

和第一个感应器完全一样。然后添加如下的if条件:

代码语言:javascript
复制
if (current_state(TRUE) and current_state_sensor2(TRUE)) and
   (previous_state(FALSE) or previous_state_sensor2(FALSE)):
    print "both sensors detected something"

(我不确定确切的语法,因为我不熟悉这种计算布尔值的方法:current_state(TRUE)。但这个想法应该是一样的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36811537

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档