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()
Другие вопросы по тегам