2016-05-13 92 views
1

我现在拥有的是下面的循环,它依次点亮24个链中的每个链。在for循环中选择第一个第n个列表项目

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'对象不可迭代”。

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

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模式改变时,睡眠仍会造成一些延迟。

+1

我认为即使你的第一个片段是完美的,除了最初的'像素= [(0,0,0)] * numLEDs'应该位于for循环之前。 – venkatKA

+0

斯蒂芬,我给出了一个答案,理解你想在每个时刻打开两个连续的LED,但现在我不太确定它......如果我误解了你的Q,我很乐意删除我的答:请让我知道。 – gboffi

回答

0

在你的第一个例子中,循环通过将它们设置为(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)。

如果我= 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)] 

正如你所看到的,这将使其他人。

+0

如何根据i的值设置不同的颜色? 我试过了下面的,但是它很笨重 ' if i <= 8: pixels = [(100,0,0)] *(i)+ [(0,0,0)] *(numLEDs - i) elif i> = 8而不是i> 16: 像素= [(100,0,0)] * 8 + [(100,100,0)] *(i)+ [(0,0,0)] *(numLEDs-i + 8) elif i> = 16: pixels = [(100,0,0)] * 8 + [(100,100,0)] * 8 + [(0,100,0)] *(i )+ [(0,0,0)] *(numLEDs - i + 16) client.put_pixels(pixels,channel = 0) time.sleep(0.5) ' – StephenHiggins

+0

@StephenHiggins hmm interesting q ... Let me思考 – Tim

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) 
0

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

你想计算,使用简单的模块算术,哪个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) 

你已经导致0 ON在px列表中的第一次迭代之前,第一次迭代之后,你有2个LED ON,在所有进一步的迭代你在每一个瞬间把一个LED熄灭,然后打开另一个LED指示灯亮,所以你有2个开启。

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 
相关问题