Pergunta

Eu preciso descobrir como a desvanecer-se dentro e fora de vários LEDS em uma função com um Arduino. Não é possível usar delay (), porque outras coisas precisa executar enquanto a luz está desaparecendo. Isto é o que tem até agora, mas não funciona.

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

}
Foi útil?

Solução

A única coisa óbvia é que você tem uma bandeira do estado para o qual maneira de valor de incremento, mas você não está testando-o em seu primeiro caso. Seria melhor para estruturar o seu código um pouco mais. Você também pode querer acompanhar mais de um valor, se você tiver mais de um pino, a menos que todos eles devem desaparecer dentro e fora ao mesmo tempo. Nesse caso, você seria melhor fora com uma variedade de structs com os parâmetros de cada pinheiro.

Uma maneira de usar o atraso com múltiplas tarefas é ter cada obra tarefa no tempo decorrido desde o último ciclo, e ajustar o atraso no final do seu ciclo para o tempo das tarefas tomar. Se o seu ciclo é algo como:

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

Em seguida, cada tarefa será executada uma vez a cada 20ms, e serão passados ??20 ou assim como o número de milissegundos para atualizar seu estado para. Para que você obtenha algum atraso, mas tudo tem a oportunidade de atualização.

Outras dicas

Especulando, mas isso parece errado:

if(value=260)

( lembrando-me dos mundos último erro em C )

Se você quer jogar hardware para o problema, você pode ligar os LEDs para um chip controlador externo, como a TI TLC5940. Aqueles permitem programar um nível de brilho por LED e lidar com a saída PWM para os LEDs separadamente da CPU ATmega no Arduino. Você só precisa reprogramar o chip TLC quando você quer o nível de brilho para a mudança. Há uma boa TLC biblioteca disponível para comunicação pega com o chip no Google Code.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top