2016-05-13 137 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 
相關問題