Hola, buenas!
Estoy probando a controlar una tira led mediante arduino y 3 salidas PWM (Una para cada color)
El problema viene a la hora de programar. Cuando intento pasar de un azul claro(Color inicial) a un color anaranjado solo lo he conseguido hacerlo modificando una salida PWM y seguido la otra. Mi pregunta es, ¿Se pueden modificar las dos salidas a la vez para que no pase por un color que no quiero?
Como veis en el código hay un fade entre color y color para que no cambie de golpe.
Saludos y gracias de antemano
void loop() {
int r, g, b;
//Valores iniciales para un azul claro
analogWrite(PINROJO, 0);
analogWrite(PINVERDE, 200);
analogWrite(PINAZUL, 255);
delay(10000);
//Azul claro a Naranja (R=255, G=50, B=0)
//Aumentamos el rojo a 255
for (r = 0; r < 255; r++) {
analogWrite(PINROJO, r);
delay(FADE);
}
//Dismunuimos el verde hasta 50
for (g = 200; g > 50; g--) {
analogWrite(PINVERDE, g);
delay(FADE);
}
//Disminuimos el azul a 0
for (b = 255; b > 0; b--) {
analogWrite(PINAZUL, b);
delay(FADE);
}
delay(10000);
Luego restaría para cada color inicial y final. Guardaría esta variable en un sitio y su valor absoluto en otro ya verás por que
Y luego dividirla 255/ ese resultado = llamémoslo X
Entonces dentro del for cada X veces se incrementa o decremento en función de la variable con signo que hemos guardado
Esto lo puedes hacer como cálculos fijos y programarlo como para el ejemplo o hacer una función que te lo haga, pasándole los valores rgb antiguos y nuevos
me ha costado algo mas de lo que yo mismo habría pensado pero lo he sacado, No suelo resolver problemas de la gente asi por que si, pero en este caso era algo personal entre yo y este código jajaja
Se puede optimizar y mejorar, solo que he intentado que sea lo mas legible posible
#define PINROJO 11
#define PINVERDE 10
#define PINAZUL 9
//#define DEBUG 1
typedef struct RGB
{
byte R, G,B;
} RGB;
RGB led, ci, cf;
int tiempo=20; //20 entre cadada cambio siempre hay 255 cambio total 5 segudos aprox
void act(){
analogWrite(PINROJO, led.R);
analogWrite(PINVERDE, led.G);
analogWrite(PINAZUL, led.B);
#ifdef DEBUG
Serial.print (led.R);
Serial.print (":");
Serial.print (led.G);
Serial.print (":");
Serial.println (led.B);
#endif
}
void fade()
{
byte r;
// pasos entre cada cambio
float tR, tG, tB;
// acumulador de pasos
float aR=0, aB=0, aG=0;
// diferencias entre colores inicial y final
int dR, dG, dB;
dR=cf.R-ci.R;
dG=cf.G-ci.G;
dB=cf.B-ci.B;
tR=255.0/abs(dR);
tG=255.0/abs(dG);
tB=255.0/abs(dB);
#ifdef DEBUG
Serial.println ("Distancias:");
Serial.print (dR);
Serial.print (":");
Serial.print (dG);
Serial.print (":");
Serial.println (dB);
Serial.println ("Pasos:");
Serial.print (tR);
Serial.print (":");
Serial.print (tG);
Serial.print (":");
Serial.println (tB);
#endif
for (r = 0; r < 255; r++)
{
if (aR<=r)
{
if (dR>0) led.R++;
if (dR<0) led.R--;
aR+=tR;
}
if (aG<=r)
{
if (dG>0) led.G++;
if (dG<0) led.G--;
aG+=tG;
}
if (aB<=r)
{
if (dB>0) led.B++;
if (dB<0) led.B--;
aB+=tB;
}
act();
//tiempo de espera
delay(tiempo);
}
//Correcccion final, puede fallar de +/- 1 por tema de decimales
led.R=cf.R;
led.G=cf.G;
led.B=cf.B;
act();
}
void setup()
{
Serial.begin(9600);
#if defined(DEBUG)
Serial.println("Test:");
led = {255,0,0};
act();
delay(500);
led = {0,255,0};
act();
delay(500);
led = {0,0,255};
act();
delay(500);
led = {0,0,0};
act();
#endif
}
void loop()
{
//Color Inicial
ci.R=0;
ci.G=200;
ci.B=255;
// Color Final deseado
cf.R=255;
cf.G=50;
cf.B=0;
// Para empezar ponemos los Leds al estado inicial
led.R=ci.R;
led.G=ci.G;
led.B=ci.B;
Serial.println("Inicio Fade");
fade();
Serial.println("Final Fade");
while (1);
}
GO_zalo queda perfecto. Por cierto creo que no he dicho que estoy haciendo un ciclo de dia para el belén.
Con eso he conseguido pasar de dia(ci) a atardecer(cf). Para hacer un anochecer ¿tendría que crear un cn(por ejemplo) con los valores para la noche?
Saludos
xMiguiDfx:
GO_zalo queda perfecto. Por cierto creo que no he dicho que estoy haciendo un ciclo de dia para el belén.
Con eso he conseguido pasar de dia(ci) a atardecer(cf). Para hacer un anochecer ¿tendría que crear un cn(por ejemplo) con los valores para la noche?
Saludos
puedes hacer un cf y modificar ligeramente el codigo o hacer simplemente
void loop()
{
//Color Inicial
ci.R=0;
ci.G=200;
ci.B=255;
// Color Final deseado
cf.R=255;
cf.G=50;
cf.B=0;
// Para empezar ponemos los Leds al estado inicial
led.R=ci.R;
led.G=ci.G;
led.B=ci.B;
Serial.println("Inicio atardecer");
fade();
Serial.println("Final atardecer");
//Color Inicial PONER AQUI EL COLOR FINAL ANTEIOR
ci.R=255;
ci.G=50;
ci.B=0;
// Color Final deseado
cf.R=xxx;
cf.G=xxx;
cf.B=xxx;
// Para empezar ponemos los Leds al estado inicial
led.R=ci.R;
led.G=ci.G;
led.B=ci.B;
Serial.println("Inicio anochecer");
fade();
Serial.println("Final anochecer");
while (1);
}