2009-03-24 14 views
4

Ich muss herausfinden, wie in einer Funktion mit einem Arduino mehrere LEDs ein- und ausblenden. Verzögerung() kann nicht verwendet werden, da andere Dinge ausgeführt werden müssen, während das Licht ausgeblendet wird. Dies ist, was es bisher hat, aber nicht funktioniert.Fade in mehrere LEDs mit 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(); 
    } 

} 

Antwort

6

Die einzige offensichtliche Sache ist, dass man eine Staatsflagge, für die Art und Weise Wert zu erhöhen hat, aber Sie testen es nicht in Ihrem ersten if. Es wäre besser, Ihren Code ein wenig mehr zu strukturieren. Sie können auch mehr als einen Wert verfolgen, wenn Sie mehr als einen Pin haben, es sei denn, sie sollten alle gleichzeitig ein- und ausblenden. In diesem Fall sind Sie am besten mit einem Array von struct s mit den Parametern für jeden Kiefer.

Eine Möglichkeit, die Verzögerung bei mehreren Aufgaben zu verwenden, besteht darin, dass jede Aufgabe mit der seit der letzten Schleife verstrichenen Zeit arbeitet und die Verzögerung am Ende der Schleife für die Zeit der Aufgaben angepasst wird. Wenn Ihre Schleife ist so etwas wie:

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; 
} 

Dann wird jede Aufgabe etwa einmal alle 20 ms ausgeführt werden, und 20 geleitet werden oder um die Anzahl der Millisekunden für ihren Zustand zu aktualisieren. Sie bekommen also etwas Verzögerung, aber alles hat eine Chance zu aktualisieren.

0

Wenn Sie Hardware auf das Problem werfen wollen, können Sie Ihre LEDs an einen externen Controller-Chip anschließen, wie den TI TLC5940. Mit diesen können Sie eine Helligkeitsstufe pro LED programmieren und den PWM-Ausgang zu den LEDs getrennt von der ATMega-CPU im Arduino handhaben. Sie müssen den TLC-Chip nur neu programmieren, wenn Sie die Helligkeit ändern möchten. Es gibt eine nette TLC library available to handle communication with the chip auf Google Code.