2015-04-12 1 views
0

Вот немного питона, который я заимствую. Его на малине pi контролируют три штыря с герконовыми выключателями на дверях. Если дверь открывается, она говорит «дверь открыта».Python while loop, пауза пока нет, продолжить снова, когда это правда?

Проблема в том, что она продолжает повторяться. Я хочу, чтобы он сказал это один раз, остановись, подождать, пока дверь не закроется и не возобновится мониторинг.

import time 
import RPi.GPIO as io 
import subprocess 
io.setmode(io.BCM) 

#pir_pin = 18 
door_pin = 24 
door_pin2 = 4 
door_pin3 = 22 
#io.setup(pir_pin, io.IN)   # activate input 
io.setup(door_pin, io.IN, pull_up_down=io.PUD_UP) # activate i$ 
io.setup(door_pin2, io.IN, pull_up_down=io.PUD_UP) # activate $ 
io.setup(door_pin3, io.IN, pull_up_down=io.PUD_UP) # activate $ 


while True: 
    # if io.input(pir_pin): 
    # print("PIR ALARM!") 
    if io.input(door_pin): 
     print("DOOR Open!") 
    if io.input(door_pin2): 
     print("DOOR Open2!") 
    if io.input(door_pin3): 
     print("DOOR open3!") 
     subprocess.call(['/usr/sipcmd-master/doording.sh']) 
    time.sleep(1.9) 

Я пробовал нижние линии, но, видимо, я не могу использовать истинное условие в истинном состоянии?

Редактировать: может быть, упрощенная версия моего вопроса, как я могу заставить цикл ждать изменения перед продолжением. то есть ждать, пока шпилька = 0, сделать X, когда штырь = 1

+0

Вы пропустили ':' на 'if True'. Кроме того, 'if True: continue' заставит цикл всегда пропускать вызов' time.sleep() '. Если вы хотите так часто проверять дверь, возьмите чек из своей петли, сделайте ее функцией, затем используйте [Cron] (https://www.raspberrypi.org/documentation/linux/usage/cron.md) запланировать проверку. Если вы хотите, чтобы что-то случалось каждый раз, когда дверь открывается или закрывается, привяжите обратный вызов к событию (не уверен, как это сделать в малине Pi). – TigerhawkT3

+0

Исправлено: но он все еще не делает то, что я хочу. Я хочу, чтобы цикл подождал 'или' пауза ', пока дверь не будет закрыта, а затем возобновится. – wlraider70

+0

Единственное, что 'time.sleep()' может приостанавливаться до тех пор, пока не будет указан определенный интервал времени. Кроме того, похоже, что вы не совсем поняли значение 'if True' или' continue'. 'if True' проверяет, проверяет ли' True' значение 'True', что всегда, так что ветвь всегда вводится. 'continue' немедленно возвращается, чтобы переоценить условие цикла, а не выполнять оставшуюся часть цикла. То, что вы ищете, - это привязка обратного вызова к событиям открытия и закрытия. – TigerhawkT3

ответ

0

Похоже, вы должны положить намеренное бесконечный цикл там опрашивает двери закрываются:

while True: 
    if io.input(door_pin): 
     print("DOOR Open!") 
     while io.input(door_pin): 
      pass # do nothing - the door is still open 
    # now continue doing whatever you want after the door is closed again 

Я знаю, что это не действительно «приостанавливает» приложение, поскольку оно все равно будет потреблять ресурсы, пока цикл опроса будет вращаться. Но я предполагаю, что с тобой все в порядке, потому что ты собираешься открывать двери.

+0

Я думаю, что опрос для открытых дверей - это просто ошибка, и наличие одной ошибки не означает, что можно добавить больше. Это похоже на ответ, который маскирует 'int', потому что код искателя маскирует' list'. – TigerhawkT3

+0

@ TigerhawkT3 Что заставляет вас думать, что опрос открытых дверей был ошибкой? OP писал бесконечный цикл, чтобы неоднократно проверять открытые двери и просто хочет, чтобы сценарий подождал, пока он открыт. Это выглядит довольно преднамеренно для меня. И даже если это была ошибка, обработка асинхронных событий в Python является ОГРОМНЫМ шагом по сложности, поэтому я думаю, что это совершенно прекрасное решение, пока OP знает, что он все еще потребляет ресурсы, о чем я говорил. Это, конечно, не так плохо, как предполагает, что он использует имя переменной, которое маскирует встроенный. – skrrgwasme

+1

Это проблема XY: искатель пытается воздействовать на пользовательские события (проблема X), решил использовать бесконечный цикл (потребляя 100% процессор все время), и помните, что малина Pi - это небольшое устройство, которое может быть работает на батарее), и теперь спрашивает, как сделать бесконечный цикл работать правильно (проблема Y). Я был бы очень удивлен, если у Raspberry Pi нет достойного API для обратных вызовов событий. – TigerhawkT3