我需要弄清楚如何在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();
}
}
答案 0 :(得分:6)
唯一显而易见的事情是你有一个状态标志,用于增加值的方式,但是你没有在你的第一个if中测试它。最好再构建一下代码。如果你有多个引脚,你也可能想跟踪多个值,除非它们都应该同时淡入和淡出。在这种情况下,你最好使用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;
}
然后每个任务将每20ms运行一次,并且将以20毫秒左右的时间通过更新其状态的毫秒数。所以你得到一些延迟,但一切都有机会更新。
答案 1 :(得分:1)
答案 2 :(得分:0)
如果您想解决问题,可以将LED连接到外部控制器芯片,如TI TLC5940。这些可以让您为每个LED编程亮度级别,并与Arduino中的ATMega CPU分开处理LED输出。您只需要在需要更改亮度级别时重新编程TLC芯片。 Google Code上有一个不错的TLC library available to handle communication with the chip。