2016-05-13 2 views
1

То, что у меня есть в данный момент, - это нижний контур, который подсвечивает каждый из них по строке 24 в свою очередь.выберите первый элемент n-го списка в цикле for

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) 

Что бы я хотел, так это то, что ранее освещенные светодиоды остаются на каждой итерации. Таким образом, количество подсвеченных светодиодов увеличивается на каждый каждый раз.

Я предположил, что могу просто выбрать из начала списка 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()? Хотя я использую потоки, сон по-прежнему вызывает некоторые задержки при изменении шаблонов светодиодов.

+1

Я думаю, что даже ваш первый фрагмент идеален, за исключением того, что начальные 'pixels = [(0,0,0)] * numLEDs' должны лежать непосредственно перед циклом for. – venkatKA

+0

Stephen, я дал ответ в понимании, что вы хотите, чтобы в каждый момент включались два последовательных светодиода, но теперь я не уверен в этом ... Если я неправильно понял ваш Q, я был бы рад удалить мои О. Пожалуйста, дайте мне знать. – gboffi

ответ

0

В первом примере цикл выключает светодиоды, установив их на (0,0,0). Вместо этого, почему бы не использовать это:

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: пикселей = [(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 ... Позвольте мне подумайте, что – 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

Это ответ, связанный с задачей включения двух последовательных светодиодов, так что, если вы монтируете массив ваших светодиодов в форме круга, вы видите двойной свет, движущийся по кругу с частотой приблизительно 2 Гц.
Я ответил под ложным впечатлением от того, что эффективно спросил ОП, я дал еще один ответ, который касается РЕАЛЬНОГО вопроса, но я хотел бы оставить здесь этот ответ, потому что он имеет свою красоту, по крайней мере, в глазах смотрящего ...

Вы хотите вычислить с использованием простой арифметики модуля, который должен быть выключен и который должен быть включен, используя трюк (который, я надеюсь, он разрешен в соответствии с вашими требованиями), который мы запускаем с частично освещенной доской.

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

Перед 1-й итерации вы привели 0 ON в px списке, после того, как 1-й итерации у вас есть 2 светодиода ON, во всех последующих итераций вы поставите один увел и повернуть другой главе ON, так что в любой момент у вас есть 2 светодиода.

0

Если вы хотите осветить ВСЕ светодиоды в последовательности, затем выключите их сразу и т. Д. И т. Д. И т. Д. ...и т. д.

# 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 
Смежные вопросы