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