Frage

ich brauche, um herauszufinden, wie in verblassen und aus mehreren LEDs in einer Funktion mit einem Arduino. Kann nicht Verzögerung () verwenden, weil andere Dinge ausführen müssen, während das Licht verblassen wird. Dies ist, was es so weit hat, funktioniert aber nicht.

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

}
War es hilfreich?

Lösung

Die einzige offensichtliche Sache ist, dass man eine Staatsflagge, für die Art und Weise hat Wert zu erhöhen, aber Sie testen es nicht in Ihrem ersten if. Es wäre besser, den Code ein bisschen mehr zu strukturieren. Sie können auch mehr als einen Wert verfolgen möchten, wenn Sie mehr als einen Stift haben, es sei denn, sie alle sollten in und aus zur gleichen Zeit verblassen. In diesem Fall, dass Sie sei am besten, mit einer Reihe von structs mit den Parametern für jeden Kiefer aus.

Eine Möglichkeit Verzögerung mit mehreren Aufgaben zu verwenden, ist jede Aufgabe der Arbeit an der Zeit seit der letzten Schleife vergangen haben, und die Verzögerung am Ende der Schleife der Aufgaben übernehmen, für die Zeit einzustellen. 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 ihren Zustand zu aktualisieren. So können Sie eine gewisse Verzögerung, aber alles hat eine Chance, zu aktualisieren.

Andere Tipps

Spekulieren, aber dies scheint falsch:

if(value=260)

( mir den weltweit letzter Fehler in C erinnernd)

Wenn Sie Hardware auf das Problem werfen wollen, können Sie Ihre LEDs an einen externen Controller-Chip, wie der TI TLC5940 anschließen. Diejenigen, können Sie die Helligkeit pro LED programmieren und den PWM-Ausgang an die LEDs separat von der ATMega CPU in der Arduino behandeln. Sie müssen nur die TLC-Chip neu zu programmieren, wenn Sie die Helligkeit ändern möchten. Es gibt einen schönen TLC-Bibliothek zur Verfügung Kommunikation mit dem Chip auf Google Code zu behandeln.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top