1

我现在拥有的是下面的循环,它依次点亮每根 24 根 LED 灯。

while True:
    for i in range(24):
        pixels = [ (0,0,0) ] * numLEDs
        pixels[i] = (100, 100, 100)
        client.put_pixels(pixels)
        time.sleep(0.02) 

我想要的是以前点亮的 LED 在每次迭代时都保持亮着。因此,每轮点亮的 LED 数量都会增加一个。

我假设我可以简单地从列表的开头选择到第 i 个项目,如下所示。然而,这会返回一个“TypeError:'int' object is not iterable”。

我不太清楚为什么这不起作用。

while True:
    for i in range(24):
        pixels = [ (0,0,0) ] * numLEDs
        pixels[:i] = (100, 100, 100)
        client.put_pixels(pixels)
        time.sleep(0.02) 

虽然我已经引起了您的注意,但除了使用 time.sleep() 之外,还有更好的方法来计时这些循环吗?虽然我使用的是线程,但当 LED 模式发生变化时,睡眠仍然会导致一些延迟。

4

4 回答 4

2

问题是你永远用全零覆盖你当前的像素状态。如果您在无限while循环之外定义像素结构,然后一次只调整一个,它应该可以解决您的问题。尝试这样的事情:

numLEDs = 24
pixels = [ (0,0,0) ] * numLEDs

while True:
    for i in range(numLEDs):
        pixels[i] = (100, 100, 100)
        client.put_pixels(pixels)
        time.sleep(0.02)
于 2016-05-13T13:21:14.917 回答
0

在您的第一个示例中,循环通过将 LED 设置为 (0,0,0) 来关闭 LED。相反,为什么不使用这个:

while True:
    for i in range(24):
        pixels = [ (100,100,100) ] * (i) + [ (0,0,0) ] * (numLEDs - i)
        client.put_pixels(pixels)
        time.sleep(0.02) 

i会将列表的第一个元素设置为 (100,100,100),然后将其余元素设置为 (0,0,0)。

如果 i = 5 且 numLEDs = 15,您将获得以下输出:

[(100, 100, 100), (100, 100, 100), (100, 100, 100), (100, 100, 100), (100, 100, 100), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0)]

如您所见,这将使其他人继续工作。

于 2016-05-13T13:24:37.170 回答
0

这是一个处理始终打开两个连续 LED 的任务的答案,因此,如果您将 LED 阵列安装成圆形,您会看到双光以大约 2 Hz 的频率在圆圈上移动。
我在对 OP 有效提出的问题的错误印象下回答,我给出了另一个解决真正问题的答案,但我想把这个答案留在这里,因为它有它的美丽,至少在旁观者的眼中.. .

您想使用简单的模块算法计算哪个 LED 必须关闭,哪个 LED 必须打开,使用我们从部分点亮的电路板开始的技巧(我希望它在您的要求下是允许的)。

# constants
ON = (100, 100, 100)
OFF = (0, 0, 0)
N = 24

# initial state of the leds
px = [ OFF ] * N
client.put_pixels(px) # no leds on

# set initial conditions for the iteration
px[0] = ON
n = -1

# the never-ending loop
while True:
    n +=1
    i, j = (n-1)%N, (n+1)%N
    px[i], px[j] = OFF, ON
    client.put_pixels(px)
    time.sleep(0.02)

在第一次迭代之前,您在px列表中将 0 导通,在第一次迭代之后,您有 2 个导通,在所有进一步的迭代中,您将一个导通关闭并打开另一个导通,因此在每一刻您都有 2 个导通。

于 2016-05-13T14:05:53.340 回答
0

如果您想按顺序点亮所有 LED,然后立即将它们关闭等等等等等等

# constants
ON = (100, 100, 100)
OFF = (0, 0, 0)
N = 24

n = 0
while 1:

   if n%N == 0:
       px = [ OFF ] * N
       client.put_pixels(px)
       time.sleep(0.02)

   px[n%N] = ON
   client.put_pixels(px)
   time.sleep(0.02)

   n += 1
于 2016-05-13T14:23:05.877 回答