Luces controladas por IR!

Hola buenas, estoy iniciando en esto y necesito ayuda por favor, resulta que hice un circuito facil para aprender un poco y funciona bien pero tengo un problema con el codigo, hay tres leds y quiero que presionando un solo boton del control remoto pueda cambiar el led que esta encendido uno por uno, o sea si presiono se apaga el led 1 y se enciende el 2, si presiono denuevo se apaga ese y se enciende el 3 y así. disculpas si es que hay algo raro pero estoy aprendiendo recien.

#include <IRremote.h>
#define RECV_PIN 12 
boolean led1; 
boolean led2;
boolean led3;
boolean led4;
IRrecv irrecv(RECV_PIN);
decode_results results;
int modo = 0;
const int N=3; 

void setup()
{
     Serial.begin(9600);
     pinMode(13,OUTPUT);
     led1=0;
     pinMode(11,OUTPUT);
     led2=0;
     pinMode(10,OUTPUT);
     led3=0;
     pinMode(9,OUTPUT);
     led4=0;
     irrecv.enableIRIn(); 
}

void loop(){

   

    if (irrecv.decode(&results))
    {
        
   Serial.print("Codigo: 0x") ;
   Serial.println(results.value,HEX) ;
   //Comprobamos si es la TECLA 1
    if(results.value==0xE0E040BF)
   {
        if(led1==0)
                   {
                   digitalWrite(11,HIGH);
                   led2=1;
                   digitalWrite(13,HIGH);
                   led1=1;
   }
        else
        {
                   digitalWrite(13,LOW);
                   led1=0;
                   digitalWrite(11,LOW);
                   led2=0;
                   digitalWrite(10,LOW);
                   led3=0;
                   digitalWrite(9,LOW);
                   led4=0;
        }

           
        }
   delay(100); 
    
        // aqui abajo es donde esta el problema
     
       if(results.value==0xE0E048B7){
        modo++;
        modo = modo % N;
        while(results.value==0xE0E048B7);
     }

     switch(modo){
      case 1:
                   digitalWrite(13,HIGH);
                   led1=1;
                   digitalWrite(11,LOW);
                   led2=0;
                   digitalWrite(10,HIGH);
                   led3=1;
                   digitalWrite(9,LOW);
                   led4=0;
      break;
        case 2:
                   digitalWrite(13,HIGH);
                   led1=1;
                   digitalWrite(11,LOW);
                   led2=0;
                   digitalWrite(10,LOW);
                   led3=0;
                   digitalWrite(9,HIGH);
                   led4=1;
      break;             
        case 3:
                   digitalWrite(13,HIGH);
                   led1=1;
                   digitalWrite(11,HIGH);
                   led2=1;
                   digitalWrite(10,LOW);
                   led3=0;
                   digitalWrite(9,LOW);
                   led4=0;
      break;                
       
     }
       
     
    
      
   delay(100);
        irrecv.resume();    
    }  
}

Gracias!

El operador % da como resultado el resto de la división entera. En:

modo = modo % N;

como N vale 3, el valor de modo estará entre 0 y 2, nunca 3.

Así que en el switch nunca se dará el caso 3.

Prueba:

switch(modo + 1){

No me funciona :confused: puse eso y nada, luego puse switch(modo++){ y ahi funcionó pero solo una vez y con el botón que tenia para una función de mas arriba luego funcionaba solo lo de arriba, y cada vez que apretaba el botón que era el correcto supuestamente se quedaban los led que estaban encendidos y no volvía a funcionar :confused:
Gracias de todos modos!

¿Para qué has puesto esto?

while(results.value==0xE0E048B7);

Creo que este while deberías de quitarlo. Si entra en él no saldrá nunca y se quedará en un bucle infinito.

Quite eso y funciona ahora lo de cambiar las luces, pero no funciona lo que estaba arriba para prender y apagar todo :confused:
Gracias!

¡Ah! Así que es eso lo que quieres hacer con la "TECLA 1", encender y apagar todo el "conjunto".

Para empezar, no sé si es un problema al copiar y pegar el código el el foro, deberías de tener el código bien tabulado para que te sea más fácil ver dónde empieza y termina cada par de llaves. Al compilador le da igual, pero a los humanos nos facilita la lectura y compresión del programa.

Si ponemos sólo las instrucciones que controlan el flujo del programa de forma que se vea fácil cual es la "dependencia" entre ellas, tal que así:

void loop(){
    if (irrecv.decode(&results)) {
        if(results.value==0xE0E040BF) {
            if(led1==0) {
            }
            else {
            }
        }
        if(results.value==0xE0E048B7) {
        }
        switch(modo + 1) {
        }
    }
}

... se puede observar que siempre que se recibe algo se comprueba si es la tecla 0xE0E040BF, después se comprueba si es la tecla 0xE0E048B7 y por último (siempre que se ha recibido algo) se evalúa el switch que enciende en en todos los casos el led1, enciende también el LED que le toque y deja el resto apagado. Es el switch el que "enciende el conjunto" cada vez que se recibe algo.

Entiendo que lo que quieres es que si está "apagado" el switch no haga nada. Si es así, ¿cómo sabemos que está apagado? Necesitaríamos guardar en una variable si "el sistema" está encendido o apagado... Por lo pronto voy a entender y considerar que si led1 está a cero es que el sistema está apagado y si está a uno es que está encendido (he dado por supuesto que el led1 indica eso, ya que no has especificado qué es lo que quieres que el Arduino haga "exactamente"). Así que basta con verificar que led1 es distinto de cero para que haga el resto de cosas que no sea controlar la "TECLA 1", ya que ésta es la que ha de encender el sistema cuando led1 sea cero. Para ello ponemos un if de tal forma que la estructura del programa quedaría:

void loop(){
    if (irrecv.decode(&results)) {
        if(results.value==0xE0E040BF) {
            if(led1==0) {
            }
            else {
            }
        }
        if (led1 != 0) { //  <--- Principio del if añadido
            if(results.value==0xE0E048B7) {
            }
            switch(modo + 1) {
            }
        }                //  <--- Fin del if añadido
    }
}

De esta forma no se mira para nada si se ha recibido la tecla 0xE0E048B7 ni se encienden los LEDs si el sistema está apagado.

Nota: ten en cuenta que, al arrancar, el valor inicial de led1 es cero, con lo que está apagado y no se va a encender ningún LED. Lo primero que has de hacer es pulsar en el mando la tecla de encendido.

Me ha funcionado! :smiley: Eso era exactamente lo que queria hacer. Muchas gracias!!