In this article, we are going to control an Arduino’s built in LED on pin 13 with another Arduino using a 2.4 Ghz NRF2401 wireless transceiver
What you’ll need to carry out this project;
Hardware
- 2 x Arduino UNO microcontroller board, buy it here
- 2 x 2.4 Ghz NRF2401 wireless transceiver, get them here
Software
- The latest Arduino IDE (download here)
Introducing the 2.4 Ghz NRF2401 transceiver module.
The 2.4 Ghz NRF2401 is used where wireless communication or control between systems is needed. The 2.4 Ghz NRF2401 is a transceiver meaning it can transmit and receive data. The module is very cheap and can be interfaced with any micro-controller.
Technical specifications:
- Antenna range > 1km
- Frequency = 2.4 Ghz
- Range of operating input voltage = 1.9v -3.6v
Note: Special arrangements must be made when working with 5v circuits,

|
1 |
<em>The 2.4 Ghz NRF2401 transciever</em> |
IMPLEMENTATION
Let us proceed to interfacing the Arduino UNO with the 2.4 Ghz NRF2401 transceiver.
STEP 1: CIRCUIT CONNECTION
Make sure the two Arduino/NRF2401 are connected like this.

NOTE: OPERATING VOLTAGE RANGE IS 1.9V TO 3.6V. DO NOT EXCEED THE MAXIMUM VOLTAGE.
STEP 2: INSTALL REQUIRED LIBRARIES
The NRF2401 transceiver requires a library to be installed and used for the project to work.
- Get the library RF24-master
- Make sure your Arduino IDE is closed.
- Once the zip is downloaded, extract the folders to the libraries folder of your Arduino
- You’ve installed the RF24 library successfully.
STEP 3: CODE
Since there will be a master Arduino which will send messages to the slave Arduino. Upload this code to your selected master Arduino
Master Arduino Code
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
<span class="com">#include</span> <span class="str"><SPI.h></span> <span class="com">#include</span> <span class="str"><RH_NRF24.h></span> <span class="com">// Create an instance of the radio driver</span><span class="pln"> RH_NRF24 nrf24</span><span class="pun">;</span> <span class="com">// RH_NRF24 nrf24(8, 7); // use this to be electrically compatible with Mirf</span> <span class="com">// RH_NRF24 nrf24(8, 10);// For Leonardo, need explicit SS pin</span> <span class="com">// RH_NRF24 nrf24(8, 7); // For RFM73 on Arduino Mini</span> <span class="kwd">void</span><span class="pln"> setup</span><span class="pun">()</span> <span class="pun">{</span><span class="pln"> </span><span class="typ">Serial</span><span class="pun">.</span><span class="kwd">begin</span><span class="pun">(</span><span class="lit">9600</span><span class="pun">);</span><span class="pln"> </span><span class="kwd">while</span> <span class="pun">(!</span><span class="typ">Serial</span><span class="pun">)</span><span class="pln"> </span><span class="pun">;</span> <span class="com">// wait for serial port to connect. Needed for Leonardo only</span><span class="pln"> </span><span class="kwd">if</span> <span class="pun">(!</span><span class="pln">nrf24</span><span class="pun">.</span><span class="pln">init</span><span class="pun">())</span><span class="pln"> </span><span class="typ">Serial</span><span class="pun">.</span><span class="pln">println</span><span class="pun">(</span><span class="str">"init failed"</span><span class="pun">);</span><span class="pln"> </span><span class="com">// Defaults after init are 2.402 GHz (channel 2), 2Mbps, 0dBm</span><span class="pln"> </span><span class="kwd">if</span> <span class="pun">(!</span><span class="pln">nrf24</span><span class="pun">.</span><span class="pln">setChannel</span><span class="pun">(</span><span class="lit">1</span><span class="pun">))</span><span class="pln"> </span><span class="typ">Serial</span><span class="pun">.</span><span class="pln">println</span><span class="pun">(</span><span class="str">"setChannel failed"</span><span class="pun">);</span><span class="pln"> </span><span class="kwd">if</span> <span class="pun">(!</span><span class="pln">nrf24</span><span class="pun">.</span><span class="pln">setRF</span><span class="pun">(</span><span class="pln">RH_NRF24</span><span class="pun">::</span><span class="typ">DataRate2Mbps</span><span class="pun">,</span><span class="pln"> RH_NRF24</span><span class="pun">::</span><span class="typ">TransmitPower0dBm</span><span class="pun">))</span><span class="pln"> </span><span class="typ">Serial</span><span class="pun">.</span><span class="pln">println</span><span class="pun">(</span><span class="str">"setRF failed"</span><span class="pun">);</span><span class="pln"> </span><span class="pun">}</span> <span class="kwd">void</span><span class="pln"> loop</span><span class="pun">()</span> <span class="pun">{</span><span class="pln"> </span><span class="kwd">if</span> <span class="pun">(</span><span class="pln">nrf24</span><span class="pun">.</span><span class="pln">available</span><span class="pun">())</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="com">// Should be a message for us now </span><span class="pln"> uint8_t buf</span><span class="pun">[</span><span class="pln">RH_NRF24_MAX_MESSAGE_LEN</span><span class="pun">];</span><span class="pln"> uint8_t len </span><span class="pun">=</span> <span class="kwd">sizeof</span><span class="pun">(</span><span class="pln">buf</span><span class="pun">);</span><span class="pln"> </span><span class="kwd">if</span> <span class="pun">(</span><span class="pln">nrf24</span><span class="pun">.</span><span class="pln">recv</span><span class="pun">(</span><span class="pln">buf</span><span class="pun">,</span> <span class="pun">&</span><span class="pln">len</span><span class="pun">))</span><span class="pln"> </span><span class="pun">{</span> <span class="com">// NRF24::printBuffer("request: ", buf, len);</span><span class="pln"> </span><span class="typ">Serial</span><span class="pun">.</span><span class="kwd">print</span><span class="pun">(</span><span class="str">"got request: "</span><span class="pun">);</span><span class="pln"> </span><span class="typ">Serial</span><span class="pun">.</span><span class="pln">println</span><span class="pun">((</span><span class="kwd">char</span><span class="pun">*)</span><span class="pln">buf</span><span class="pun">);</span><span class="pln"> </span><span class="com">// Send a reply</span><span class="pln"> uint8_t data</span><span class="pun">[]</span> <span class="pun">=</span> <span class="str">"And hello back to you"</span><span class="pun">;</span><span class="pln"> nrf24</span><span class="pun">.</span><span class="pln">send</span><span class="pun">(</span><span class="pln">data</span><span class="pun">,</span> <span class="kwd">sizeof</span><span class="pun">(</span><span class="pln">data</span><span class="pun">));</span><span class="pln"> nrf24</span><span class="pun">.</span><span class="pln">waitPacketSent</span><span class="pun">();</span><span class="pln"> </span><span class="typ">Serial</span><span class="pun">.</span><span class="pln">println</span><span class="pun">(</span><span class="str">"Sent a reply"</span><span class="pun">);</span><span class="pln"> </span><span class="pun">}</span><span class="pln"> </span><span class="kwd">else</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="typ">Serial</span><span class="pun">.</span><span class="pln">println</span><span class="pun">(</span><span class="str">"recv failed"</span><span class="pun">);</span><span class="pln"> </span><span class="pun">}</span><span class="pln"> </span><span class="pun">}</span> <span class="pun">}</span> |
Slave Arduino Code
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
<span class="com">#include</span> <span class="str"><SPI.h></span> <span class="com">#include</span> <span class="str"><RH_NRF24.h></span> <span class="com">// Singleton instance of the radio driver</span><span class="pln"> RH_NRF24 nrf24</span><span class="pun">;</span> <span class="com">// RH_NRF24 nrf24(8, 7); // use this to be electrically compatible with Mirf</span> <span class="com">// RH_NRF24 nrf24(8, 10);// For Leonardo, need explicit SS pin</span> <span class="com">// RH_NRF24 nrf24(8, 7); // For RFM73 on Anarduino Mini</span> <span class="kwd">void</span><span class="pln"> setup</span><span class="pun">()</span> <span class="pun">{</span><span class="pln"> </span><span class="typ">Serial</span><span class="pun">.</span><span class="kwd">begin</span><span class="pun">(</span><span class="lit">9600</span><span class="pun">);</span><span class="pln"> </span><span class="kwd">while</span> <span class="pun">(!</span><span class="typ">Serial</span><span class="pun">)</span><span class="pln"> </span><span class="pun">;</span> <span class="com">// wait for serial port to connect. Needed for Leonardo only</span><span class="pln"> </span><span class="kwd">if</span> <span class="pun">(!</span><span class="pln">nrf24</span><span class="pun">.</span><span class="pln">init</span><span class="pun">())</span><span class="pln"> </span><span class="typ">Serial</span><span class="pun">.</span><span class="pln">println</span><span class="pun">(</span><span class="str">"init failed"</span><span class="pun">);</span><span class="pln"> </span><span class="com">// Defaults after init are 2.402 GHz (channel 2), 2Mbps, 0dBm</span><span class="pln"> </span><span class="kwd">if</span> <span class="pun">(!</span><span class="pln">nrf24</span><span class="pun">.</span><span class="pln">setChannel</span><span class="pun">(</span><span class="lit">1</span><span class="pun">))</span><span class="pln"> </span><span class="typ">Serial</span><span class="pun">.</span><span class="pln">println</span><span class="pun">(</span><span class="str">"setChannel failed"</span><span class="pun">);</span><span class="pln"> </span><span class="kwd">if</span> <span class="pun">(!</span><span class="pln">nrf24</span><span class="pun">.</span><span class="pln">setRF</span><span class="pun">(</span><span class="pln">RH_NRF24</span><span class="pun">::</span><span class="typ">DataRate2Mbps</span><span class="pun">,</span><span class="pln"> RH_NRF24</span><span class="pun">::</span><span class="typ">TransmitPower0dBm</span><span class="pun">))</span><span class="pln"> </span><span class="typ">Serial</span><span class="pun">.</span><span class="pln">println</span><span class="pun">(</span><span class="str">"setRF failed"</span><span class="pun">);</span><span class="pln"> </span><span class="pun">}</span> <span class="kwd">void</span><span class="pln"> loop</span><span class="pun">()</span> <span class="pun">{</span><span class="pln"> </span><span class="typ">Serial</span><span class="pun">.</span><span class="pln">println</span><span class="pun">(</span><span class="str">"Sending to nrf24_server"</span><span class="pun">);</span><span class="pln"> </span><span class="com">// Send a message to nrf24_server</span><span class="pln"> uint8_t data</span><span class="pun">[]</span> <span class="pun">=</span> <span class="str">"Hello World!"</span><span class="pun">;</span><span class="pln"> nrf24</span><span class="pun">.</span><span class="pln">send</span><span class="pun">(</span><span class="pln">data</span><span class="pun">,</span> <span class="kwd">sizeof</span><span class="pun">(</span><span class="pln">data</span><span class="pun">));</span><span class="pln"> nrf24</span><span class="pun">.</span><span class="pln">waitPacketSent</span><span class="pun">();</span><span class="pln"> </span><span class="com">// Now wait for a reply</span><span class="pln"> uint8_t buf</span><span class="pun">[</span><span class="pln">RH_NRF24_MAX_MESSAGE_LEN</span><span class="pun">];</span><span class="pln"> uint8_t len </span><span class="pun">=</span> <span class="kwd">sizeof</span><span class="pun">(</span><span class="pln">buf</span><span class="pun">);</span><span class="pln"> </span><span class="kwd">if</span> <span class="pun">(</span><span class="pln">nrf24</span><span class="pun">.</span><span class="pln">waitAvailableTimeout</span><span class="pun">(</span><span class="lit">500</span><span class="pun">))</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="com">// Should be a reply message for us now </span><span class="pln"> </span><span class="kwd">if</span> <span class="pun">(</span><span class="pln">nrf24</span><span class="pun">.</span><span class="pln">recv</span><span class="pun">(</span><span class="pln">buf</span><span class="pun">,</span> <span class="pun">&</span><span class="pln">len</span><span class="pun">))</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="typ">Serial</span><span class="pun">.</span><span class="kwd">print</span><span class="pun">(</span><span class="str">"got reply: "</span><span class="pun">);</span><span class="pln"> </span><span class="typ">Serial</span><span class="pun">.</span><span class="pln">println</span><span class="pun">((</span><span class="kwd">char</span><span class="pun">*)</span><span class="pln">buf</span><span class="pun">);</span><span class="pln"> </span><span class="pun">}</span><span class="pln"> </span><span class="kwd">else</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="typ">Serial</span><span class="pun">.</span><span class="pln">println</span><span class="pun">(</span><span class="str">"recv failed"</span><span class="pun">);</span><span class="pln"> </span><span class="pun">}</span><span class="pln"> </span><span class="pun">}</span><span class="pln"> </span><span class="kwd">else</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="typ">Serial</span><span class="pun">.</span><span class="pln">println</span><span class="pun">(</span><span class="str">"No reply, is nrf24_server running?"</span><span class="pun">);</span><span class="pln"> </span><span class="pun">}</span><span class="pln"> delay</span><span class="pun">(</span><span class="lit">400</span><span class="pun">);</span> <span class="pun">}</span> |
STEP 4: RESULTS
- Open up the Serial monitor of master Arduino code

- Using any terminal of your choice, i am using Tera Term. Download it here

Arduino serial monitor result
I hope you enjoyed building this project
Wanna do more?
Build a wireless temperature monitoring system using the following parts
Power supply