Nested If { If / Else If }, Else if { If / Else If } Not Executing Right

I'm using the code below to control a tv and a receiver but only the instructions that are in ** are executed

#define CUSTOM_SETTINGS
#define INCLUDE_KEYPAD_SHIELD
#include <OneSheeld.h>
#include <IRLibSendBase.h>
#include <IRLib_P01_NEC.h> 
#include <IRLibCombo.h>
IRsend irsend;

void setup() 
{
  Serial.begin(115200);  
  Serial.println("Starting setup...");
  OneSheeld.begin();
  Serial.println("Select a Remote");
}

void loop()
{
  
   
  if (Keypad.isRowPressed(0) && Keypad.isColumnPressed(0)){
              Serial.println("TV Remote Selected");
              if(Keypad.isRowPressed(0) && Keypad.isColumnPressed(1)){
              irsend.send(NEC,0x4FBC03F, 32); // Ch+ (TV)
              Serial.println("Button TV Ch+ pressed");}
           
              else if(Keypad.isRowPressed(1) && Keypad.isColumnPressed(0)){
              irsend.send(NEC,0x4FB906F, 32); // Vol-
              Serial.println("Button TV Vol- pressed");}
              
              else if(Keypad.isRowPressed(1) && Keypad.isColumnPressed(1)){
              irsend.send(NEC,0x4FB4AB5, 32); // Marche-Arret
              Serial.println("Button TV ON/OFF pressed");}
             
              else if(Keypad.isRowPressed(1) && Keypad.isColumnPressed(2)){
              irsend.send(NEC,0x4FB40BF, 32); // Vol+
              Serial.println("Button TV Vol+ pressed");}
              
              else if(Keypad.isRowPressed(2) && Keypad.isColumnPressed(1)){
              irsend.send(NEC,0x4FB827D, 32); // Ch-
              Serial.println("Button TV Ch- pressed");} 
              
              else if(Keypad.isRowPressed(3) && Keypad.isColumnPressed(1)){
              return;  Serial.println("Button Selection pressed");}}

                                                           
  else if (Keypad.isRowPressed(0) && Keypad.isColumnPressed(1)) {
               Serial.println("Receiver remote selected");
               if(Keypad.isRowPressed(0) && Keypad.isColumnPressed(1)){
               irsend.send(NEC,0x4040D02F, 32);// Ch+ (Récepteur)
               Serial.println("Button Receiver Ch+ pressed");}
              
               else if(Keypad.isRowPressed(1) && Keypad.isColumnPressed(0)){
               irsend.send(NEC,0x40408877, 32); // Vol-
               Serial.println("Button Receiver Vol- pressed");}
               
               else if(Keypad.isRowPressed(1) && Keypad.isColumnPressed(1)){
               irsend.send(NEC,0x404050AF, 32); // Marche-Arret 
               Serial.println("Button Receiver ON/OFF pressed");}
               
               else if(Keypad.isRowPressed(1) && Keypad.isColumnPressed(2)){
               irsend.send(NEC,0x404008F7, 32); // Vol+
               Serial.println("Button Receiver Vol+ pressed");}
               
               else if(Keypad.isRowPressed(2) && Keypad.isColumnPressed(1)){
               irsend.send(NEC,0x4040708F, 32); // Ch-
               Serial.println("Button Receiver Ch- pressed");}
               
               else if(Keypad.isRowPressed(3) && Keypad.isColumnPressed(1)){
               return;  Serial.println("Button Selection pressed");}}}

I always find consistent indentation helps to visualise program flow.

Here's a better version

#define CUSTOM_SETTINGS
#define INCLUDE_KEYPAD_SHIELD
#include <OneSheeld.h>
#include <IRLibSendBase.h>
#include <IRLib_P01_NEC.h> 
#include <IRLibCombo.h>
IRsend irsend;

void setup() 
{
  Serial.begin(115200);  
  Serial.println("Starting setup...");
  OneSheeld.begin();
  Serial.println("Select a Remote");
}

void loop()
{
  
   
  if (Keypad.isRowPressed(0) && Keypad.isColumnPressed(0)){
              Serial.println("TV Remote Selected");
              if(Keypad.isRowPressed(0) && Keypad.isColumnPressed(1)){
              irsend.send(NEC,0x4FBC03F, 32); // Ch+ (TV)
              Serial.println("Button TV Ch+ pressed");}
           
              else if(Keypad.isRowPressed(1) && Keypad.isColumnPressed(0)){
              irsend.send(NEC,0x4FB906F, 32); // Vol-
              Serial.println("Button TV Vol- pressed");}
              
              else if(Keypad.isRowPressed(1) && Keypad.isColumnPressed(1)){
              irsend.send(NEC,0x4FB4AB5, 32); // Marche-Arret
              Serial.println("Button TV ON/OFF pressed");}
             
              else if(Keypad.isRowPressed(1) && Keypad.isColumnPressed(2)){
              irsend.send(NEC,0x4FB40BF, 32); // Vol+
              Serial.println("Button TV Vol+ pressed");}
              
              else if(Keypad.isRowPressed(2) && Keypad.isColumnPressed(1)){
              irsend.send(NEC,0x4FB827D, 32); // Ch-
              Serial.println("Button TV Ch- pressed");} 
              
              else if(Keypad.isRowPressed(3) && Keypad.isColumnPressed(1)){
              return;  Serial.println("Button Selection pressed");}}

                                                           
  else if (Keypad.isRowPressed(0) && Keypad.isColumnPressed(1)) {
               Serial.println("Receiver remote selected");
               if(Keypad.isRowPressed(0) && Keypad.isColumnPressed(1)){
               irsend.send(NEC,0x4040D02F, 32);// Ch+ (Récepteur)
               Serial.println("Button Receiver Ch+ pressed");}
              
               else if(Keypad.isRowPressed(1) && Keypad.isColumnPressed(0)){
               irsend.send(NEC,0x40408877, 32); // Vol-
               Serial.println("Button Receiver Vol- pressed");}
               
               else if(Keypad.isRowPressed(1) && Keypad.isColumnPressed(1)){
               irsend.send(NEC,0x404050AF, 32); // Marche-Arret 
               Serial.println("Button Receiver ON/OFF pressed");}
               
               else if(Keypad.isRowPressed(1) && Keypad.isColumnPressed(2)){
               irsend.send(NEC,0x404008F7, 32); // Vol+
               Serial.println("Button Receiver Vol+ pressed");}
               
               else if(Keypad.isRowPressed(2) && Keypad.isColumnPressed(1)){
               irsend.send(NEC,0x4040708F, 32); // Ch-
               Serial.println("Button Receiver Ch- pressed");}
               
               else if(Keypad.isRowPressed(3) && Keypad.isColumnPressed(1)){
               return;  Serial.println("Button Selection pressed");}}}
**if (Keypad.isRowPressed(0) && Keypad.isColumnPressed(0)){**
**              Serial.println("TV Remote Selected"); } **
              if(Keypad.isRowPressed(0) && Keypad.isColumnPressed(1))
  {

Well of course you mean the code before you marked it up for us.

Use the IDE Auto Format tool on the unmolested code and post it here using the <CODE\> tool in the message composition window.

Here's a better version

Not really any better for reading.

a7

1 Like

I used the auto format tool on this one

#define CUSTOM_SETTINGS
#define INCLUDE_KEYPAD_SHIELD
#include <OneSheeld.h>
#include <IRLibSendBase.h>
#include <IRLib_P01_NEC.h>
#include <IRLibCombo.h>
IRsend irsend;

void setup()
{
  Serial.begin(115200);
  Serial.println("Starting setup...");
  OneSheeld.begin();
  Serial.println("Select a Remote");
}

void loop()
{


  if (Keypad.isRowPressed(0) && Keypad.isColumnPressed(0)) {
    Serial.println("TV Remote Selected");
    if (Keypad.isRowPressed(0) && Keypad.isColumnPressed(1)) {
      irsend.send(NEC, 0x4FBC03F, 32); // Ch+ (TV)
      Serial.println("Button TV Ch+ pressed");
    }

    else if (Keypad.isRowPressed(1) && Keypad.isColumnPressed(0)) {
      irsend.send(NEC, 0x4FB906F, 32); // Vol-
      Serial.println("Button TV Vol- pressed");
    }

    else if (Keypad.isRowPressed(1) && Keypad.isColumnPressed(1)) {
      irsend.send(NEC, 0x4FB4AB5, 32); // Marche-Arret
      Serial.println("Button TV ON/OFF pressed");
    }

    else if (Keypad.isRowPressed(1) && Keypad.isColumnPressed(2)) {
      irsend.send(NEC, 0x4FB40BF, 32); // Vol+
      Serial.println("Button TV Vol+ pressed");
    }

    else if (Keypad.isRowPressed(2) && Keypad.isColumnPressed(1)) {
      irsend.send(NEC, 0x4FB827D, 32); // Ch-
      Serial.println("Button TV Ch- pressed");
    }

    else if (Keypad.isRowPressed(3) && Keypad.isColumnPressed(1)) {
      return;  Serial.println("Button Selection pressed");
    }
  }


  else if (Keypad.isRowPressed(0) && Keypad.isColumnPressed(1)) {
    Serial.println("Receiver remote selected");
    if (Keypad.isRowPressed(0) && Keypad.isColumnPressed(1)) {
      irsend.send(NEC, 0x4040D02F, 32); // Ch+ (Récepteur)
      Serial.println("Button Receiver Ch+ pressed");
    }

    else if (Keypad.isRowPressed(1) && Keypad.isColumnPressed(0)) {
      irsend.send(NEC, 0x40408877, 32); // Vol-
      Serial.println("Button Receiver Vol- pressed");
    }

    else if (Keypad.isRowPressed(1) && Keypad.isColumnPressed(1)) {
      irsend.send(NEC, 0x404050AF, 32); // Marche-Arret
      Serial.println("Button Receiver ON/OFF pressed");
    }

    else if (Keypad.isRowPressed(1) && Keypad.isColumnPressed(2)) {
      irsend.send(NEC, 0x404008F7, 32); // Vol+
      Serial.println("Button Receiver Vol+ pressed");
    }

    else if (Keypad.isRowPressed(2) && Keypad.isColumnPressed(1)) {
      irsend.send(NEC, 0x4040708F, 32); // Ch-
      Serial.println("Button Receiver Ch- pressed");
    }

    else if (Keypad.isRowPressed(3) && Keypad.isColumnPressed(1)) {
      return;  Serial.println("Button Selection pressed");
    }
  }
}
1 Like

What do you expect that to do?

Now your mistake(s) should be obvious.

See what is, and isn't, being gobbled up by the placement of your { braces }…

Put your finger on the code and see the tests that never get a chance.

a7

I wanted to get out of the nested if

I think you need a flag to determine the previous pushed button

No, it just looks like a bungled modification of an example from the library she is using.

a7

#define CUSTOM_SETTINGS
#define INCLUDE_KEYPAD_SHIELD
#include <OneSheeld.h>
#include <IRLibSendBase.h>
#include <IRLib_P01_NEC.h>
#include <IRLibCombo.h>
IRsend irsend;

void setup() {
  Serial.begin(115200);
  Serial.println("Starting setup...");
  OneSheeld.begin();
  Serial.println("Select a Remote");
}

void loop() {
  if ( Keypad.isColumnPressed(0)) ColumnPressed0();
  else {
    if ( Keypad.isColumnPressed(1)) ColumnPressed1();
    else ColumnPressed2();
  }
}//------------

void ColumnPressed0() {
  if (Keypad.isRowPressed(0) ) {
    irsend.send(NEC, 0x4FB906F, 32); // Vol-
    Serial.println("Button TV Vol- pressed");
  }
  if (Keypad.isRowPressed(1) ) {
    irsend.send(NEC, 0x40408877, 32); // Vol-
    Serial.println("Button Receiver Vol- pressed");
  }
  if (Keypad.isRowPressed(2) ) {
    irsend.send(NEC, 0x4040D02F, 32); // Ch+ (Récepteur)
    Serial.println("Button Receiver Ch+ pressed");
  }
  if (Keypad.isRowPressed(3) ) {
    irsend.send(NEC, 0x404050AF, 32); // Marche-Arret
    Serial.println("Button Receiver ON/OFF pressed");
  }
}//------------

void ColumnPressed1() {
  if (Keypad.isRowPressed(0) ) {
    irsend.send(NEC, 0x4FBC03F, 32); // Ch+ (TV)
    Serial.println("Button TV Ch+ pressed");
  }
  if (Keypad.isRowPressed(1) ) {
    irsend.send(NEC, 0x4FB4AB5, 32); // Marche-Arret
    Serial.println("Button TV ON/OFF pressed");
  }
  if (Keypad.isRowPressed(2) ) {
    irsend.send(NEC, 0x4FB827D, 32); // Ch-
    Serial.println("Button TV Ch- pressed");
  }
}//-------------

void ColumnPressed2() {
  if (Keypad.isRowPressed(0) ) {
    irsend.send(NEC, 0x4FB40BF, 32); // Vol+
    Serial.println("Button TV Vol+ pressed");
  }
  if (Keypad.isRowPressed(1) ) {
    irsend.send(NEC, 0x404008F7, 32); // Vol+
    Serial.println("Button Receiver Vol+ pressed");
  }
  if (Keypad.isRowPressed(2) ) {
    irsend.send(NEC, 0x4040708F, 32); // Ch-
    Serial.println("Button Receiver Ch- pressed");
  }
}//----------------

Hello abderrahmen99

Run simply a keypad tutorial to gain the knowledge about.

You can use the break statement to jump one level back.
Return can be used if your nested ifs are in a function. In principle loop() is a function, so the return might work here. But it is really a very uncommon solution...
Otherwise you need to set a flag or (I almost dare not say this) a goto...

I think it should be

else if (Keypad.isColumnPressed(2))
ColumnPressed2();

it works both. but if RC has more then 3 Column, each must have own IF

    if (Keypad.isRowPressed(0) && Keypad.isColumnPressed(0)) {
        if (Keypad.isRowPressed(0) && Keypad.isColumnPressed(1)) {
        else if (Keypad.isRowPressed(1) && Keypad.isColumnPressed(0)) {
        else if (Keypad.isRowPressed(1) && Keypad.isColumnPressed(1)) {
        else if (Keypad.isRowPressed(1) && Keypad.isColumnPressed(2)) {
        else if (Keypad.isRowPressed(2) && Keypad.isColumnPressed(1)) {
        else if (Keypad.isRowPressed(3) && Keypad.isColumnPressed(1)) {

i don't understand how the above is expected to work.

if isRowPressed (0) is true, can any of the others, isRowPressed (1/2/3), be true?

should the code iterate thru each possible row and column

    for (int row = 0; row < Nrow; row++)  {
        for (int col = 0; col < Ncol; col++)  {
            if (Keypad.isRowPressed(row) && Keypad.isColumnPressed(col)) {
                process (row, col);
            }
        }
    }

I inserted flags in the code and it's completely functional right now , here's the modified code

#define CUSTOM_SETTINGS
#define INCLUDE_KEYPAD_SHIELD
#include <OneSheeld.h>
#include <IRLibSendBase.h>
#include <IRLib_P01_NEC.h>
#include <IRLibCombo.h>
IRsend irsend;

void setup()
{
  Serial.begin(115200);
  Serial.println("Starting setup...");
  OneSheeld.begin();
  Serial.println("Select a Remote");
}
void loop()
{
  static bool tv_remote_selected = false;
  static bool receiver_remote_selected = false;

  if (Keypad.isRowPressed(0) && Keypad.isColumnPressed(3)) {
    tv_remote_selected = true;
    receiver_remote_selected = false;
    Serial.println("TV Remote Selected");
  }
  else if (Keypad.isRowPressed(1) && Keypad.isColumnPressed(3)) {
    tv_remote_selected = false;
    receiver_remote_selected = true;
    Serial.println("Receiver remote selected");
  }
  if (tv_remote_selected) {

    if (Keypad.isRowPressed(0) && Keypad.isColumnPressed(1)) {
      irsend.send(NEC, 0x4FBC03F, 32); // Ch+ (TV)
      Serial.println("Button TV Ch+ pressed");
    }

    else if (Keypad.isRowPressed(1) && Keypad.isColumnPressed(0)) {
      irsend.send(NEC, 0x4FB906F, 32); // Vol-
      Serial.println("Button TV Vol- pressed");
    }

    else if (Keypad.isRowPressed(1) && Keypad.isColumnPressed(1)) {
      irsend.send(NEC, 0x4FB4AB5, 32); // Marche-Arret
      Serial.println("Button TV ON/OFF pressed");
    }

    else if (Keypad.isRowPressed(1) && Keypad.isColumnPressed(2)) {
      irsend.send(NEC, 0x4FB40BF, 32); // Vol+
      Serial.println("Button TV Vol+ pressed");
    }

    else if (Keypad.isRowPressed(2) && Keypad.isColumnPressed(1)) {
      irsend.send(NEC, 0x4FB827D, 32); // Ch-
      Serial.println("Button TV Ch- pressed");
    }
  }
  if (receiver_remote_selected) {
    if (Keypad.isRowPressed(0) && Keypad.isColumnPressed(1)) {
      irsend.send(NEC, 0x4040D02F, 32); // Ch+ (Récepteur)
      Serial.println("Button Receiver Ch+ pressed");
    }

    else if (Keypad.isRowPressed(1) && Keypad.isColumnPressed(0)) {
      irsend.send(NEC, 0x40408877, 32); // Vol-
      Serial.println("Button Receiver Vol- pressed");
    }

    else if (Keypad.isRowPressed(1) && Keypad.isColumnPressed(1)) {
      irsend.send(NEC, 0x404050AF, 32); // Marche-Arret
      Serial.println("Button Receiver ON/OFF pressed");
    }

    else if (Keypad.isRowPressed(1) && Keypad.isColumnPressed(2)) {
      irsend.send(NEC, 0x404008F7, 32); // Vol+
      Serial.println("Button Receiver Vol+ pressed");
    }

    else if (Keypad.isRowPressed(2) && Keypad.isColumnPressed(1)) {
      irsend.send(NEC, 0x4040708F, 32); // Ch-
      Serial.println("Button Receiver Ch- pressed");
    }
  }
}```

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