2013-04-17 2 views
0

У меня есть малиновый pi, который я использую для контроля ввода из портов GPIO, для этого мне нужно запустить бесконечный цикл.Выполнять команду только один раз внутри бесконечного цикла

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

while 1: 
    if (GPIO.input(11) != GPIO.HIGH): 
     puerta_abierta = 1 
     if(puerta_abierta == 1): 
       call(["mpg123", "file.mp3"]) 
       puerta_abierta = 0 
    else: 
     puerta_abierta = 0 

ответ

1

Как это :

puerta_abierta = 0 
while 1: 
    if (GPIO.input(11) != GPIO.HIGH): 
     puerta_abierta += 1 
     if(puerta_abierta == 1): 
      call(["mpg123", "file.mp3"]) 
    else: 
     puerta_abierta = 0 
+0

Это решение будет вызывать mpg123 каждый раз, когда вход идет HIGH, а затем LOW снова, потому что он сбрасывает puerta_abierta. Не уверен, что это хорошо или плохо, потому что, как работает исходный код, но нарушает запрос плакатов о том, что mpg123 вызывается только один раз. – tdelaney

+0

Да, это так. Когда я написал код, я знал это. И я думаю, что это то, чего хочет искатель. – Sheng

+0

Мне нравится (и одобряю) ваш ответ, но хотелось бросить в качестве предостережения для оригинального плаката, если это не было очевидно. – tdelaney

2

Вы могли бы сделать что-то вроде этого:

called = False 

while True: 
    if GPIO.input(11) != GPIO.HIGH: 
     if not called: 
      call(["mpg123", "file.mp3"]) 
      called = True 

Вы также можете вырваться из петли, но это не может быть то, что вы собираетесь случиться:

while True: 
    if GPIO.input(11) != GPIO.HIGH: 
     call(["mpg123", "file.mp3"]) 
     break 
+0

Спасибо, что ваш вариант кулака действительно работает, я думаю, я не сделал объяснил себе достаточно хорошо. Я хочу, чтобы после того, как он сыграл, он не активируется до тех пор, пока мой вход снова не будет «LOW». –

Смежные вопросы