Duda con salidas pwm

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

Codigo:

#define PINROJO 11
#define PINVERDE 10
#define PINAZUL 9
#define FADE 10

void setup() {
pinMode(PINROJO, OUTPUT);
pinMode(PINVERDE, OUTPUT);
pinMode(PINAZUL, OUTPUT);
}

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

Yo haría un solo bucle con 255 iteraciones

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

Puff, no me he enterado de nada jajajaj
Soy bastante nuevo en esto. ¿Un resumen mas sencillo por favor?
Saludos y gracias

Lo que te respondió go_zalo esta claro pero veamos esto.
No hay manera que cambies las 3 salidas a la vez salvo que hagas esto

void rgb(byte rojo, byte verde, byte azul){
        analogWrite(PINROJO, rojo);
        analogWrite(PINVERDE, verde);
        analogWrite(PINAZUL, azul);
}

cada vez que quieras cambiar el color escribes

rgb(0,200,255); y tienes tu color de arranque

y de ahi sigues
a por ejemplo dos colores que cambio a la vez

rgb(100,100,255);

Ok, muchisimas gracias! Lo probare mañana y comento resultado.
Saludos

Agregale a la rutina rgb(rojo, verde, azul) el delay(FADE) si te parece para mantener el efecto.

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

}

Buah, increíble jaja. Lo voy a estudiar un poco para entenderlo bien y poder hacer mas cambios de color.
Gracias de verdad

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

}

Perfecto GO_Zalo. Ya lo tengo
Aquí te dejo un vídeo de como queda

Saludos y muchas gracias