2009-03-24 8 views
4

J'ai besoin de comprendre comment faire un fondu entrant et sortant de plusieurs LED dans une fonction avec un Arduino. Impossible d'utiliser delay() car d'autres éléments doivent s'exécuter pendant que la lumière s'estompe. C'est ce qu'il a fait jusqu'ici, mais ça ne marche pas.Fondu dans plusieurs LED avec 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(); 
    } 

} 

Répondre

6

La seule chose évidente est que vous avez un drapeau de l'Etat pour lequel moyen d'augmenter la valeur, mais vous n'êtes pas le tester dans votre premier cas. Il vaudrait mieux structurer un peu plus votre code. Vous pouvez également effectuer le suivi de plus d'une valeur si vous avez plusieurs broches, à moins qu'elles ne doivent toutes apparaître et disparaître en même temps. Dans ce cas, vous seriez mieux avec un tableau de struct s avec les paramètres pour chaque pin. L'une des façons d'utiliser le retard avec plusieurs tâches est de faire en sorte que chaque tâche fonctionne sur le temps écoulé depuis la dernière boucle, et d'ajuster le délai à la fin de votre boucle pour le temps que prennent les tâches. Si votre boucle est quelque chose comme:

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

Ensuite, chaque tâche sera exécutée une fois tous les 20ms, et sera transmis 20 ou alors que le nombre de millisecondes pour mettre à jour leur état pour. Vous avez donc du retard, mais tout a une chance de se mettre à jour.

0

Si vous souhaitez éliminer le matériel, vous pouvez raccorder vos voyants à une puce de contrôleur externe, comme la TI TLC5940. Ceux-ci vous permettent de programmer un niveau de luminosité par LED et de gérer la sortie PWM vers les LED séparément de la CPU ATMega dans l'Arduino. Vous avez seulement besoin de reprogrammer la puce TLC lorsque vous voulez changer le niveau de luminosité. Il y a une belle TLC library available to handle communication with the chip sur Google Code.