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