我想用树莓派建立一个存在探测器,说是否有人在房间里。
到目前为止,原理非常简单和基本:我使用pir探测器来检测运动。在第一步之后,我想使用一个led(例如),如果房间已满,它将是红色,如果是空的则为绿色。我不知道在那之后我能做些什么,但我想先在那里取得成功。 使用网络,我写了这个程序(有效):
import RPi.GPIO as GPIO
import time
import urllib
GPIO.setmode(GPIO.BCM)
GPIO_PIR = 7
GPIO.setup(GPIO_PIR,GPIO.IN)
Current_State = 0
Previous_State = 0
try:
print "Attente detection..."
while GPIO.input(GPIO_PIR)==1:
Current_State = 0
print " Pret"
while True :
Current_State = GPIO.input(GPIO_PIR)
if Current_State==1 and Previous_State==0:
print " Mouvement detecte !"
time.sleep(5)
Previous_State=1
elif Current_State==0 and Previous_State==1:
print " Pret "
Previous_State=0
time.sleep(1)
except KeyboardInterrupt:
print " Quit"
GPIO.cleanup()
我现在要做的是要有一条信息,其中包含房间的状态,因此这条消息可以是“满堂红”的信息。或者"房间空了"。
例如,如果检测到移动(终端将打印"检测到移动"并且在5秒后"准备好检测")消息应该是"房间已满#34 ;.如果10秒后没有检测到任何移动,则该消息将切换到"房间空白"等。
那就是它!我知道在python中执行它非常简单和基本(它不是一个覆盆子问题)但我并不熟悉python而且我不知道如何使用它这块"如果"和"而#34;。 你能帮我解决一下吗,谢谢你
答案 0 :(得分:1)
你真是太近了!
让我们首先跳到正确的位置。在您的第二个while True
块中,您的代码已经sleeps
(等待)一段时间
继续之前。这里有一些注释和格式更正:
while True:
# this reads from your GPIO to set a variable
Current_State = GPIO.input(GPIO_PIR)
# if it detected motion or if there wasn't motion last time we checked..
if Current_State==1 and Previous_State==0:
print " Mouvement detecte !"
# wait five seconds so we're not checking as fast as the cpu
# will allow!
time.sleep(5)
Previous_State=1
# this block has the same logic as above, but in reverse!
elif Current_State==0 and Previous_State==1:
# if we don't detect motion on gpio, print ready
# this is where we need to keep track of how many times we didn't
# detect motion.
print " Pret "
Previous_State=0
time.sleep(1)
现在,让我们做这个工作。您可能不想要第一个while GPIO.input(GPIO_PIR)==1:
块,因为它只是阻止线程,设置Current_State
,即使我们稍后再重新定义它(这也可能阻止您的程序达到实际While True:
循环完成我们的工作。
以下是实现所需逻辑的清理版本:
import RPi.GPIO as GPIO
import time
import urllib
GPIO.setmode(GPIO.BCM)
GPIO_PIR = 7
GPIO.setup(GPIO_PIR,GPIO.IN)
Previous_State = 0
Pret_Counter = 0
pret_message = None
try:
# this will only print the first time.
print "Attente detection..."
# this loop will continuously run
while True:
Current_State = GPIO.input(GPIO_PIR)
# if we have a message, print it!
if pret_message:
print pret_message
if Current_State and Previous_State==0:
print "Mouvement detecte!"
time.sleep(5)
Previous_State=1
# Someone moved. reset detection counter.
Pret_Counter = 0
elif Pret_Counter > 9:
# if we've been empty for 10 seconds,
# don't bother incrementing our counter
pret_message = "Room empty"
elif Current_State==0 and Previous_State:
print "Pret"
Pret_Counter += 1
Previous_State=0
time.sleep(1)
except KeyboardInterrupt:
print "Quit"
GPIO.cleanup()
我手边没有树莓派来测试GPIO或pir探测器的行为,但这应该可以解决问题。
此外,您可能想要稍微使用阈值 - 正如您的代码现在,您每5秒仅检查一次运动。如果未检测到两次动作,则表示房间为空。我建议对你的新空逻辑使用类似的技巧 - 每2秒检查一次可能是10次(有时候会议很无聊,人们会拿微胶囊)然后再决定它是空的。
作为旁注,您应该阅读Python教程,例如官方Python 2版本,如果您想继续学习旧版本,或者Python 3版本,以了解当前状态Python编程。