RuntimeWarnings с GPIO.настройка и GPIO.очистка не работает с KeyboardInterrupt

у меня проблема с моим кодом, работающим с raspberry pi. Я только начал с python, поэтому мне нужна помощь.

этот код:

import RPi.GPIO as GPIO
import time

GPIO.setmode(GPIO.BCM)

led1=22
led2=17

GPIO.setup(led1, GPIO.OUT)
GPIO.setup(led2, GPIO.OUT)

def blink():
    GPIO.output(led1, 1)
    time.sleep(1)
    GPIO.output(led1, 0)

    GPIO.output(led2, 1)
    time.sleep(1)
    GPIO.output(led2, 0)

while(blink):
    blink()

try:
    main()
except KeyboardInterrupt:
    GPIO.cleanup()

при запуске эта ошибка появляется в консоли:

RuntimeWarning: этот канал уже используется, продолжая в любом случае. Использовать Выводы GPIO.setwarnings (False) для отключения предупреждений. Выводы GPIO.настройки(светодиод LED1, Выводы GPIO.) И:

RuntimeWarning: этот канал уже используется, продолжая в любом случае. Использовать Выводы GPIO.setwarnings (False) для отключения предупреждений. Выводы GPIO.настройка (led2, Выводы GPIO.OUT)

Если я правильно понял команду GPIO.cleanup() следует сбросить все контакты порта GPIO и выключить светодиод.

но это не происходит на самом деле один из светодиодов гореть.

Как изменить мой код, чтобы решить эту проблему?

3 ответов


вот небольшая помощь, как эффективно разделить ваши функции и сделать их более общими. Хотя это рабочий скрипт Python, который я предоставил, я не тестировал его на своем raspi, но я думаю, что он будет работать -- в любом случае, дайте мне знать, если там были какие-то проблемы!

import RPi.GPIO as GPIO
import time

# Module level constants
LED1 = 22
LED2 = 17

# Sets up pins as outputs
def setup(*leds):
    GPIO.cleanup()
    GPIO.setmode(GPIO.BCM)
    for led in leds:
        GPIO.setup(led, GPIO.OUT)
        GPIO.output(led, GPIO.LOW)

# Turn on and off the leds
def blink(*leds):
    # Blink all leds passed
    for led in leds:
        GPIO.output(led, GPIO.HIGH)
        time.sleep(1)
        GPIO.output(led, GPIO.LOW)

if __name__ == '__main__':
    # Setup leds
    setup(LED1, LED2)
    # Run blinking forever
    try:
        while True:
            blink(LED1, LED2)
    # Stop on Ctrl+C and clean up
    except KeyboardInterrupt:
        GPIO.cleanup()

дружеская рекомендация:

существует специальный сайт Raspberry Pi StackExchange тоже: https://raspberrypi.stackexchange.com/


Вы, кажется, не включили main в вашем вопросе. Однако проблема может возникнуть, если программы выходят по какой-либо причине, отличной от KeyboardInterrupt. Лучше освободить ресурс в finally блок

try:
    main()
except KeyboardInterrupt:
    pass
finally:
    GPIO.cleanup()

вы призываете main() функция, но она не объявлена (определена), вы используете while(blink). Поэтому вам нужно удалить " main () "и поставить" Try " перед вашей основной функцией, которая является while(blink) петли. Не забудьте соответствующие вкладки.