题
我需要想出如何淡入和淡出多个LED与一个Arduino的功能。不能使用延时(),因为其他的事情需要而光衰减运行。这是它迄今,但是还是不行。
int value = 0; // variable to keep the actual value
int ledpin = 9; // light connected to digital pin 9
int p1 = 0;
void setup()
{
// nothing for setup
Serial.begin(9600);
}
void loop()
{
inout(50, 30, 9, 0, 0);
//inout(20, 20, 10);
}
void inout(int inDelay, int outDelay, int ledpin, long previousmil, int done)
{
if(millis() - previousmil>inDelay){
if (value <=255){
analogWrite(ledpin, value); // sets the value (range from 0 to 255)
value+=5;
}
previousmil=millis();
}
if(value = 260)
done = 1;
if(millis() - previousmil>outDelay && done == 1){
if (value >0){
analogWrite(ledpin, value); // sets the value (range from 0 to 255)
value-=5;
}
previousmil=millis();
}
}
解决方案
在唯一明显的一点是,你已经有了它的方式来增加值的状态标志,但你不能在你的第一个测试,如果它。这将是更好地组织你的代码多一点。您可能还希望,如果你有一个以上的针跟踪多个值,除非他们都应该在同一时间淡入和淡出。在这种情况下你最好关闭与struct
s的阵列为每个松树的参数。
使用多任务延迟的一种方法是对自上次循环所经过的时间每个任务的工作,并调整在你的循环的任务,走的时候结束的延迟。如果你的循环是这样的:
static unsigned long last_time = 0; // set to millis() in setup
static unsigned long refresh_period = 20; // 50Hz
void loop()
{
unsigned long time = millis();
unsigned long delta = time - last_time;
doTask1( delta );
doTask2( delta );
doTask3( delta );
doTask4( delta );
// as tasks may have taken some millis, adjust delay
unsigned long post_time = millis();
if ( post_time - last_time < refresh_period )
delay( refresh_period - ( post_time - last_time ) );
last_time = time;
}
然后,每个任务将运行约一次每20ms,并且将被传递20或者以便毫秒数来更新其状态。所以,你得到一些延迟,但任何事物都有机会更新。
其他提示
如果你想在这个问题抛出的硬件,您可以将您的LED挂钩到外部控制器芯片,像TI TLC5940。那些让用户编程每个LED的亮度水平,并从在所述的Arduino CPU ATMEGA分开处理PWM输出到LED。您只需要在您需要的亮度级别更改为重新编程TLC芯片。有一个很好的可用来处理与谷歌代码芯片通信TLC库。
不隶属于 StackOverflow