Python - планировщик блоков прерываний - PullRequest
0 голосов
/ 01 мая 2019

Я использую систему на основе малины для управления некоторыми вещами.На данный момент я просто тестирую это с включением и выключением светодиода.

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

import RPi.GPIO as GPIO # Import Raspberry Pi GPIO library
import time,sched

s = sched.scheduler(time.time, time.sleep)

def button_callback(channel):
   print("Button was pushed!")
   print(time.time())
   GPIO.output(18,GPIO.HIGH)
   s.enter(10, 1, turnoff,argument='')
   s.run()

def turnoff():
   print "LED off"
   print(time.time())
   GPIO.output(18,GPIO.LOW)

btpin=22
ledpin=18

GPIO.setwarnings(False) 
GPIO.setmode(GPIO.BOARD)
GPIO.setup(btpin, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
GPIO.setup(ledpin,GPIO.OUT)
GPIO.add_event_detect(btpin,GPIO.RISING,callback=button_callback) 
message = input("Press enter to quit\n\n")
GPIO.cleanup()

Если я нажму кнопку, а затем оставлю все в покое, светодиод выключится через 10сек.Но, если я снова нажимаю кнопку, ничего не происходит до завершения работы планировщика, то регистрируется новое нажатие.Я ожидал, что планировщик вращается в фоновом режиме, поэтому, когда я снова нажму кнопку, обратный вызов снова запустится, и я получу сообщение «Кнопка была нажата» (и все, что произойдет после этого, не будет иметь никакого эффектапоскольку GPIO 18 уже был высок, и запланированный вызов на выключение мог бы произойти после того, как выключение уже было выполнено.

Можно ли использовать библиотеку sched, чтобы делать то, что я хочу, или мне нужно использовать некоторые другие методы?Я знаю, что я могу сделать это либо простым способом, путем циклического поиска нажатой кнопки, а не регистрации обратного вызова, либо, возможно, более сложным способом, создав новый поток, который будет сбрасывать GPIO через определенное время - но есть ли что-тоЯ не понял в sched или есть какая-то другая библиотека, которая дает мне то, что я хочу - способ сказать Python делать что-то немного в будущем, не вмешиваясь в то, что еще происходит.

(я делаюне нужно очень точное время - а также, этоэто лишь часть того, что я собираюсь сделать более сложной системой управления, мне удается делать именно то, что я хочу, используя Arduino, но это ограничит дальнейшее развитие)

1 Ответ

1 голос
/ 01 мая 2019

Благодаря подсказке от @stovfl я переписал первую часть своего кода:

import time,threading

def button_callback(channel):
   pin=18
   print("Button was pushed!")
   print(time.time())
   GPIO.output(pin,GPIO.HIGH)
   t = threading.Timer(10.0, turnoff)
   t.start() 

и работает так, как я хотел

...