8

我的代码与树莓派一起工作时遇到问题。我刚开始使用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.setup(led1, GPIO.OUT) 和:

RuntimeWarning:此通道已在使用中,仍将继续。使用 GPIO.setwarnings(False) 禁用警告。GPIO.setup(led2, GPIO.OUT)

如果我理解正确,该命令GPIO.cleanup()应重置 GPIO 端口的所有引脚并关闭 LED。

但这实际上并没有发生,其中一个导致仍然存在。

如何更改我的代码以解决此问题?

4

3 回答 3

10

这里有一点帮助,如何有效地分离你的函数,并使它们更通用。虽然这是我提供的一个工作 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/

于 2014-05-15T18:02:40.007 回答
9

你的问题似乎没有包括在内main。但是,如果程序因KeyboardInterrupt. 最好在一个finally块中释放资源

try:
    main()
except KeyboardInterrupt:
    pass
finally:
    GPIO.cleanup()
于 2014-12-16T04:41:51.443 回答
2

您正在调用main()函数,但它没有声明(定义),您正在使用while(blink). 所以你需要删除“main()”并将“Try”放在你的主函数之前,即while(blink)循环。不要忘记那里的正确标签。

于 2016-02-05T22:27:27.483 回答