Nrf2401 and arduino

Dear friends,

I have set up a transmiter and receiver to turn on and off one Led using nrf2401 module and its ok working
Now I want to extend this and control 6 Leds on the receiver side.
Can any body please help me on this?

raminaziz:
Dear friends,

I have set up a transmiter and receiver to turn on and off one Led using nrf2401 module and its ok working
Now I want to extend this and control 6 Leds on the receiver side.
Can any body please help me on this?

I expect lots of people could help if you gave us any hint as to what you need help with. What have you tried and what was the result?

Paul

To control 6 LEDs your probably gonna have to send two pieces of information. The led your addressing and the state.

say your leds are numbered 1 to 6 and you want to turn led 3 to on. The transmitter would send
the number of the led (3) and the state (0 , because a 0 will light up the led).

On the receive side the arduino would read the info and extract the address and state information and change the output pins that the led's are connected to.

so in this case

digitalwrite(LED3, LOW);

You don't have to use numbers you can use characters also.
normally the reciever would let the transmitter that the message was recieved.
so hopefully this gave you an idea how to go about it.

Please post the code that you have by using tags.

Have a look at this Simple nRF24L01+ Tutorial.

Wireless problems can be very difficult to debug so get the wireless part working on its own before you start adding any other features.

The examples are as simple as I could make them and they have worked for other Forum members. If you get stuck it will be easier to help with code that I am familiar with. Start by getting the first example to work

...R

Hi,
Can you post the code you have already and schematic of your project please?
What model Arduinos are you using?

Thanks.. Tom.. :slight_smile:

Thank you all
I have done the simple example and it worked ok I am using two Arduino Uno at the moment but may also use Nano too.
I am sending my code for six leds but tried to work first by two leds that I got stuck with it.

here is the code for Transmitter:

#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
RF24 radio(9, 8); // CE, CSN         
const byte address[6] = "00001";     //Byte of array representing the address. This is the address where we will send the data. This should be same on the receiving side.
int button1_pin = 2;
int button2_pin = 3;
//int button3_pin = 4;
//int button4_pin = 5;
//int button5_pin = 6;
//int button6_pin = 7;

boolean button1_state = 0;
boolean button2_state = 0;
//boolean button3_state = 0;
//boolean button4_state = 0;
//boolean button5_state = 0;
//boolean button6_state = 0;
void setup() {
 Serial.begin(9600);
pinMode(button1_pin, INPUT);
pinMode(button2_pin, INPUT);
//pinMode(button3_pin, INPUT);
//pinMode(button4_pin, INPUT);
//pinMode(button5_pin, INPUT);
//pinMode(button6_pin, INPUT);
radio.begin();                  //Starting the Wireless communication
radio.openWritingPipe(address); //Setting the address where we will send the data
radio.setPALevel(RF24_PA_MIN);  //You can set it as minimum or maximum depending on the distance between the transmitter and receiver.
radio.stopListening();          //This sets the module as transmitter
}
void loop()
{
   button1_state = digitalRead(button1_pin);
   button2_state = digitalRead(button2_pin);
  // button3_state = digitalRead(button3_pin);
  // button4_state = digitalRead(button4_pin);
  // button5_state = digitalRead(button5_pin);
  // button6_state = digitalRead(button6_pin);

  if(button1_state == HIGH)
  {
   const char text[] = "Button1 State is HIGH";
   Serial.println( " Button1 State is HIGH");
   radio.write(&text, sizeof(text));                  //Sending the message to receiver
  }
  else if(button1_state == LOW)
  {
    const char text[] = " Button1 State is LOW";
    Serial.println( "Button1 State is LOW");
    radio.write(&text, sizeof(text));
   }
  
  if(button2_state == HIGH)
   {
     const char text1[] = "Button2 State is HIGH";
     Serial.println( " Button2 State is HIGH");
     radio.write(&text1, sizeof(text1));
   }
else if(button2_state ==LOW)
 {
   const char text1[] = "Button2 State is LOW";
   Serial.println( "Button2 State is LOW");
   radio.write(&text1, sizeof(text1));
  }
radio.write(&button1_state, sizeof(button1_state));  //Sending the message to receiver 
 radio.write(&button2_state, sizeof(button2_state)); 
 delay(1000);
} 


for the receiver side:

#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
RF24 radio(9, 8); // CE, CSN
const byte address[6] = "00001";
boolean button1_state = 0;
boolean button2_state = 0;
int led1_pin = 3;
int led2_pin = 4;
void setup() {
pinMode(4, OUTPUT);
pinMode(3, OUTPUT);
Serial.begin(9600);
radio.begin();
radio.openReadingPipe(0, address);   //Setting the address at which we will receive the data
radio.setPALevel(RF24_PA_MIN);       //You can set this as minimum or maximum depending on the distance between the transmitter and receiver.
radio.startListening();              //This sets the module as receiver
}
void loop()
{
if (radio.available())              //Looking for the data.
{
 char text[32] = "";                 //Saving the incoming data
 char text1[32] = "";
   radio.read(&text, sizeof(text));    //Reading the data
   radio.read(&button1_state, sizeof(button1_state));    //Reading the data
   
   
 if(button1_state == HIGH)
   {
     digitalWrite(3, HIGH);
     Serial.println(text);
   }
   else
   {
     digitalWrite(3, LOW);
     Serial.println("b 1 is Low"); 
    }
    radio.read(&text1, sizeof(text1)); 
    radio.read(&button2_state, sizeof(button2_state));
 if(button2_state == HIGH)
   {
     digitalWrite(4, HIGH);
     Serial.println(text1);
   }  
 else
  {
    digitalWrite(4, LOW);
    Serial.println("b 2 is low");
    }
}

delay(1000);
}

THe result of the above codes is the that on receiver side one led comes on and off by itself without pushing any button)and the second led dose not come on at all .independent of pushing any button.

Hi,
Can you please post a copy of your circuit, in CAD or a picture of a hand drawn circuit in jpg, png?

How have you got your buttons wired?

Tom... :slight_smile:

Dear Tom
This is the connection push buttons .( not exactly the same pin numbers)

raminaziz:
I have done the simple example and it worked ok

If that means that you tried the first example in my Tutorial why don't you stick with that and just modify it a little to send the switch states.

You could record the state of each switch in an array

byte switchStates[6];

for (byte n = 0; n < 6; n++) {
    switchStates[n] = digitalRead(switchPin[n];
}
radio.write(&switchStates, sizeof(switchStates));

In the receiver have an equivalent 6 byte array

...R

Thank you Robin2.
I have put your codes in my transmitter and shows no error so far and I am working on the receiver side now will you please see if I have done it correctly ?

#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
RF24 radio(9, 8); // CE, CSN         
const byte address[6] = "00001";     //Byte of array representing the address. This is the address where we will send the data. This should be same on the receiving side.

//boolean switchStates[6] = 0;

byte switchStates[6];
int switchPin[6]={2,3,4,5,6,7};

void setup() {
  Serial.begin(9600);
pinMode(switchPin[6], INPUT);

radio.begin();                  //Starting the Wireless communication
radio.openWritingPipe(address); //Setting the address where we will send the data
radio.setPALevel(RF24_PA_MIN);  //You can set it as minimum or maximum depending on the distance between the transmitter and receiver.
radio.stopListening();          //This sets the module as transmitter
}
void loop()
{
  
   byte switchStates[6];

for (byte n = 0; n < 6; n++) 
{
    switchStates[n] = digitalRead(switchPin[n]);
}
radio.write(&switchStates, sizeof(switchStates));
if(switchStates == HIGH)
  {
   const char text[] = "Button1 State is HIGH";
   Serial.println( " Button1 State is HIGH");
   radio.write(&text, sizeof(text));                  //Sending the message to receiver
  }
  else if(switchStates == LOW)
  {
    const char text[] = " Button1 State is LOW";
    Serial.println( "Button1 State is LOW");
    radio.write(&text, sizeof(text));
   }
   
  
 radio.write(&switchStates, sizeof(switchStates));  //Sending the message to receiver 
  
  delay(1000);}

You don't need any of this

if(switchStates == HIGH)
  {
   const char text[] = "Button1 State is HIGH";
   Serial.println( " Button1 State is HIGH");
   radio.write(&text, sizeof(text));                  //Sending the message to receiver
  }
  else if(switchStates == LOW)
  {
    const char text[] = " Button1 State is LOW";
    Serial.println( "Button1 State is LOW");
    radio.write(&text, sizeof(text));
   }
   
  
 radio.write(&switchStates, sizeof(switchStates));  //Sending the message to receiver

And when working on a wireless problem always post the Tx and the Rx code because they must work as a pair.

...R

raminaziz:
Dear Tom
This is the connection push buttons .( not exactly the same pin numbers)

Sorry, no picture.
Please read the first post in any forum entitled how to use this forum.
http://forum.arduino.cc/index.php/topic,148850.0.html .
Please attach the picture.
Thanks... Tom... :slight_smile:

Robin2:
You don't need any of this

...R

Hi Robin,
Now I am sending both Tx and RX codes for your considerations.

TX Code:

#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
RF24 radio(9, 8); // CE, CSN         
const byte address[6] = "00001";     //Byte of array representing the address. This is the address where we will send the data. This should be same on the receiving side.

//boolean switchStates[6] = 0;

byte switchStates[6];
int switchPin[6]={2,3,4,5,6,7};

void setup() {
Serial.begin(9600);
pinMode(switchPin[6], INPUT);

radio.begin();                  //Starting the Wireless communication
radio.openWritingPipe(address); //Setting the address where we will send the data
radio.setPALevel(RF24_PA_MIN);  //You can set it as minimum or maximum depending on the distance between the transmitter and receiver.
radio.stopListening();          //This sets the module as transmitter
}
void loop()
{

 byte switchStates[6];
 for (byte n = 0; n < 6; n++) 
    {
      switchStates[n] = digitalRead(switchPin[n]);
      radio.write(&switchStates[n], sizeof(switchStates[n]));
       Serial.println( switchStates[n]);
  delay(10);
  } 
}  

[code]

RX Code:

[code]
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
RF24 radio(9, 8); // CE, CSN
const byte address[6] = "00001";
byte switchStates[6];
int LED_Pin[6]={2,3,4,5,6,7};
int switchPin[6]={2,3,4,5,6,7};

char text[32] = ""; 

void setup() {
pinMode(LED_Pin[6], OUTPUT);
;
Serial.begin(9600);
radio.begin();
radio.openReadingPipe(0, address);   //Setting the address at which we will receive the data
radio.setPALevel(RF24_PA_MIN);       //You can set this as minimum or maximum depending on the distance between the transmitter and receiver.
radio.startListening();              //This sets the module as receiver
}
void loop()
{
 byte switchStates[6];

for (byte n = 0; n < 6; n++) 
{
   switchStates[n] = digitalRead(switchPin[n]);
   radio.read(&switchStates[n], sizeof(switchStates[n]));
if (radio.available())              //Looking for the data.
{
  radio.read(&text, sizeof(text));    //Reading the data
  radio.read(&switchStates, sizeof(switchStates));    //Reading the data
   
   
 if(switchStates[n] == HIGH)
   {
     digitalWrite(LED_Pin[n], HIGH);
     Serial.println(text);
   }
   else
   {
     digitalWrite(LED_Pin[n], LOW);
     Serial.println("Leds are Low"); 
    }
}  
} 
 
   // radio.read(&text, sizeof(text)); 
  //  radio.read(switchStates[n], sizeof(switchStates[n]));
 
delay(10);
}
[code]

Unfortunately no Led will come on.

[/code]

raminaziz:
Unfortunately no Led will come on.

Fortunately no important devices are controlled by this unsensible try. :wink:

Put all your data in a struct/array and send one packet.
Your approach wastes a lot of bandwidth and makes it impossible to identify the sent data.

Don't read from the radio without checking available first.

Thank you Sir,

I corrected according to your advise,Now on TX side I get "0" and "1"on the monitor, and on the RX side
all leds Flickr
This is my RX code now:

#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
RF24 radio(9, 8); // CE, CSN
const byte address[6] = "00001";
byte switchStates[6];
int LED_Pin[6]={2,3,4,5,6,7};
int switchPin[6]={2,3,4,5,6,7};

char text[32] = ""; 

void setup() {
pinMode(LED_Pin[6], OUTPUT);
;
Serial.begin(9600);
radio.begin();
radio.openReadingPipe(0, address);   //Setting the address at which we will receive the data
radio.setPALevel(RF24_PA_MIN);       //You can set this as minimum or maximum depending on the distance between the transmitter and receiver.
radio.startListening();              //This sets the module as receiver
}
void loop()
{
  byte switchStates[6];
if (radio.available())              //Looking for the data.
 {
   for (byte n = 0; n < 6; n++) 
   {
     switchStates[n] = digitalRead(switchPin[n]);
     radio.read(&switchStates[n], sizeof(switchStates[n]));
     if(switchStates[n] == HIGH)
       {
         digitalWrite(LED_Pin[n], HIGH);
         Serial.println(text);
        }
      else
        {
          digitalWrite(LED_Pin[n], LOW);
          Serial.println("Leds are Low"); 
         }
       }  
   } 
  delay(2);
 }

raminaziz:
I corrected according to your advise,

No, you did not.

byte switchStates[6];
...

if (radio.available())              //Looking for the data.
 {
   for (byte n = 0; n < 6; n++)
   {
     switchStates[n] = digitalRead(switchPin[n]);
     radio.read(&switchStates[n], sizeof(switchStates[n]));

Sorry ,It means I did not understand you.
Will you please clarify more?

Whandall:
Put all your data in a struct/array and send one packet.
Don't read from the radio without checking available first.

You read six packets after you check for the existance of one.

You don't use a struct/array to receive all data in one packet.

You didn't post the (hopefully better) changed tx sketch.

Thank you for your prompt reply.
I am not that expert in programming,please take me step by step.

this is my TX Code:

 #include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
RF24 radio(9, 8); // CE, CSN         
const byte address[6] = "00001";     //Byte of array representing the address. This is the address where we will send the data. This should be same on the receiving side.

//boolean switchStates[6] = 0;

byte switchStates[6];
int switchPin[6]={2,3,4,5,6,7};

void setup() {
  Serial.begin(9600);
pinMode(switchPin[6], INPUT);

radio.begin();                  //Starting the Wireless communication
radio.openWritingPipe(address); //Setting the address where we will send the data
radio.setPALevel(RF24_PA_MIN);  //You can set it as minimum or maximum depending on the distance between the transmitter and receiver.
radio.stopListening();          //This sets the module as transmitter
}
void loop()
{
  
   byte switchStates[6];
   for (byte n = 0; n < 6; n++) 
      {
        switchStates[n] = digitalRead(switchPin[n]);
        radio.write(&switchStates[n], sizeof(switchStates[n]));
         Serial.println( switchStates[n]);
    delay(5);
    } 
}

RX Code:

#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
RF24 radio(9, 8); // CE, CSN
const byte address[6] = "00001";
byte switchStates[6];
int LED_Pin[6]={2,3,4,5,6,7};
int switchPin[6]={2,3,4,5,6,7};

char text[32] = ""; 

void setup() {
pinMode(LED_Pin[6], OUTPUT);
;
Serial.begin(9600);
radio.begin();
radio.openReadingPipe(0, address);   //Setting the address at which we will receive the data
radio.setPALevel(RF24_PA_MIN);       //You can set this as minimum or maximum depending on the distance between the transmitter and receiver.
radio.startListening();              //This sets the module as receiver
}
void loop()
{
  byte switchStates[6];
if (radio.available())              //Looking for the data.
 {
   for (byte n = 0; n < 6; n++) 
   {
     switchStates[n] = digitalRead(switchPin[n]);
     radio.read(&switchStates[n], sizeof(switchStates[n]));
     if(switchStates[n] == HIGH)
       {
         digitalWrite(LED_Pin[n], HIGH);
         Serial.println(text);
        }
      else
        {
          digitalWrite(LED_Pin[n], LOW);
          Serial.println("Leds are Low"); 
         }
       }  
   } 
  delay(2);
 }