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

2 PIR motion sensors to detect human presence

当用户将双手放在 PIR 上时,我无法对 2 个 PIR 传感器的逻辑进行编程以在控制台中打印消息 sensors.I 已成功将 PIR 传感器连接到 raspberry pi 使用 GPIO、GND 和 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 模块何时发送电源。该引脚不断检查是否有任何更改,为此使用 while True 循环。这是一个无限循环,所以程序将 运行 连续,除非我们用 Ctrl + C 手动停止它。

然后使用两个布尔变量(True 或 False)表示 pin 的先前状态和当前状态,先前状态是循环前一次的当前状态。

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

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

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)。但思路应该是一样的。)

我没有检查语法错误的代码,目前无法访问 Pi,但这是我在此评论中所指的示例:

"Use RPi.GPIO's add_event_detect interrupt driven callbacks instead. Then you can eliminate the infinite loop entirely and let the script do other stuff while still reacting to the sensors. You can use the time difference between rising edges to define what "同时”对您意味着(例如,触发传感器 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)

我不完全确定它实际上是传递给回调的 pin 号(这就是为什么我也在回调中读取 pin 状态以确保)。如果您将 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"