我已经开始在我的树莓派上学习Python了。我在GPIO引脚8、10、12、16和18上有5个LED。
我有另一段代码可以工作,但我试图让它更紧凑。这个不起作用,但是你大概可以猜到我想要做什么。
我试图通过循环浏览chan_list列表让每个led一个接一个地闪烁,但我被卡住了。如何为列表中的每个条目重复该函数?
import RPi.GPIO as GPIO
from time import sleep
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BOARD)
chan_list = [8,10,12,16,18]
GPIO.setup(chan_list, GPIO.OUT, initial=0)
delay = 50
#delay = float(input("50-1000ms"))
delay = delay / 1000
led = 0
while True:
def blink():
GPIO.output(chan_list, 1)
sleep(delay)
GPIO.output(chan_list, 0)
sleep(delay)
blink()发布于 2021-03-14 09:26:35
您可以使用itertools.cycle()函数创建一个迭代器,该迭代器将循环遍历列表中的值。
这意味着像这样的东西应该可以工作(我不能测试它)。注意,我还将blink()的定义移出了循环-不需要重复一次。
from itertools import cycle # ADDED.
from time import sleep
import RPi.GPIO as GPIO
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BOARD)
chan_list = [8,10,12,16,18]
chan_cycler = cycle(chan_list) # ADDED.
GPIO.setup(chan_list, GPIO.OUT, initial=0)
delay = 50
#delay = float(input("50-1000ms"))
delay = delay / 1000
delay = 1
led = 0
def blink():
chan = next(chan_cycler) # ADDED.
GPIO.output(chan, GPIO.HIGH)
sleep(delay)
GPIO.output(chan, GPIO.LOW)
sleep(delay)
while True:
blink()发布于 2021-03-14 09:27:13
def blink():应该在顶部附近定义,而不是在循环内部。GPIO.output()函数接受单个管脚编号作为输入,而不是一列管脚。GPIO.setup()也是如此。为了让事情变得简单一点,去掉这个函数。在这种特定情况下,您不需要它。您应该使用for循环遍历每个元素并对其调用GPIO.setup()。然后,在while循环内部,您需要另一个for循环,该循环遍历chan_list中的每个元素并打开和关闭它们。我现在身上没有覆盆子Pi,但我敢打赌这会完成这项工作:
import RPi.GPIO as GPIO
from time import sleep
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BOARD)
chan_list = [8,10,12,16,18]
for pin_number in chan_list:
GPIO.setup(pin_number, GPIO.OUT, initial=0)
delay = 50
#delay = float(input("50-1000ms"))
delay = delay / 1000
led = 0
while True:
for pin_number in chan_list:
GPIO.output(pin_number, 1)
sleep(delay)
GPIO.output(pin_number, 0)
sleep(delay)https://stackoverflow.com/questions/66620028
复制相似问题