0

我有一个项目需要八个不同的灯在随机时间打开和关闭之间循环,随机淡入、随机淡出和随机开/关持续时间。我的策略是淡入淡出,随机开启一段时间,淡出,随机关闭一段时间,重复。虽然现在我在每个 for 循环之前都选择了一个随机引脚,但我想使用一个 for 循环随机选择一个引脚来运行整个开/关循环。

这是我的伪代码。或者也许这是我的代码。

void setup() {
    int pin = 0;
    int fadeIn = 0;
    int fadeOut = 0;
    int onDuration = 0;
    int offDuration = 0;
}
void loop() {    
pin = random(2,8)
onDuration = random(2000,15000)
    for (fadeIn=0;fadeIn<255;i++) {
        analogWrite(pin,fadeIn)
    }
delay(onDuration)
pin = random(2,8)
offDuration = random(1000,7000)
    for (fadeOut=254;fadeOut>0;fadeOut--) {
        analogWrite(pin,fadeOut)
    }
delay(offDuration)
} 

循环(打开,然后关闭)将是循环的一个实例。如果我想在第一个循环运行时在另一个引脚上启动循环的第二个实例,那我可以通过编程方式完成吗?或者我需要八个控制器,每个控制器同时淡入和淡出灯光?

4

2 回答 2

1

在上面的代码中,淡入和淡出不是随机时间。那是你的意图吗?如果是这样,您需要在循环的每次迭代中添加延迟。

无论如何,这是您可以在没有 8 个单独的板的情况下完成的事情。

因为它是嵌入式的,所以你不能很容易地多线程。您需要实现自己的任务调度程序,并且必须将每个 LED 视为自己的任务。然后,您只需跟踪每个不同 LED 的状态(淡入、打开、淡出或关闭)。当您在不同任务之间切换时,根据状态控制每个 LED。

至于基于时间的任务调度程序,您有不同的选择。也许最简单的方法是实现周期性定时器中断。AVR 数据表很好地解释了这一点。对于 Arduino,您还可以使用一些库。例如: http: //playground.arduino.cc/code/timer1

另一种选择是做类似的事情: http ://arduino.cc/forum/index.php?PHPSESSID=3e72433bc4375ee6c20d56f3998762ca&topic=5686.msg44073#msg44073

只是一些建议。听起来是一个有趣的项目。祝你好运!

于 2013-01-12T04:35:22.270 回答
1

您可以使用带有 switch/case 语句的程序化编码风格并通过一些变量跟踪状态来管理这类事情(多个灯/线程)。由于 Arduino 上的内存有限,这有时是唯一的方法。

另一方面,我在使用自定义类自定义库的面向对象方法进行这种照明控制方面取得了很大成功。更容易,loop()然后您只需要处理更高级别的逻辑并为每个实例提供服务(例如,告诉它更新并且实例处理该逻辑)。

唯一的问题是内存有限 - 所以它可能取决于您使用的特定板。不过,我建议您试一试-可能会很好地记忆,并且您会学到很多东西。

于 2013-01-12T04:46:56.017 回答