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");}}}
amitf
May 3, 2023, 12:36pm
4
**if (Keypad.isRowPressed(0) && Keypad.isColumnPressed(0)){**
** Serial.println("TV Remote Selected"); } **
if(Keypad.isRowPressed(0) && Keypad.isColumnPressed(1))
{
abderrahmen99:
I'm using the code below
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
amitf
May 3, 2023, 12:52pm
11
I think you need a flag to determine the previous pushed button
amitf:
I think he needs a flag
No, it just looks like a bungled modification of an example from the library she is using.
a7
kolaha
May 3, 2023, 12:56pm
13
#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...
amitf
May 3, 2023, 1:02pm
16
kolaha:
else ColumnPressed2();
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
gcjr
May 3, 2023, 1:38pm
18
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");
}
}
}```
system
Closed
November 5, 2023, 4:16pm
20
This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.