Overview
The NRF24L01+ is a single-chip 2.4 GHz wireless transceiver from Nordic Semiconductor that gives you bidirectional data links between microcontrollers without WiFi, Bluetooth, or licensing complications. It runs on 3.3V, communicates with a host MCU over SPI, and supports up to 6 simultaneous receive pipes — meaning a single base node can listen to 6 sensor nodes simultaneously. Range is around 100 m line-of-sight with the standard PCB-trace antenna; the PA+LNA variant with external antenna pushes that to 1 km+.
Use it for wireless sensor networks, RC vehicles, drone telemetry, home automation hubs, two-way controllers, distributed data loggers, or anything that needs reliable, low-power, point-to-point or star-topology RF communication. The popular RF24 Arduino library makes setup essentially trivial — pick an address, set a channel, and you're transmitting.
The module operates in the worldwide-available 2.4 GHz ISM band on 125 selectable channels. It supports data rates from 250 kbps (longest range) up to 2 Mbps (shortest range), automatic ACK + retransmit, and dynamic payload lengths up to 32 bytes per packet. Power consumption in deep sleep is just 22 nA, making it ideal for battery-powered sensor nodes that wake up briefly to send a reading and then sleep for hours.
At a Glance
Specifications
| Parameter | Value |
| Chipset | Nordic Semiconductor nRF24L01+ |
| Frequency Band | 2.400 - 2.525 GHz (ISM, license-free) |
| Channel Count | 125 (1 MHz spacing) |
| Modulation | GFSK |
| Data Rates | 250 kbps, 1 Mbps, 2 Mbps |
| Output Power | 0 / -6 / -12 / -18 dBm (selectable) |
| Receive Sensitivity | -94 dBm @ 250 kbps, -82 dBm @ 2 Mbps |
| Operating Voltage | 1.9V - 3.6V |
| TX Current | ~11.3 mA @ 0 dBm |
| RX Current | ~13.5 mA |
| Standby Current | ~22 µA |
| Power Down Current | ~900 nA |
| Logic Inputs | 5V tolerant (CSN, SCK, MOSI, CE) |
| Max Payload | 32 bytes per packet |
| Pin Header | 2×4 (8 pins) 2.54 mm |
Pinout Diagram
Wiring Guide
Arduino UNO / Nano
The nRF24L01 is 3.3V-powered but its inputs are 5V tolerant, so you can drive it from Arduino's 5V SPI pins directly. Power must come from a 3.3V source (Arduino's 3V3 pin can usually supply enough current with the recommended decoupling caps).
| Module | Arduino UNO |
|---|---|
| VCC | 3.3V (NOT 5V) |
| GND | GND |
| CE | D9 |
| CSN | D10 |
| SCK | D13 |
| MOSI | D11 |
| MISO | D12 |
| IRQ | not connected (optional) |
ESP32 / Raspberry Pi Pico
| Module | ESP32 | Pi Pico |
|---|---|---|
| VCC | 3V3 | 3V3 |
| GND | GND | GND |
| CE | GPIO4 | GP6 |
| CSN | GPIO5 | GP5 |
| SCK | GPIO18 | GP2 |
| MOSI | GPIO23 | GP3 |
| MISO | GPIO19 | GP4 |
Code Examples
Arduino Transmitter (using RF24 library)
#include <SPI.h>
#include <RF24.h>
RF24 radio(9, 10); // CE, CSN
const byte address[6] = "00001";
void setup() {
Serial.begin(9600);
radio.begin();
radio.openWritingPipe(address);
radio.setPALevel(RF24_PA_MIN);
radio.stopListening();
}
void loop() {
const char text[] = "Hello World";
bool ok = radio.write(&text, sizeof(text));
Serial.println(ok ? "TX ok" : "TX fail");
delay(1000);
}
Arduino Receiver
#include <SPI.h>
#include <RF24.h>
RF24 radio(9, 10); // CE, CSN
const byte address[6] = "00001";
void setup() {
Serial.begin(9600);
radio.begin();
radio.openReadingPipe(0, address);
radio.setPALevel(RF24_PA_MIN);
radio.startListening();
}
void loop() {
if (radio.available()) {
char text[32] = {0};
radio.read(&text, sizeof(text));
Serial.print("RX: ");
Serial.println(text);
}
}