Dudas con IF y else

Buenas, he estado trasteando un receptor de infrarrojos y tengo un codigo que me va bien para encender un led para las pruebas, todo bien hasta que me he dicho ahora 2 botones para encender el led!!!

Y me he dado cuenta que no entiendo bien el funcionamiento del if y else xDD

El problema es que veo que solo funciona bien el ultimo if, en este codigo es la tecla del mando "100+" que es la unica que funciona bien, el otro boton "0" solo enciende el led, no lo apaga.

Y otra cosa es que tendria que poner un delay porque digamos que tiene rebote el boton del mando y ha veces presiono el boton y se enciende y apaga el led y tengo que darle rapido, como seria la mejor forma de poner un delay que solo actue cuando le doy al boton? (supongo que en el if que solo actua cuando le daria al boton "X").

Gracias por vuestra ayuda!!!

ACTUALIZO: Dejo el codigo para encender el pin 2 digital y el pin 13 digital con dos botones del mando a distancia.
Por el monitor serie si hacen click a un boton del mando os saldra el codigo que tiene ese boton y modificais el define num0 y 100 por el que querais de vuestro mando.

/*Conexion de Pins del receptor IR:
Pin 1 IR va al pin PWM que queremos del arduino en este caso el 8
Pin 2 del IR al negativo
Pin 3 del IR va al positivo poniendo una resistencia de 10k en medio.
*/

#include <IRremote.h>
#define num0 16738455
#define num100 16750695
int RECV_PIN = 8;
int ledPin =  13;
int ledPin2 =  2;
int estatpin13 = 0;
int estatpin2 = 0;
IRrecv irrecv(RECV_PIN);
decode_results results;
 
void setup()
{
  Serial.begin(9600);
  irrecv.enableIRIn(); // Start the receiver
  pinMode(ledPin, OUTPUT); 
 pinMode(ledPin2, OUTPUT); 
}

void num1() {
    if(results.value == num0){ //el 16738455 es el numero 0 para saber que numero tiene la tecla de qualquier mando compatible solo mirar el serial y darle a la tecla
        estatpin13 = digitalRead(ledPin);
        if (estatpin13 == LOW) {
        digitalWrite(ledPin, HIGH);}
        else {
          digitalWrite(ledPin, LOW);}}
        }
          
void numero100() {
  if (results.value == num100){ 
 estatpin2 = digitalRead(ledPin2); 
   if (estatpin2 == LOW) {
        digitalWrite(ledPin2, HIGH);}
        else {
          digitalWrite(ledPin2, LOW);}}
          }   
void loop() {
  if (irrecv.decode(&results)) {
    Serial.println(results.value, DEC);
 num1();
 numero100();
 irrecv.resume(); // Recivir siguiente valor
  }}
 
/* Este codigo seria para enviar señales por infrarrojos, aun no he probado.
Se usa un led de infrarrojos en el pin 3 del arduino poniendo una resistencia de 100ohms(puedes cambiar de pin mientas sea PWM) 


#include <IRremote.h>
IRsend irsend;

void setup()
{
  Serial.begin(9600);
}

void loop() {
  if (Serial.read() != -1) {
    for (int i = 0; i < 3; i++) {
      irsend.sendSony(0xa90, 12); // Sony TV power code
      delay(100);
    }
  }
} 
*/

Hola,
yo creo que todo lo que se ejecuta si se cumple if lo tienes que poner entre corchetes, y lo mismo con el else

void loop() 
{
  if (irrecv.decode(&results)) 
  {
       Serial.println(results.value, DEC);
       .................
       .................
   }
   else 
   {
       digitalWrite(ledPin, HIGH);   // LED on
       .................
       .................
    }  
}

Tienes razon copie mal el codigo de tanto trastearlo, porque mi problema es el siguiente: (he retocado el codigo para que lea el estado del pin digital donde esta conectado porque si esta encendido que lo apage y si esta apagado que lo encienda)

Con este codigo que es un solo boton del mando a distancia funciona bien, me enciende el led y al hacer otro click lo apaga.

[void loop() {
  if (irrecv.decode(&results)) {
    Serial.println(results.value, DEC);
 
    if(results.value == num0){ //el 16738455 es el numero 0 para saber que numero tiene la tecla de qualquier mando compatible solo mirar el serial y darle a la tecla
      estatpin = digitalRead(ledPin);
      if (estatpin == 0) {
        digitalWrite(ledPin, HIGH);}
        else {
          digitalWrite(ledPin, LOW);}}

Pero si pongo dos botones se keda todo parado y es aqui quizas donde me equivoco al usar los if, else if y else. ya que pongo muchos if dentro de otros if :stuck_out_tongue:

void loop() {
  if (irrecv.decode(&results)) {
    Serial.println(results.value, DEC);
 
    if(results.value == num0){ //el 16738455 es el numero 0 para saber que numero tiene la tecla de qualquier mando compatible solo mirar el serial y darle a la tecla
      estatpin = digitalRead(ledPin);
      if (estatpin == 0) {
        digitalWrite(ledPin, HIGH);}
        else {
          digitalWrite(ledPin, LOW);}}
    
    else if (results.value == num100){ 
      estatpin = digitalRead(ledPin2);
      if (estatpin == 0) {
        digitalWrite(ledPin, HIGH);}
        else {
          digitalWrite(ledPin, LOW);}}}     
          
        
    
    irrecv.resume(); // Recivir siguiente valor
    
  }

No hagan caso de los { del primer codigo que quizas falta o sobra alguno al final del primero al copiar pegar del codigo que tengo echo con los dos a la vez. Por si las moscas pego todo el codigo junto en el segundo que es el que tengo puesto en el arduino con los corchetes que creo que estan donde deben.

Hola,
No veo nada anormal en el código. La línea que figura al final del segundo código
irrecv.resume(); // Recivir siguiente valor
existe también en el caso de un sólo botón?

Si tambien existe esa linea, he probado de ponerla arriba abajo enmedio ... xDDDD

Si el codigo esta bien, quizas sea otra cosa la que esta fallando, quizas la libreria bufff no se... preferiria que me hubieras dicho que esta mal puesto los ifs.

Alguien tiene una idea de que puede causar que funcione con un boton pero no con dos?

Esque lo que me sorprende esque poner el segundo boton influye en el programa entero, con un boton si lo pulso se ve claramente como el arduino trabaja el rx y tx porque manda al monitor serie los valores que da ese boton, pero con dos botones ya no hace caso al mando a distancia.

Hola,
Si entiendo bien, te funciona bien

void loop() 
{
  if (irrecv.decode(&results)) 
  {
      Serial.println(results.value, DEC);

      if(results.value == num0)
      { 
          estatpin = digitalRead(ledPin);
          if (estatpin == 0) 
          {
                digitalWrite(ledPin, HIGH);
           }
           else 
           {
                 digitalWrite(ledPin, LOW);
           }
       }
       irrecv.resume(); // Recivir siguiente valor
  }

Y te funciona bien

void loop() 
{
  if (irrecv.decode(&results)) 
  {
      Serial.println(results.value, DEC);

      if(results.value == num100)
      { 
          estatpin = digitalRead(ledPin);
          if (estatpin == 0) 
          {
                digitalWrite(ledPin, HIGH);
           }
           else 
           {
                 digitalWrite(ledPin, LOW);
           }
       }
       irrecv.resume(); // Recivir siguiente valor
  }

Si cada código funciona bien por su parte, no entiendo por qué ocurre tu fallo. Yo probaría sacarlos a dos funciones, y llamarles a cada uno desde el loop. No se me ocurre otra cosa.

Buenas comeollas, yo no sé mucho sobre el tema así que a lo mejor desvarío un poco.

Tengo un par de preguntas, la primera es: que es ledPin y ledPin2, entiendo que son la misma salida pero siendo la misma salida porque las declaras en 2 variables diferentes pudiendo utilizar solo una?? la segunda es que si se puede leer de un pin que has declarado como OUTPUT, ya que entiendo que ledPin lo has declarado como OUTPUT.

Saludos chato_sat.

Es simplemente para hacer pruebas, para poder encender y apagar el led del arduino con dos botones distintos, ya he probado de poner dos pins distintos ledPin y ledPin2 y el problema no es ese.

Te pego el codigo con 2 leds y lecturas de estado de esos 2 pins independientes sigue haciendo lo mismo no funciona nada con 2.

/*Conexion de Pins del receptor IR:
Pin 1 IR va al pin PWM que queremos del arduino en este caso el 8
Pin 2 del IR al negativo
Pin 3 del IR va al positivo poniendo una resistencia de 10k en medio.
*/

#include <IRremote.h>
#define num0 16738455
#define num100 16750695
int RECV_PIN = 8;
int ledPin =  13;
int ledPin2 =  2;
int estatpin13 = 0;
int estatpin2 = 0;
IRrecv irrecv(RECV_PIN);
decode_results results;
 
void setup()
{
  Serial.begin(9600);
  irrecv.enableIRIn(); // Start the receiver
  pinMode(ledPin, OUTPUT); 
 pinMode(ledPin2, OUTPUT); 
}
 
void loop() {
  estatpin13 = digitalRead(ledPin);
  estatpin2 = digitalRead(ledPin2);
    irrecv.resume(); // Recivir siguiente valor
  if (irrecv.decode(&results)) {
    Serial.println(results.value, DEC);
 
    if(results.value == num0){ //el 16738455 es el numero 0 para saber que numero tiene la tecla de qualquier mando compatible solo mirar el serial y darle a la tecla
        if (estatpin13 == LOW) {
        digitalWrite(ledPin, HIGH);}
        else {
          digitalWrite(ledPin, LOW);}}
    
    else if (results.value == num100){ 
        if (estatpin2 == LOW) {
        digitalWrite(ledPin, HIGH);}
        else {
          digitalWrite(ledPin, LOW);}}
        }     
      irrecv.resume(); // Recivir siguiente valor     
   }

curro92:
Hola,
Si entiendo bien, te funciona bien

Si cada código funciona bien por su parte, no entiendo por qué ocurre tu fallo. Yo probaría sacarlos a dos funciones, y llamarles a cada uno desde el loop. No se me ocurre otra cosa.

He probado ponerlos por separado, YA FUNCIONA!

MUCHAS GRACIAS pro vuestra ayuda y paciencia jejejeje.

Lo malo es que no entiendo la diferencia entre ponerlo separado o junto sabriais explicarme porque asi si funciona al separarlo?

Dejo el codigo completo en el primer mensaje de este post. No es un proyecto para usarlo para encender realemente luces en casa con el mando a distancia, era mas bien para aprender a usar if y else porque nunca habia probado a poner mas if dentro de otro if.

Este sketch se puede modificar facilmente para encender remotamente el aire acondicionado por ejemplo o TV (con eso no tube ningun problema... ahora probae encender tele y aire condicionado dos cosas diferentes por si tengo el mismo problema xDD).

Mas bien es para aplicarlo en domotica para controlar temperaturas o decirle a que horas debe abrir y apagar aire acondicionado o simplemente si te vas unos dias unas horas antes de llegar a casa encenderlo para llegar calentito xD (aun me estoy decidiendo haber si lo hago o no :stuck_out_tongue: )