2个PIR运动传感器,用于检测人体存在

时间:2016-04-23 13:35:39

标签: python sensor raspberry-pi2

当用户将双手放在PIR传感器上时,我无法编程2个PIR传感器的逻辑来在控制台中打印消息。我已经设法使用GPIO,GND和成功将PIR传感器连接到树莓派中。 5v端口。我当前拥有的代码会在控制台中打印出一条消息,只要有人在那里挥手,但是当有人在PIR传感器上挥手时,我很难修改代码以打印出错误信息。

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

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

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引脚允许我们使用引脚4作为输入;然后它可以检测PIR模块何时发送电力。该引脚不断检查是否有任何更改,使用一段时间的True循环。这是一个无限循环,因此程序将连续运行,除非我们使用Ctrl + C手动停止它。

然后对引脚的前一个和当前状态使用两个布尔变量(True或False),前一个状态是当前状态是循环前一个时间。

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

2 个答案:

答案 0 :(得分:0)

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

previous_state_sensor2 = False
current_state_sensor2 = False

并将它们设置为与第一个传感器完全相同。 然后你添加一个像这样的if条件:

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)。但这个想法应该是相同的。)

答案 1 :(得分:0)

我没有检查代码是否存在语法错误,目前无法访问Pi,但这是我在本评论中提到的一个示例:

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

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)添加到回调函数并打印一个密码,则没有理由进行读取,您可以用这个替换回调:

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"