当用户将双手放在PIR传感器上时,我很难编程两个PIR传感器在控制台中打印消息的逻辑。我已经成功地使用GPIO、GND和5v端口将PIR传感器连接到raspberry pi上。我目前拥有的代码确实会在控制台中打印出一条消息,每当有人在控制台上挥手时,我就会碰到一个消息,但是当有人在两个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引脚允许我们使用pin 4作为输入,然后它可以检测PIR模块何时发送电源。引脚不断地检查是否有任何更改,为此使用了一个while True循环。这是一个无限循环,所以程序将持续运行,除非我们用Ctrl + C手动停止它。
然后对引脚的前一个和当前状态使用两个布尔变量(真或假),前一个状态是当前状态在循环中的前一次状态。
在循环中,我们将以前的状态与当前的状态进行比较,以检测它们何时不同。如果没有变化,我们不想继续显示消息。
发布于 2016-04-23 14:24:10
目前,我还没有检查代码的语法错误,也没有访问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"发布于 2016-04-23 13:47:16
例如,为第二个传感器定义第二组状态变量。
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)。但这个想法应该是一样的。
https://stackoverflow.com/questions/36811537
复制相似问题