一个简单的Presence探测器,使用覆盆子使用python

时间:2015-07-02 22:38:07

标签: python raspberry-pi detection led

我想用树莓派建立一个存在探测器,说是否有人在房间里。

到目前为止,原理非常简单和基本:我使用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;。 你能帮我解决一下吗,谢谢你

1 个答案:

答案 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编程。