2015-07-02 4 views
-1

Я хочу построить детектор присутствия с использованием малины pi, чтобы сказать, присутствует ли кто-то в комнате или нет.тривиальный детектор присутствия с малиной с использованием python

До сих пор принцип очень прост и прост: я использую детектор pir для обнаружения движения. После этого первого шага я хочу использовать светодиод (например), который будет красным, если комната заполнена и зеленой, если она свободна. Я не знаю, что я могу сделать после этого, но я хочу добиться этого первым. Использование сети, я написал эту программу (которая работает):

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 секунд «готов к обнаружению») сообщение должно быть «заполнено комнатой». И если движение не было обнаружено через 10 секунд, сообщение переключится на «пустое место» и т. Д.

Вот и все! Я знаю, что это очень просто и просто сделать это в python (это не вопрос малины), но я не очень хорошо знаком с python, и я не знаю, как использовать это со всеми этими блоками «if» и « в то время как". Можете ли вы мне помочь, чтобы исправить это, спасибо

ответ

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, но это должно сделайте трюк.

Кроме того, вы, вероятно, захотите поиграть с th e порогового значения - поскольку ваш код теперь, вы проверяете движение только один раз каждые 5 секунд. Если движение не обнаружено дважды, вы помещаете комнату в пустую. Я бы предложил использовать подобный трюк для вашей новой пустой логики - проверять каждые 2 секунды, может быть, 10 раз (иногда встречи скучны, а люди берут микронакрытия), прежде чем решить, что он пуст.

В качестве побочного примечания вы должны изучить учебник Python, например официальную версию Python 2, если хотите продолжить изучение старой версии или версию Python 3, чтобы узнать текущее состояние программирования на Python.