当用户将双手放在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),前一个状态是当前状态是循环前一个时间。
在循环内部,我们将先前的状态与当前状态进行比较,以检测它们何时不同。如果没有变化,我们不想继续显示消息。
答案 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"