同时和随机输出引脚与Arduino



我有一个项目,需要8个不同的灯在随机时间在打开和关闭之间循环,随机淡入,随机淡出和随机开/关持续时间。我的策略是逐渐淡出,让它持续一段时间,逐渐淡出,让它持续一段时间,重复。虽然现在我在每个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)
} 

循环(打开,然后关闭)将是循环的一个实例。如果我想在第一个周期运行时,在另一个引脚上启动第二个周期实例,这是我可以通过编程来做的事情吗?或者我需要8个控制器,每个控制器同时熄灭和熄灭灯光?

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

无论如何,这是你不需要8个单独的板就可以做到的。

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

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

另一个选项是做类似这样的事情:http://arduino.cc/forum/index.php?PHPSESSID=3e72433bc4375ee6c20d56f3998762ca&主题= 5686. msg44073 # msg44073

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

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

另一方面,我用自定义类和自定义库的面向对象方法成功地完成了这种照明控制。更简单的是,你的loop()只需要处理更高级别的逻辑和服务每个实例(例如,告诉它更新,实例处理该逻辑)。

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

最新更新