Control rgb led by comparing rgb led pin values

Hi, eveyone, nice to meet you.
I am learning arduino, i need help with this code, please.


#define Led RGB
#define led1
#define led2
#define pulsadoravanzar
void setup() {
  Serial.begin(9600);
  // Añadir a través de la función pin mode los pines digitales
  //Led rgb
    pinMode(LED[contador],OUTPUT);
    pinMode(red,OUTPUT);
    pinMode(green,OUTPUT);
    pinMode(blue,OUTPUT);

  
  

//generar un valor random entre los leds y el pulsador
randomSeed(analogRead(0));

  pinMode(led1,OUTPUT);
  pinMode(led2,OUTPUT);
  //Pulsador
  pinMode(pulsadoravanzar,INPUT);
  
}

void loop() {
  //leer valor del potenciometro de 0 y 1
  valorpul = digitalRead(6); //leer valor del pin donde se encuentra el pulsador
  Serial.println( valorpul);//muestreo en el monitor de serie el valor que viene del pulsador
  digitalWrite(13,valorpul);
  delay(10);

//generar valores aleatorios

byte valorR = random(0,256);
byte valorG = random(0,256);
byte valorB = random(0,256);

analogWrite(red,valorR);
analogWrite(green,valorG);
analogWrite(blue,valorB);
delay(100);

//random para elegir color de led con el pulsador
if (pulsadoravanzar == LOW == 0){
  valorpul = 0; //cambia de estado si se presiona el pulsador
} 
if (pulsadoravanzar == HIGH && valorpul == 1){
  valorpul = 1; //se reinicia la variable del antirrebote
  contador++; //el contador aumenta en una unidad

if (contador > 5){
  contador = 0; //se reinicia el contador regresando al LED 1
  }
}



switch (contador){
//encender los Leds de acuerdo al contador
case 0:
//Declarar condición que sucede si el valor del pulsador es 1, es decir se enciende
if (digitalRead (pulsadoravanzar) ==1){
 
  delay(3000);
    analogWrite(red,LOW);
    delay(2000);
  analogWrite(green,LOW);
  delay(2000);
  analogWrite(blue,LOW);
  delay(2000);
   
}
//Volver a iniciar led rgb random
analogWrite(red,random(255));
analogWrite(green,random(255));
analogWrite(blue,random(255));
delay(100);

break;

case 1:

break;

}

**//Corregir **
**if (digitalRead (pulsadoravanzar) ==1)  {**
**  digitalRead (valorR) > (valorG);**
**  digitalWrite (led1, HIGH);**
**  **
**}**
**if (digitalRead (pulsadoravanzar) ==1) {**
**  digitalRead (valorR) < (valorG);**
**  digitalWrite (led1, LOW);**
**}**
**if (digitalRead (pulsadoravanzar) ==1) {**
**  digitalRead (valorG) > (valorR);**
**  digitalWrite (led2, HIGH);**
**}**
**if ( digitalRead (valorG) < (valorR) ) {**
**  digitalWrite (led2, LOW);**
**  **
**}**

**if (digitalRead (valorG) == (valorR) ) {**
**  digitalWrite (led1, LOW);**
**  digitalWrite (led2, LOW);**
  
}

Is this my question?
How to execute if I press the button:

  1. if the red rgb value is greater than the green rgb value turn on led1
  2. if the green rgb value is greater than the red rgb value turn on led2
  3. If the red rgb value and green rgb value are equal, turn off led1 and led2

thank you

Please start by posting a sketch that compiles

1 Like

Excuse me, I'm new to the forum and I'm learning basic Arduino principles.

You made many lines of your code "bold" (see the pairs of asterisks **). Remove those and reformat your code to be used for testing. Thank you.

I am going to go through your code line by line...

Here is line 1.

#define Led RGB

This only defines one set of three letters to another set of three letters. RGB carries no meaning to the compiler. You never use RGB. What were your thoughts and intentions for this line?

Lines 2, 3, 4

#define led1
#define led2
#define pulsadoravanzar

I see these labels will be used later in your program to reference pin numbers. You will need to have those pin numbers in the #define statement, like this... and use comments to say what you are doing

#define led1 11 // LED anode on pin 11
#define led2 12 // LED anode on pin 12
#define pulsadoravanzar 2 // button on pin 2 (change - I needed 6 for PWM)

Lines 4, 5, 6, 7

void setup() { // good
  Serial.begin(9600); // good
  pinMode(LED[contador], OUTPUT); // "LED" not defined, LED[array] not defined

Line 7 shows LED[contador] with neither label defined. I understand you wanted to include both "led1" and "led2" together, but leave arrays for later. You should make the single line look like these two lines...

  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);

Lines 8, 9, 10... labels red, green, blue, were not defined...

  pinMode(red, OUTPUT);
  pinMode(green, OUTPUT);
  pinMode(blue, OUTPUT);

You will need to go back to the configuration part of your sketch (below the #define) to assign value to these labels...

// (this line will have #define this that)
int red = 3; // red LED on pin 3
// int green = 4; // green LED on pin 4 // oops... these need to be PWM pins
int green = 5; // green LED on pin 5
int blue = 6; // blue LED on pin 6

The next lines you have led1 on 11, led2 on 12 and the button on pin 2... so they are good.

  randomSeed(analogRead(0)); // for a more random pseudo-randomness.
  pinMode(led1, OUTPUT); // pin 11 is an output pin
  pinMode(led2, OUTPUT); // pin 12 is an output pin
  pinMode(pulsadoravanzar, INPUT); // button as INPUT nominally 

Next lines... valorpul is missing its "type", it should work with a "local" type "int". The delay(10); is not useful.

void loop() {
  int valorpul = digitalRead(pulsadoravanzar); // "type" int of button on pin 2 (not a potentiometer)
  Serial.println( valorpul); // print the value of the button
  digitalWrite(13, valorpul); // show button value on LED_BUILTIN
  // delay(10); // not needed

These lines are good... they get send PWM values to the RGBLED color legs... r, g, b are PWM pins 3, 5, 6.

  byte valorR = random(0, 256);
  byte valorG = random(0, 256);
  byte valorB = random(0, 256);
  analogWrite(red, valorR);
  analogWrite(green, valorG);
  analogWrite(blue, valorB);

This line... it compiles and works, but must change... I understand you are comparing to zero...

  if (pulsadoravanzar == LOW == 0) {

... but it should look like this...

  if (pulsadoravanzar == LOW) {

The rest of the code "works"... when started, RGBLED shows random colors and the Serial monitor shows the state of the button pin. If the button is pressed, the LEDs at pin 11 and 12 briefly show the button state, while the BUILTIN_LED shows the state of the button and "valorpul" which holds the "pressed" state. The RGBLED then slowly sets the color legs to LOW, removing the color from the RGB, and keep this cycle. When the RGBLED is "black" and the button is being pressed, and released soon enough, the RGBLED goes back to random colors. If the button is not released soon enough, the RGBLED does the slow cycle of WYGBK.

Fin.

#define Led RGB
#define led1 11
#define led2 12
#define pulsadoravanzar 2
int red = 3;
int green = 5;
int blue = 6;
int contador;

void setup() {
  Serial.begin(9600);
  pinMode(red, OUTPUT);
  pinMode(green, OUTPUT);
  pinMode(blue, OUTPUT);
  randomSeed(analogRead(0));
  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);
  pinMode(pulsadoravanzar, INPUT);
}

void loop() {
  int valorpul = digitalRead(pulsadoravanzar);
  Serial.print(valorpul);
  digitalWrite(13, valorpul);

  byte valorR = random(0, 256);
  byte valorG = random(0, 256);
  byte valorB = random(0, 256);
  analogWrite(red, valorR);
  analogWrite(green, valorG);
  analogWrite(blue, valorB);

  if (pulsadoravanzar == LOW) {
    valorpul = 0; //cambia de estado si se presiona el pulsador
  }
  if (pulsadoravanzar == HIGH && valorpul == 1) {
    valorpul = 1; //se reinicia la variable del antirrebote
    contador++; //el contador aumenta en una unidad
    if (contador > 5) {
      contador = 0; //se reinicia el contador regresando al LED 1
    }
  }
  switch (contador) {
    //encender los Leds de acuerdo al contador
    case 0:
      //Declarar condición que sucede si el valor del pulsador es 1, es decir se enciende
      if (digitalRead (pulsadoravanzar) == 1) {
        delay(3000);
        analogWrite(red, LOW);
        delay(2000);
        analogWrite(green, LOW);
        delay(2000);
        analogWrite(blue, LOW);
        delay(2000);
      }
      //Volver a iniciar led rgb random
      analogWrite(red, random(255));
      analogWrite(green, random(255));
      analogWrite(blue, random(255));
      delay(100);
      break;
    case 1:
      break;
  }
  //Corregir
  if (digitalRead (pulsadoravanzar) == 1)  {
    digitalRead (valorR) > (valorG);
    digitalWrite (led1, HIGH);
  }
  if (digitalRead (pulsadoravanzar) == 1) {
    digitalRead (valorR) < (valorG);
    digitalWrite (led1, LOW);
  }
  if (digitalRead (pulsadoravanzar) == 1) {
    digitalRead (valorG) > (valorR);
    digitalWrite (led2, HIGH);
  }
  if ( digitalRead (valorG) < (valorR) ) {
    digitalWrite (led2, LOW);
  }
  if (digitalRead (valorG) == (valorR) ) {
    digitalWrite (led1, LOW);
    digitalWrite (led2, LOW);
  }
}
1 Like

Hello, nice to meet you.
There are many parts of the code that are correct correct
Much of the code is correct

//Circuito Led rgb y pulsador
//leds
//Led rgb
const byte red = 9;
const byte green = 10;
const byte blue = 11;

int LED[]={9,10,11};
int i;


// Led rojo y verde
int led1 = 7;
int led2 = 8;
//Pulsador

int pulsadoravanzar = 6;
int valorpul = 0;
int contador;




void setup() {
  Serial.begin(9600);
  // Añadir a través de la función pin mode los pines digitales
  //Led rgb
    pinMode(LED[contador],OUTPUT);
    pinMode(red,OUTPUT);
    pinMode(green,OUTPUT);
    pinMode(blue,OUTPUT);

  
  

//generar un valor random entre los leds y el pulsador
randomSeed(analogRead(0));

  pinMode(led1,OUTPUT);
  pinMode(led2,OUTPUT);
  //Pulsador
  pinMode(pulsadoravanzar,INPUT);
  
}

void loop() {
  //leer valor del potenciometro de 0 y 1
  valorpul = digitalRead(6); //leer valor del pin donde se encuentra el pulsador
  Serial.println( valorpul);//muestreo en el monitor de serie el valor que viene del pulsador
  digitalWrite(13,valorpul);
  delay(10);

//generar valores aleatorios

byte valorR = random(0,256);
byte valorG = random(0,256);
byte valorB = random(0,256);

analogWrite(red,valorR);
analogWrite(green,valorG);
analogWrite(blue,valorB);
delay(100);

//random para elegir color de led con el pulsador
if (pulsadoravanzar == LOW == 0){
  valorpul = 0; //cambia de estado si se presiona el pulsador
} 
if (pulsadoravanzar == HIGH && valorpul == 1){
  valorpul = 1; //se reinicia la variable del antirrebote
  contador++; //el contador aumenta en una unidad

if (contador > 5){
  contador = 0; //se reinicia el contador regresando al LED 1
  }
}



switch (contador){
//encender los Leds de acuerdo al contador
case 0:
//Declarar condición que sucede si el valor del pulsador es 1, es decir se enciende
if (digitalRead (pulsadoravanzar) ==1){
 
  delay(3000);
    analogWrite(red,LOW);
    delay(2000);
  analogWrite(green,LOW);
  delay(2000);
  analogWrite(blue,LOW);
  delay(2000);
   
}
//Volver a iniciar led rgb random
analogWrite(red,random(255));
analogWrite(green,random(255));
analogWrite(blue,random(255));
delay(100);

break;

case 1:

break;

}

//I don`t understan this part 
if (digitalRead (pulsadoravanzar) ==1)  {
  digitalRead (valorR) > (valorG);
  digitalWrite (led1, HIGH);
  
}
if (digitalRead (pulsadoravanzar) ==1) {
  digitalRead (valorR) < (valorG);
  digitalWrite (led1, LOW);
}
if (digitalRead (pulsadoravanzar) ==1) {
  digitalRead (valorG) > (valorR);
  digitalWrite (led2, HIGH);
}
if ( digitalRead (valorG) < (valorR) ) {
  digitalWrite (led2, LOW);
  
}

if (digitalRead (valorG) == (valorR) ) {
  digitalWrite (led1, LOW);
  digitalWrite (led2, LOW);
  
}



}


Is it possible to control the lighting of a led (for example led1 and led2) by comparing the value of an rgb pin?

if the red rgb value is greater than the green rgb value, it turns on led1
if the green rgb value is greater than the red rgb value, it turns on led2
if the red rgb value and the green rgb value are equal, it turns off led1 and led2

Thank you so much

I am using an arduino UNO

analog pins 9,10,11 are PWM pins
on arduino UNO

Yes, these pins are PWM, but they are D.I.O. (Digital Input/Output) not Analog.

Do you want to use these pins 9, 10, 11 for RGBLED PWM and not 3, 5, 6?

You have perfectly used "pseudo code" where you describe your intentions. Learn how to translate your "pseudo code" into program code, and you have this...

if (valorR > valorG) 
  digitalWrite(led1, HIGH);
if (valorG > valorR)
  digitalWrite(led2, HIGH);
if (valorR == valorG) {
  digitalWrite(led1, LOW);
  digitalWrite(led2, LOW);
}
1 Like

Hello geovannysrbalper

What is the task of the sketch in real life?

1 Like

Yes, of course.
I used two structures for these pins because I didn't know how to do the random with the first structure

const byte red = 9;
const byte green = 10;
const byte blue = 11;

int LED[]={9,10,11};

No, you did not. There were no structures. You can add structures now.

Described in post #4, the long paragraph.

1 Like

Hello @paulpaulson, nice to meet you.
In real life two actions have to happen:


switch (contador){
//encender los Leds de acuerdo al contador
case 0:
//Declarar condición que sucede si el valor del pulsador es 1, es decir se enciende
if (digitalRead (pulsadoravanzar) ==1){
 
  delay(3000);
    analogWrite(red,LOW);
    delay(2000);
  analogWrite(green,LOW);
  delay(2000);
  analogWrite(blue,LOW);
  delay(2000);
   
}
//Volver a iniciar led rgb random
analogWrite(red,random(255));
analogWrite(green,random(255));
analogWrite(blue,random(255));
delay(100);

break;

and compare at the same time the values ​​of the red and green pin of the rgb led to turn on or off led1 and led 2

```//I don`t understan this part 
if (digitalRead (pulsadoravanzar) ==1)  {
  digitalRead (valorR) > (valorG);
  digitalWrite (led1, HIGH);
  
}
if (digitalRead (pulsadoravanzar) ==1) {
  digitalRead (valorR) < (valorG);
  digitalWrite (led1, LOW);
}
if (digitalRead (pulsadoravanzar) ==1) {
  digitalRead (valorG) > (valorR);
  digitalWrite (led2, HIGH);
}
if ( digitalRead (valorG) < (valorR) ) {
  digitalWrite (led2, LOW);
  
}

if (digitalRead (valorG) == (valorR) ) {
  digitalWrite (led1, LOW);
  digitalWrite (led2, LOW);
  
}

thank you

That is not your post. What @paulpaulson is wanting to know why you want to light LEDs in this fashion?
Is it a class assignment?

That is not all.
On a Uno you have pins 11, 10, 9, as well as pins 6, 5, and 3.

Sadly all of your code has to be correct before it stands a chance of working.

You might want to look at this How to get the best out of this forum before you proceed any further.

It tells you how to ask a question and how to respond.

There is no need for a new post for everyone you want to reply to. Just use a quote from the post you want reply to, or mention the users name with a @ symbol in front of it.

1 Like

Disculpa, espero poder expresarme correctamente.
Primero
yo quiero presionar el boton y que suceda una accion en el led rgb

switch (contador){
//encender los Leds de acuerdo al contador
case 0:
//Declarar condición que sucede si el valor del pulsador es 1, es decir se enciende
if (digitalRead (pulsadoravanzar) ==1){
 
  delay(3000);
    analogWrite(red,LOW);
    delay(2000);
  analogWrite(green,LOW);
  delay(2000);
  analogWrite(blue,LOW);
  delay(2000);
   
}
//Volver a iniciar led rgb random
analogWrite(red,random(255));
analogWrite(green,random(255));
analogWrite(blue,random(255));
delay(100);

break;

Is it necessary to use a switch?

Second
I want that when pressing the same button (pin6), it compares the random values ​​of the rgb led and turns on or off led1 or led2

if (digitalRead (pulsadoravanzar) ==1)  {
  digitalRead (valorR) > (valorG);
  digitalWrite (led1, HIGH);
  
}
if (digitalRead (pulsadoravanzar) ==1) {
  digitalRead (valorR) < (valorG);
  digitalWrite (led1, LOW);
}
if (digitalRead (pulsadoravanzar) ==1) {
  digitalRead (valorG) > (valorR);
  digitalWrite (led2, HIGH);
}
if ( digitalRead (valorG) < (valorR) ) {
  digitalWrite (led2, LOW);
  
}

if (digitalRead (valorG) == (valorR) ) {
  digitalWrite (led1, LOW);
  digitalWrite (led2, LOW);
  
}


Read post #10.

Your code in Post 18 is a non-working mess.

Do you not read the replies? Read post #10.

1 Like

hello @xfpd , nice to meet you.
I used this structure and it works, thanks

if (digitalRead (pulsadoravanzar) ==1){
if (valorR > valorG){
digitalWrite(led1, HIGH);
digitalWrite(led2, LOW);
} 
  
if (valorG > valorR){
  digitalWrite(led1, LOW);
  digitalWrite(led2, HIGH);
  }
if (valorR == valorG) {
  digitalWrite(led1, LOW);
  digitalWrite(led2, LOW);
}
}