Arduino同时和随机输出引脚

时间:2013-01-11 16:57:23

标签: random arduino fadein fadeout

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

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

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个控制器,每个控制器同时淡入和淡出灯光?

2 个答案:

答案 0 :(得分: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

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

答案 1 :(得分:1)

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

另一方面,我使用custom classescustom libraries通过面向对象的方法进行这种照明控制取得了很大的成功。更简单,您的loop()只需要处理更高级别的逻辑并为每个实例提供服务(例如,告诉它更新,实例处理逻辑)。

唯一的问题是内存有限 - 因此可能取决于您使用的是哪种特定主板。我建议尝试一下 - 可能会很好的记忆,你会学到很多东西。