2016-02-02 3 views
1

У меня есть 100 адресных светодиодов: s подключен к RPi и хотел бы, чтобы они мигали в случайном порядке.Python: включение случайных светодиодов и отключение выключения

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

RGBlist = [100 random numbers 0-99] 
for i in RGBlist: 
    turnOnLED(i) 

Как начать второй цикл для запуска одновременно с первым?

delay(X ms) 
for i in RGBlist: 
    turnOffLED(i) 

Я не хочу, чтобы все 100 светодиодов, чтобы включить перед включением их снова по одному за раз, я хотел бы СИД (х), чтобы включить, то светодиод (у), LED (г) , Светодиод (x) выключится, светодиод (u) включится, светодиод (y) выключится и так далее. Еще лучше, если их можно отключить после того, как они будут гореть в течение произвольного времени 100-500 мс.

Нужно ли мне вводить глубокие, темные пещеры многопроцессорности и нарезки?

+0

Одна идея: когда вы включаете светодиод, поместите этот светодиод в список с меткой времени. когда пришло время выключить светодиод, найдите этот список, если найдете тот, который был включен более 500 мс. если вы это сделаете, отключите его и удалите из списка. если нет, возьмите случайный светодиод из этого списка и отключите его. – 576i

+0

Думаю, вам нужно будет использовать многопоточность. В [этом вопросе] (http://stackoverflow.com/questions/7168508/background-function-in-python) основы объясняются очень хорошо. – SebasSBM

ответ

1

Я не думаю, что вам нужно прибегать к многопоточности. Сначала вы можете составить план действий, а затем выполнить его. Например:

import random 
import time 

RGBlist = [random.randint(0, 100) for _ in range(100)] 
delay = 1000 # in milliseconds 

# Make a todo list. 
# Columns are: time, led, on/off 

# First add the entries to turn all leds on 
todo = [(delay * i, led, True) for i, led in enumerate(RGBlist)] 

# Now add the entries to turn them all off at random intervals 
todo += [(delay * i + random.randint(100, 500), led, False) 
     for i, led in enumerate(RGBlist)] 

# Sort the list by the first column: time 
todo.sort(key=lambda x: x[0]) 

# Iterate over the list and perform the actions in sequence 
for action_time, led, on in todo: 
    # Wait until it is time to perform the action 
    delay(action_time - time.time() * 1000) # In milliseconds 

    # Perform the action 
    if on: 
     turnOnLed(led) 
    else: 
     turnOffLed(led) 
+0

Спасибо @Rodin, это похоже на действительно опрятное решение. Я попробую сегодня днем, я еще не знаю, что говорить на Python, но я думаю, что я понимаю большую часть того, что вы делаете (за исключением, может быть, функции задержки в конце). – Zarkov

+0

Функция 'delay', взятая из примера вашего кода. 'time.time()' дает текущее время в секундах (нужно преобразовать в миллисекунды) ... подождите, там есть ошибка ... мы должны умножить на 1000 не делить! –