我有一个项目需要八个不同的灯在随机时间在随机时间之间循环,随机淡入,随机淡出和随机开/关持续时间。我的策略是淡入淡出,随机离开,淡出,随机离开,重复。虽然我现在已经在每个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个控制器,每个控制器同时淡入和淡出灯光?
答案 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 classes和custom libraries通过面向对象的方法进行这种照明控制取得了很大的成功。更简单,您的loop()
只需要处理更高级别的逻辑并为每个实例提供服务(例如,告诉它更新,实例处理逻辑)。
唯一的问题是内存有限 - 因此可能取决于您使用的是哪种特定主板。我建议尝试一下 - 可能会很好的记忆,你会学到很多东西。