我需要弄清楚如何在带有Arduino的函数中淡入和淡出多个LED。不能使用delay(),因为其他的东西需要在灯光渐弱时运行。这是到目前为止的内容,但不起作用。
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
数组和每个松树的参数。
对多个任务使用延迟的一种方法是使每个任务按自上次循环以来耗时进行工作,并在循环结束时调整延迟以适应任务所花费的时间。如果您的循环是这样的:
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;
}
然后,每个任务大约每20毫秒运行一次,并将传递20左右(以毫秒为单位)以更新其状态。因此,您会有一些延迟,但是所有内容都有更新的机会。
关于function - 使用Arduino淡入多个LED,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/676133/