¿Por qué disminuye la intensidad de iluminación en los LED´s RGB?

Saludos a la comunidad Arduino.

Tengo la siguiente programación en dónde los LED iluminan muy bien.


int R_C = 2;
int G_C = 3;
int B_C =  4;

int R_C_SOST = 5;
int G_C_SOST = 6;
int B_C_SOST =  7;

int R_D=8; 
int G_D=9;
int B_D=10;

int R=11;
int G_D_S=12;
int B_D_S=13;

int R_E=22;
int G_E=23;
int B_E=24;


int R_F=25;
int G_F=26;
int B_F=27;

int R_F_S=28;
int G_F_S=29;
int B_F_S=30;

int R_G=31;
int G_G=32;
int B_G=33;

int R_G_S=34;
int G_G_S=35;
int B_G_S=36;


int R_A=37;
int G_A=38;
int B_A=39;

int R_A_S=40;
int G_A_S=41;
int B_A_S=42;


int RED_B=43;
int GREEN_B=44;
int BLUE_B=45;

byte N = 0;

void setup() {
  pinMode(N, INPUT);
 pinMode(R_C, OUTPUT);
pinMode(G_C, OUTPUT ); 
pinMode(B_C, OUTPUT); 

pinMode(R_C_S, OUTPUT);
pinMode(G_C_S, OUTPUT ); 
pinMode(B_C_S, OUTPUT);

pinMode(R_D, OUTPUT);
pinMode(G_D, OUTPUT );
pinMode(B_D, OUTPUT); 

pinMode(R_D_S, OUTPUT);
pinMode(G_D_S, OUTPUT ); 
pinMode(B_D_S, OUTPUT); 

pinMode(R_E, OUTPUT);
pinMode(G_E, OUTPUT );
pinMode(B_E, OUTPUT); 

pinMode(R_F, OUTPUT);
pinMode(G_F, OUTPUT );
pinMode(B_F, OUTPUT);

pinMode(R_F_S, OUTPUT);
pinMode(G_F_S, OUTPUT );  
pinMode(B_F_S, OUTPUT);

pinMode(R_G, OUTPUT);
pinMode(G_G, OUTPUT );
pinMode(B_G, OUTPUT);

pinMode(R_G_S, OUTPUT);
pinMode(G_G_S, OUTPUT );  
pinMode(B_G_S, OUTPUT);

pinMode(R_A, OUTPUT);
pinMode(G_A, OUTPUT );
pinMode(B_A, OUTPUT);

pinMode(R_A_S, OUTPUT);
pinMode(G_A_S, OUTPUT );
pinMode(B_A_S, OUTPUT);

pinMode(R_B, OUTPUT);
pinMode(G_B, OUTPUT );
pinMode(B_B, OUTPUT); 
 

Serial.begin(9600);

}

void loop() {
  if(Serial.available()> 0){
    N = Serial.read();
  }
  

  if (N == 0x5A){
 
    analogWrite(R_C,255);
    analogWrite(G_C, 0);
    analogWrite(B_C, 0); 

    analogWrite(R_C_S,0);
    analogWrite(G_C_S, 0);
    analogWrite(B_C_S, 0); 

    analogWrite(R_D,0);
    analogWrite(G_D, 0);
    analogWrite(B_D, 255);

    analogWrite(R_D_S,0);          
    analogWrite(G_D_S, 0);
    analogWrite(B_D_S, 0);

    analogWrite(R_E,0);
    analogWrite(G_E, 0);
    analogWrite(B_E, 255);

    analogWrite(R_F,0);
    analogWrite(G_F, 0);
    analogWrite(B_F, 255);

    analogWrite(R_F_S,0);
    analogWrite(G_F_S, 0);
    analogWrite(B_F_SOST, 0);

    analogWrite(R_G, 0);
    analogWrite(G_G, 0);
    analogWrite(B_G, 255);

    analogWrite(R_G_S, 0);
    analogWrite(G_G_S, 0);
    analogWrite(B_G_S, 0);

    analogWrite(R_A, 0);
    analogWrite(G_A, 0);
    analogWrite(B_A, 255);

    analogWrite(R_A_S, 0);
    analogWrite(G_A_S, 0);
    analogWrite(B_A_S, 0);

    analogWrite(R_B, 0);
    analogWrite(G_B, 0);
    analogWrite(B_B, 255); // 
}
else
{

    analogWrite(R_C, 0);
    analogWrite(G_C, 0);
    analogWrite(B_C, 0); 

    analogWrite(R_C_S,0);
    analogWrite(G_C_S, 0);
    analogWrite(B_C_S, 0); 

    analogWrite(R_D,0);
    analogWrite(G_D, 0);
    analogWrite(B_D, 0);

    analogWrite(R_D_S,0);          
    analogWrite(G_D_S, 0);
    analogWrite(B_D_S, 0);

    analogWrite(R_E,0);
    analogWrite(G_E, 0);
    analogWrite(B_E, 0);

    analogWrite(R_F,0);
    analogWrite(G_F, 0);
    analogWrite(B_F, 0);

    analogWrite(R_F_S,0);
    analogWrite(G_F_S, 0);
    analogWrite(B_F_SOST, 0);

    analogWrite(R_G, 0);
    analogWrite(G_G, 0);
    analogWrite(B_G, 0);

    analogWrite(R_G_S, 0);
    analogWrite(G_G_S, 0);
    analogWrite(B_G_S, 0);

    analogWrite(R_A, 0);
    analogWrite(G_A, 0);
    analogWrite(B_A, 0);

    analogWrite(R_A_S, 0);
    analogWrite(G_A_S, 0);
    analogWrite(B_A_S, 0);

    analogWrite(R_B, 0);
    analogWrite(G_B, 0);
    analogWrite(B_B, ); 

}
}

Con esa programación los LED encienden con buena iluminación. EL detalle es que si sigo agregando más if y else la iluminación de los LED disminuyen mucho. Por ejemplo:

int R_C = 2;
int G_C = 3;
int B_C =  4;

int R_C_SOST = 5;
int G_C_SOST = 6;
int B_C_SOST =  7;

int R_D=8; 
int G_D=9;
int B_D=10;

int R=11;
int G_D_S=12;
int B_D_S=13;

int R_E=22;
int G_E=23;
int B_E=24;


int R_F=25;
int G_F=26;
int B_F=27;

int R_F_S=28;
int G_F_S=29;
int B_F_S=30;

int R_G=31;
int G_G=32;
int B_G=33;

int R_G_S=34;
int G_G_S=35;
int B_G_S=36;


int R_A=37;
int G_A=38;
int B_A=39;

int R_A_S=40;
int G_A_S=41;
int B_A_S=42;


int RED_B=43;
int GREEN_B=44;
int BLUE_B=45;

byte N = 0;

void setup() {
  pinMode(N, INPUT);
 pinMode(R_C, OUTPUT);
pinMode(G_C, OUTPUT ); 
pinMode(B_C, OUTPUT); 

pinMode(R_C_S, OUTPUT);
pinMode(G_C_S, OUTPUT ); 
pinMode(B_C_S, OUTPUT);

pinMode(R_D, OUTPUT);
pinMode(G_D, OUTPUT );
pinMode(B_D, OUTPUT); 

pinMode(R_D_S, OUTPUT);
pinMode(G_D_S, OUTPUT ); 
pinMode(B_D_S, OUTPUT); 

pinMode(R_E, OUTPUT);
pinMode(G_E, OUTPUT );
pinMode(B_E, OUTPUT); 

pinMode(R_F, OUTPUT);
pinMode(G_F, OUTPUT );
pinMode(B_F, OUTPUT);

pinMode(R_F_S, OUTPUT);
pinMode(G_F_S, OUTPUT );  
pinMode(B_F_S, OUTPUT);

pinMode(R_G, OUTPUT);
pinMode(G_G, OUTPUT );
pinMode(B_G, OUTPUT);

pinMode(R_G_S, OUTPUT);
pinMode(G_G_S, OUTPUT );  
pinMode(B_G_S, OUTPUT);

pinMode(R_A, OUTPUT);
pinMode(G_A, OUTPUT );
pinMode(B_A, OUTPUT);

pinMode(R_A_S, OUTPUT);
pinMode(G_A_S, OUTPUT );
pinMode(B_A_S, OUTPUT);

pinMode(R_B, OUTPUT);
pinMode(G_B, OUTPUT );
pinMode(B_B, OUTPUT); 
 

Serial.begin(9600);

}

void loop() {
  if(Serial.available()> 0){
    N = Serial.read();
  }
  

  if (N == 0x5B){
 
    analogWrite(R_C,0);
    analogWrite(G_C, 255);
    analogWrite(B_C, 0); 

    analogWrite(R_C_S,0);
    analogWrite(G_C_S, 255);
    analogWrite(B_C_S, 0); 

    analogWrite(R_D,0);
    analogWrite(G_D, 0);
    analogWrite(B_D, 0);

    analogWrite(R_D_S,0);          
    analogWrite(G_D_S, 0);
    analogWrite(B_D_S, 0);

    analogWrite(R_E,0);
    analogWrite(G_E, 255);
    analogWrite(B_E, 0);

    analogWrite(R_F,0);
    analogWrite(G_F, 255);
    analogWrite(B_F, 0);

    analogWrite(R_F_S,0);
    analogWrite(G_F_S, 0);
    analogWrite(B_F_SOST, 0);

    analogWrite(R_G, 255);
    analogWrite(G_G, 0);
    analogWrite(B_G, 0);

    analogWrite(R_G_S, 0);
    analogWrite(G_G_S, 0);
    analogWrite(B_G_S, 0);

    analogWrite(R_A, 255);
    analogWrite(G_A, 0);
    analogWrite(B_A, 0);

    analogWrite(R_A_S, 0);
    analogWrite(G_A_S, 0);
    analogWrite(B_A_S, 255);

    analogWrite(R_B, 0);
    analogWrite(G_B, 0);
    analogWrite(B_B, 0); // 
}
else
{

    analogWrite(R_C, 0);
    analogWrite(G_C, 0);
    analogWrite(B_C, 0); 

    analogWrite(R_C_S,0);
    analogWrite(G_C_S, 0);
    analogWrite(B_C_S, 0); 

    analogWrite(R_D,0);
    analogWrite(G_D, 0);
    analogWrite(B_D, 0);

    analogWrite(R_D_S,0);          
    analogWrite(G_D_S, 0);
    analogWrite(B_D_S, 0);

    analogWrite(R_E,0);
    analogWrite(G_E, 0);
    analogWrite(B_E, 0);

    analogWrite(R_F,0);
    analogWrite(G_F, 0);
    analogWrite(B_F, 0);

    analogWrite(R_F_S,0);
    analogWrite(G_F_S, 0);
    analogWrite(B_F_SOST, 0);

    analogWrite(R_G, 0);
    analogWrite(G_G, 0);
    analogWrite(B_G, 0);

    analogWrite(R_G_S, 0);
    analogWrite(G_G_S, 0);
    analogWrite(B_G_S, 0);

    analogWrite(R_A, 0);
    analogWrite(G_A, 0);
    analogWrite(B_A, 0);

    analogWrite(R_A_S, 0);
    analogWrite(G_A_S, 0);
    analogWrite(B_A_S, 0);

    analogWrite(R_B, 0);
    analogWrite(G_B, 0);
    analogWrite(B_B, ); 

}
 if (N == 0x5A){
 
    analogWrite(R_C,255);
    analogWrite(G_C, 0);
    analogWrite(B_C, 0); 

    analogWrite(R_C_S,0);
    analogWrite(G_C_S, 0);
    analogWrite(B_C_S, 0); 

    analogWrite(R_D,0);
    analogWrite(G_D, 0);
    analogWrite(B_D, 255);

    analogWrite(R_D_S,0);          
    analogWrite(G_D_S, 0);
    analogWrite(B_D_S, 0);

    analogWrite(R_E,0);
    analogWrite(G_E, 0);
    analogWrite(B_E, 255);

    analogWrite(R_F,0);
    analogWrite(G_F, 0);
    analogWrite(B_F, 255);

    analogWrite(R_F_S,0);
    analogWrite(G_F_S, 0);
    analogWrite(B_F_SOST, 0);

    analogWrite(R_G, 0);
    analogWrite(G_G, 0);
    analogWrite(B_G, 255);

    analogWrite(R_G_S, 0);
    analogWrite(G_G_S, 0);
    analogWrite(B_G_S, 0);

    analogWrite(R_A, 0);
    analogWrite(G_A, 0);
    analogWrite(B_A, 255);

    analogWrite(R_A_S, 0);
    analogWrite(G_A_S, 0);
    analogWrite(B_A_S, 0);

    analogWrite(R_B, 0);
    analogWrite(G_B, 0);
    analogWrite(B_B, 255); // 
}
else
{

    analogWrite(R_C, 0);
    analogWrite(G_C, 0);
    analogWrite(B_C, 0); 

    analogWrite(R_C_S,0);
    analogWrite(G_C_S, 0);
    analogWrite(B_C_S, 0); 

    analogWrite(R_D,0);
    analogWrite(G_D, 0);
    analogWrite(B_D, 0);

    analogWrite(R_D_S,0);          
    analogWrite(G_D_S, 0);
    analogWrite(B_D_S, 0);

    analogWrite(R_E,0);
    analogWrite(G_E, 0);
    analogWrite(B_E, 0);

    analogWrite(R_F,0);
    analogWrite(G_F, 0);
    analogWrite(B_F, 0);

    analogWrite(R_F_S,0);
    analogWrite(G_F_S, 0);
    analogWrite(B_F_SOST, 0);

    analogWrite(R_G, 0);
    analogWrite(G_G, 0);
    analogWrite(B_G, 0);

    analogWrite(R_G_S, 0);
    analogWrite(G_G_S, 0);
    analogWrite(B_G_S, 0);

    analogWrite(R_A, 0);
    analogWrite(G_A, 0);
    analogWrite(B_A, 0);

    analogWrite(R_A_S, 0);
    analogWrite(G_A_S, 0);
    analogWrite(B_A_S, 0);

    analogWrite(R_B, 0);
    analogWrite(G_B, 0);
    analogWrite(B_B, ); 

}
}

Y así puedo seguir agregando más if y else digamos unas cuatro veces más de ambos, como en el ejemplo de arriba y la iluminación disminuye, Podrían indicarme que hice mal en la programación?

PD Tengo el cátodo común con una resistencia en serie. DE antemano gracias.

Hola @danielhernandez2302
¿Cuál es el propósito de esto?

RV mineirin

RV mineirin

Saludos.

El propósito de N es guardar una variable en Hexadecimal, por lo tanto N ha sido declarada como una entrada.

Hola
INPUT y OUTPUT son declaraciones para los pines arduino y definen si se usarán como entrada o salida.
Una variable no se define como entrada o salida.

RV mineirin

Syntax

analogWrite(pin, value)

Al margen de lo que te marcó @ruilviana el problema es que el código está más tiempo apagando los LEDs que lo que están encendidos.

Fíjate...
Verificas si N tiene tal valor y sino apagas los LEDs.
Luego verificas si N tiene tal otro y sino apagas todo de nuevo.
Y cuanto más verifiques mas apagados agreguas peor se va a comportar.

Tienes que usar else if().
Entonces, verificas if() N tiene tal valor, else if() tal otro, else if() otro más, else apagas todo.

O sea, vas verificando si tiene un valor, sino otro, sino otro, y por último si ninguno coincidió apagas

¿Se entiende la idea?

1 Like

Entiendo, Gracias, eso resolverá que los LEDS iluminen con Mayor intensidad?

Para que un led se visualice con mas intesidad o para que brille al máximo debes usar

analogWrite(pin, 255);

Eso es máximo brillo, ahora, si tienes multiples if y else que niegan situaciones que me parece a priori que estan de mas.
La programación debe ser limpia.
SI es tal cosa hago esto
Si es tal otra lo otro
Si no es ninguna de las anteriores entonces apagados.

Lo mejor es un switch(N) case
cada case hará lo que deba o con el brillo que pretendes.
y si no es ningúno entonces usas default: y ahi apagas.

Ademas puedes simplificar un poco la programación que es demasiada larga.
Ya te diré como.

Lo del brillo lo hace bien

analogWrite(R_C,255);

Lo de switch() fue lo primero que pensé pero no me pareció que hacerle cambiar todo el código ayudara a que entendiera que el problema era que debía usar else if() (en el código tal y como está planteado).

Acá esta mi versión que pretende solamente hacerte mas simple las cosas y mas visuales.
Tantos analogWrite() confunden cuando quieres hacer cambios.
Tal vez la matriz de 3 dimensiones te resulte complicada pero si la miras tiene la secuecia RGB que quieres para tus 12 casos.
El programa compila.
Agrega en cada case hexa lo que desees hacer y agrega una secuencia mas con lo que debes incrementar el primer indice de 2 a 3 y lo que corresponda.

struct RGB {
    byte R;
    byte G;
    byte B;
};

RGB rgb[12]= {{ 2, 3, 4},
              { 5, 6, 7},
              { 8, 9,10},
              {11,12,13},
              {22,23,24},
              {25,26,27},
              {28,29,30},
              {31,32,33},
              {34,35,36},
              {37,38,39},
              {40,41,42},
              {43,44,45}
};

byte secuencia[2][12][3] = {
                            {
                              {  0,255,  0},{  0,255,  0},{  0,  0,  0},{  0,  0,  0},{  0,255,  0},{  0,255,  0},{  0,  0,  0},{255,  0,  0},{  0,  0,  0},{255,  0,  0},{  0,  0,255},{  0,  0,  0}
                            },
                            {
                              {255,  0,  0},{  0,  0,  0},{  0,  0,255},{  0,  0,  0},{  0,  0,255},{  0,  0,255},{  0,  0,  0},{  0,  0,255},{  0,  0,  0},{  0,  0,255},{  0,  0,  0},{  0,  0,255}
                            }
                           };
byte N = 0;

void setup() {
  pinMode(N, INPUT);

  for (int i=0; i<11; i++) {
      pinMode(rgb[i].R, OUTPUT);
      pinMode(rgb[i].G, OUTPUT);
      pinMode(rgb[i].B, OUTPUT);
  }
  Serial.begin(9600);

}

void loop() {
  if (Serial.available() > 0) {
      N = Serial.read();
      switch (N) {
        case 0x5B: 
                  for (int i=0; i<11; i++) {
                       analogWrite(rgb[i].R, secuencia[0][i][0]);
                       analogWrite(rgb[i].G, secuencia[0][i][1]);
                       analogWrite(rgb[i].B, secuencia[0][i][2]);
                  }
                  break;
          case 0x5A: 
                  for (int i=0; i<11; i++) {
                       analogWrite(rgb[i].R, secuencia[1][i][0]);
                       analogWrite(rgb[i].G, secuencia[1][i][0]);
                       analogWrite(rgb[i].B, secuencia[1][i][0]);
                  }
                  break;
            default:
                  for (int i=0; i<11; i++) {
                       analogWrite(rgb[i].R, 0);
                       analogWrite(rgb[i].G, 0);
                       analogWrite(rgb[i].B, 0);
                  }
                  break;
      }
  }
}

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.