No enciende segundo LED

Muy buenas.

Este es mi primer mensaje y les pido ayuda.

Resulta que deseo controlar con mando a distancia (sea el que sea, porque puedo obtener los códigos vía serie) y mi problema es que no logro encender el segundo led.

Uso la librería IRRemote.
Lo estoy probando con Arduino Mega 2560, también probado en UNO y nada, solo enciendo el primer código con el mando al primer led, el segundo no hay forma, recibe la información de la tecla pulsada pero no enciende el segundo led.

Este es el código usado;

        //incluimos la librería de IRremote

        #include <IRremote.h>
        #include <IRremoteInt.h>
        
        int RECV_PIN = 11; //Definimos el pin donde tiene que esta el IR
        IRrecv irrecv(RECV_PIN);
        decode_results results;

        //declaramos contantes
        int pinLed = 26;
        int pinLed2 = 28;
        //declaramos variables
        int ValorIR = 0; //declaramos variable almacen valor inr
        int estadoLed = 0;
        int estadoLed2 = 0;
     
     
        void setup()
        {
        Serial.begin(9600);             //Ponemos el puerto serie a 9600
        Serial.println("Listo para recibir códigos!");  // Mensaje
        irrecv.enableIRIn();            // el receptor ir en funcionamiento
        pinMode(pinLed, OUTPUT);       //definimos el pin del led como de salida
        pinMode(pinLed2, OUTPUT);      //definimos el pin del led2 como de salida
        }
        //definimos una función llamada "leerIR" esto nos ayuda a que en el futuro podamos reutilizarla.
        //no tiene parámetros de entra y devuelve un INT
        int leerIR(){
        if (irrecv.decode(&results)) { // si recibe señal IR
            int lectura = results.value; //Guarda el valor de la señal en la variable lectura
            irrecv.resume(); // Recive siguiente valor IR
            Serial.println(lectura); // Ponemos HEX para Hexadecimal o nada o DEC decimal
            return lectura; //devuelve lectura
        }       
   }
   
   // Programa bucle
   
        void loop() {
          ValorIR=leerIR(); //asignamos a esa variable el valor que devuelve al leerIR
          if (ValorIR == 18615){ //comprobamos el codigo recibido tecla mando PR+
            if (estadoLed == 0){ //comprobamos si el led está encendido
              digitalWrite(pinLed, HIGH); //lo encendemos
              estadoLed = 1; //marcamos como que está encendido
                    
         }
            else{ //si no está apagado es que esta encendido
              digitalWrite(pinLed, LOW); //lo apagamo
              estadoLed=0; //marcamos como apagado el primer led
         }
             
        // ===============================      
           ValorIR=leerIR(); //asignamos a esa variable el valor que devuelve al leerIR
           if (ValorIR == 8415){ //comprobamos el codigo recibido tecla mando PR-
            if (estadoLed2 == 0){ //comprobamos si el led está encendido
              digitalWrite(pinLed2, HIGH); //lo encendemos
              estadoLed2 = 1; //marcamos como que está encendido                         
         }
          
        //=========================================          
             
             else{ //si no está apgado es que esta endendico
              digitalWrite(pinLed2, LOW); //lo apagamo
              estadoLed2 = 0; //Marcamos como apagado el segundo led
         }
        }      
       }                
      }

Espero sus amables sugerencias.
Gracias y saludos.

//incluimos la librería de IRremote

#include <IRremote.h>
#include <IRremoteInt.h>

int RECV_PIN      = 11; //Definimos el pin donde tiene que esta el IR
IRrecv irrecv(RECV_PIN);
decode_results results;

//declaramos contantes
int pinLed1       = 26;
int pinLed2       = 28;
//declaramos variables
int ValorIR       = 0; //declaramos variable almacen valor inr
int estadoLed     = 0;
int estadoLed2    = 0;


//definimos una función llamada "leerIR" esto nos ayuda a que en el futuro podamos reutilizarla.
//no tiene parámetros de entra y devuelve un INT

int leerIR(){
  if (irrecv.decode(&results)) { // si recibe señal IR
      int lectura = results.value; //Guarda el valor de la señal en la variable lectura
      irrecv.resume(); // Recive siguiente valor IR
      Serial.println(lectura); // Ponemos HEX para Hexadecimal o nada o DEC decimal
      return lectura; //devuelve lectura
  }       
}

void setup()  {
  Serial.begin(9600);             //Ponemos el puerto serie a 9600
  Serial.println("Listo para recibir códigos!");  // Mensaje
  irrecv.enableIRIn();            // el receptor ir en funcionamiento
  pinMode(pinLed1, OUTPUT);       //definimos el pin del led como de salida
  pinMode(pinLed2, OUTPUT);      //definimos el pin del led2 como de salida
}

// Programa bucle
void loop() {

    ValorIR = leerIR();                 //asignamos a esa variable el valor que devuelve al leerIR
    switch(ValorIR) {
      case 18615:                       //comprobamos el codigo recibido tecla mando PR+
        Serial.println("mando PR+);
        if (estadoLed == 0){            //comprobamos si el led está encendido
           digitalWrite(pinLed1, HIGH);  //lo encendemos
           estadoLed = 1;               //marcamos como que está encendido
        }
        else {                          //si no está apagado es que esta encendido
           digitalWrite(pinLed1, LOW);   //lo apagamo
           estadoLed = 0;               //marcamos como apagado el primer led
        }
        break;
       
      case 8415:                        //comprobamos el codigo recibido tecla mando PR-
        Serial.println("mando PR-);
        if (estadoLed2 == 0){           //comprobamos si el led está encendido
           digitalWrite(pinLed2, HIGH); //lo encendemos
           estadoLed2 = 1;              //marcamos como que está encendido                         
        }
        else {                          //si no está apgado es que esta endendico
           digitalWrite(pinLed2, LOW);  //lo apagamo
           estadoLed2 = 0;              //Marcamos como apagado el segundo led
        }
        break;
    }                    
}

Comprueba que recibe el 2do código.

Buenas.

Efectivamente funciona correctamente con tu código surbyte, muchas gracias. Lo voy a estudiar a fondo comparándolo con mi código del error que hace que no me funcionará.

A todo esto te comento que la función de la cual me interesaba muy mucho este código, es una vez enviada la activación de la tecla el led se queda encendido y volviendo a pulsar la misma tecla el led se apaga por lo tanto es muy interesante ya que me ahorro de tener dos teclas una para que encienda y otra que apague el mismo led.

Vuelvo a darte las gracias.
Saludos. :slight_smile:

Basicamente no tienes mucho que investigar. Es tu mismo código algo mas ordenado usando switch. switch es como una versión prolija del if cuando como en tu caso repites cosas con la misma variable. switch es como un conmutador. Y funciona asi: cada vez que la variable entre parentesis es igual a algo, ejecuta ese algo hasta el break. No olvidar el break. En tu caso. Tu lees un código IR y tienes dos patrones. Uno es PR+ = 18615 y el PR- = 8415 Entonces cuando lees PR+ ejecutas el código que ya habias creado y lo mismo con PR- Lo único NOVEDOSO es que no vuelvo a leer el valor de la variable y por ende... si tu presionas PR- y estabas en tu código, tu primer if como respondería, ejectuando el else primero y apagando estado1 y viceverza. Por eso no funcionaba.

Gracias por tu explicación. Siempre se aprende algo mas.
Feliz año nuevo!