Domanda

Ho bisogno di capire come dissolvenza dentro e fuori di molteplici LED in una funzione con un Arduino. Impossibile utilizzare ritardo () perché le altre cose devono funzionare mentre la luce si sta spegnendo. Questo è ciò che ha fino ad ora, ma non funziona.

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

}
È stato utile?

Soluzione

L'unica cosa evidente è che hai una bandiera di stato per il quale modo per incrementare il valore, ma non sta testando nel vostro primo caso. Sarebbe meglio strutturare il codice un po 'di più. Si consiglia inoltre di monitorare più di un valore se si dispone di più di un perno, a meno che tutti dovrebbero svanire dentro e fuori allo stesso tempo. In quel caso si sarebbe meglio fuori con una serie di struct s con i parametri per ogni pino.

Un modo di usare ritardo con più compiti è quello di avere ogni opera compito sul tempo trascorso dall'ultimo ciclo, e regolare il ritardo alla fine del ciclo, per il momento le attività prendono. Se il ciclo è qualcosa di simile:

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

Poi ogni attività verrà eseguita circa una volta ogni 20 ms, e verrà trasmesso 20 o così come il numero di millisecondi per modificare lo stato di. Così si ottiene un certo ritardo, ma tutto ha la possibilità di aggiornare.

Altri suggerimenti

Speculare, ma questo sembra sbagliato:

if(value=260)

( ricordandomi dei mondi ultimo errore in C )

Se si vuole buttare hardware al problema, è possibile collegare i LED per un chip controller esterno, come il TI TLC5940. Quelli consentono di programmare un livello di luminosità per ogni LED e gestire l'uscita PWM per i LED separatamente dalla CPU ATMega nel Arduino. Hai solo bisogno di riprogrammare il chip TLC quando si desidera che il livello di luminosità per cambiare. C'è una bella TLC biblioteca a disposizione per gestire la comunicazione con il chip su Google Code.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top