Raspberry Pi - остановка во время цикла с нажимным переключателем
Просто чтобы сэкономить время, код запускает цикл для двух светодиодов, мигающих взад и вперед после нажатия переключателя справа. То, что я пытался сделать - без всякого успеха - это остановить цикл while, нажав второй переключатель слева, чтобы выключить оба светодиода, и код полностью остановился. Любая помощь или намеки будет принята с благодарностью.
import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BOARD)
leftLED = 22
rightLED = 18
leftSWITCH = 24
rightSWITCH = 16
GPIO.setup(leftLED, GPIO.OUT)
GPIO.setup(rightLED, GPIO.OUT)
GPIO.setup(leftSWITCH, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(rightSWITCH, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.output(leftLED, False)
GPIO.output(rightLED, False)
try:
print("press the left button to start. Press the right button to stop.")
while True:
input_state = GPIO.input(leftSWITCH)
if input_state == False:
while True:
input_state1 = GPIO.input(rightSWITCH)
GPIO.output(rightLED, GPIO.LOW)
time.sleep(.5)
GPIO.output(rightLED, GPIO.HIGH)
time.sleep(.1)
GPIO.output(leftLED, GPIO.LOW)
time.sleep(.5)
GPIO.output(leftLED, GPIO.HIGH)
time.sleep(.1)
if input_state1 == False:
break
finally:
GPIO.cleanup()
2 ответа
Я думаю, что ваш код в основном работает как написано. Я упростил это до следующего, который работает правильно на моем Pi (обратите внимание, что я изменил номера контактов, потому что у меня уже были провода на них):
import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BOARD)
leftSWITCH = 16
rightSWITCH = 18
GPIO.setup(leftSWITCH, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(rightSWITCH, GPIO.IN, pull_up_down=GPIO.PUD_UP)
try:
print('press the left button to start. Press the right button to stop.')
while True:
input_state = GPIO.input(leftSWITCH)
if input_state == False:
print('left button was pressed!')
while True:
input_state1 = GPIO.input(rightSWITCH)
print('.', end='', flush=True)
time.sleep(1)
if input_state1 == False:
print('right button was pressed!')
break
finally:
GPIO.cleanup()
Есть некоторые проблемы с кодом в вашем вопросе, которые могут вызывать проблемы; Трудно сказать, являются ли они просто вопросами форматирования в вопросе или они представляют реальные проблемы в вашем коде.
Несмотря на то, что приведенный выше код работает, он имеет существенные возможности для улучшения: в частности, внешний цикл является "занятым ожиданием"; Ваш код постоянно зацикливается и проверяет левый переключатель. Лучшим решением было бы использовать блокирующее ожидание, например, используя wait_for_edge
метод:
try:
print('press the left button to start. Press the right button to stop.')
while True:
GPIO.wait_for_edge(leftSWITCH, GPIO.FALLING, bouncetime=100)
print('left button was pressed!')
while True:
input_state1 = GPIO.input(rightSWITCH)
print('.', end='', flush=True)
time.sleep(1)
if input_state1 == False:
print('right button was pressed!')
break
finally:
GPIO.cleanup()
У меня нет опыта работы с контактами Raspberry Pi и GPIO, но у меня есть идея. Я знаю, что это не рабочий код.
Моя идея - запустить цикл while и проверить, нажата ли кнопка.
Если нажать на левый переключатель и не запустить протектор, он запустит нить, которая будет мигать светодиодами.
Если нажать правый переключатель и светодиоды уже мигают, поток будет прерван.
import threading
def led_blink():
# led off
# sleep
# led on
# sleep
leds_are_blinking = False
while True:
if left_switch == True and not leds_are_blinking:
thread = threading.tread(target="led_blink")
thread.start()
leds_are_blinking = True
if right_switch == True and leds_are_blinking:
thread.stop()