【问题标题】:Python: Turning on random LEDs and delay turning offPython:打开随机 LED 并延迟关闭
【发布时间】:2016-02-02 20:55:12
【问题描述】:

我有 100 个可寻址 LED:s 连接到 RPi,并希望它们随机闪烁。

我最初的想法是在启动时创建一个包含 100 个数字的随机列表,然后在循环中一个接一个地打开它们。一段时间后,我想再次关闭它们。

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

如何启动第二个循环与第一个循环同时运行?

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

我不希望所有 100 个 LED 都打开,然后再一次关闭它们,我希望 LED(x) 打开,然后 LED(y)、LED(z)、LED(x ) 关闭,LED(u) 开启,LED(y) 关闭,依此类推。如果它们可以在点亮 100-500 毫秒的任意时间后关闭,那就更好了。

我是否需要为此进入多处理和线程的深邃黑暗洞穴?

【问题讨论】:

  • 一个想法:当您打开一个 LED 时,将该 LED 放入一个带有时间戳的列表中。当需要关闭一个 LED 时,如果您发现一个已打开超过 500 毫秒的 LED,请搜索该列表。如果这样做,请将其关闭并从列表中删除。如果没有,请从该列表中随机获取一个 LED 并将其关闭。
  • 我认为您将需要使用多线程。在this question 中对基础知识进行了很好的解释。

标签: python random raspberry-pi raspbian


【解决方案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)

【讨论】:

  • 感谢@Rodin,这看起来是一个非常巧妙的解决方案。今天下午我会试一试,我的 Python 还不是很流利,但我想我理解你在做什么(除了最后的延迟函数)。
  • 我从您的代码示例中获取的 delay 函数。 time.time() 以秒为单位给出当前时间(需要转换为毫秒)...等等,那里有错误...我们应该乘以 1000 而不是除!
猜你喜欢
  • 1970-01-01
  • 2021-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多