function - tutorial - Fundido en múltiples LED con Arduino
https www arduino cc en tutorial (3)
Necesito descubrir cómo desvanecerme y salir de múltiples LEDS en una función con un Arduino. No se puede usar delay () porque otras cosas necesitan ejecutarse mientras la luz se está desvaneciendo. Esto es lo que tiene hasta ahora, pero no 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();
}
}
Lo único obvio es que tienes una bandera de estado que te permite incrementar el valor, pero no lo estás probando en tu primer if. Sería mejor estructurar tu código un poco más. También es posible que desee rastrear más de un valor si tiene más de un pin, a menos que todos ellos se desvanezcan hacia adentro y hacia afuera al mismo tiempo. En ese caso, sería mejor con una matriz de struct
con los parámetros para cada pino.
Una forma de utilizar el retraso con múltiples tareas es hacer que cada tarea trabaje en el tiempo transcurrido desde el último ciclo, y ajustar la demora al final de su ciclo para el tiempo que tardan las tareas. Si su ciclo es algo así 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;
}
Luego, cada tarea se ejecutará aproximadamente una vez cada 20 ms, y pasará aproximadamente 20 o más como la cantidad de milisegundos para actualizar su estado. Así que obtienes un poco de retraso, pero todo tiene la posibilidad de actualizarse.
Si desea lanzar hardware al problema, puede conectar sus LED a un chip controlador externo, como el TI TLC5940. Esos permiten programar un nivel de brillo por LED y manejar la salida PWM a los LED por separado de la CPU ATMega en el Arduino. Solo necesita reprogramar el chip TLC cuando desee que cambie el nivel de brillo. Hay una buena biblioteca de TLC disponible para manejar la comunicación con el chip en Google Code.
Especulando, pero esto parece incorrecto:
if(value=260)