Desvanece-se em vários LEDs com Arduino
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();
}
}
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 struct
s 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
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.