NRF24L01 се захранва с 3.3v. Една от хубавите страни на тези модули е, че нивата на сигналите за комуникация с Ардуино работят както на 3.3v, така и на 5v, за разлика от WiFi модулите ESP8266, които са само на 3.3v. При първите опити за подкарване на комуникацията между два nRF модула или не се получаваше никаква връзка, или в най-добрия случай беше само в едната посока. Един от проблемите са свързани именно със захранване на модулите - нужно е да се ползва кондензатор като филтър. За целта между Vcc (3.3v) и Gnd свързах един кондензатор 47µf. Вероятно ще е най-добре да се ползва отделно захранване с по-добри характеристики.

   След като захранихме nRF24L01 модула, време е да свържем и останалите пинове към Ардуино-то.

Номерация на пиновете на nRF24L01:

1 GND
2 VCC
3 CE
4 CSN
5 SCK
6 MOSI
7 MISO
8 IRQ


   При използване на Arduino Nano:

nRF24L01 | Nano
----------------
 (GND) 1  Gnd
 (VCC) 2  3.3v
 (CE) 3   D9
 (CSN) 4  D10
 (SCK) 5  D13
(MOSI) 6  D11
(MISO) 7  D12
 (IRQ) 8  Не се ползва


   Ако ползваме Arduino Mega:

nRF24L01 | Mega
----------------
 (GND) 1  Gnd
 (VCC) 2  3.3v
 (CE) 3   D8
 (CSN) 4   D7
 (SCK) 5  D52
(MOSI) 6  D51
(MISO) 7  D50
 (IRQ) 8  Не се ползва


   Идва ред на софтуера. Използва се библиотека за NF24L01 (download).


   Декларация на библиотеки:


#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>

   Инициализация:
// Деклариране на константи и пинове
#define CE_PIN 9  //За MEGA пин 8
#define CSN_PIN 10 //За MEGA пин 7

// Забележка: "LL" в краят на константата е идентификатор за тип "LongLong"
const uint64_t pipe = 0x0102030405LL; // Дефиниция на адрес на комуникационната линия

// Деклариране на обекти
RF24 radio(CE_PIN, CSN_PIN); // Създаване на радио-обект

void setup()  
{
 Serial.begin(9600);
  
 //инициализация на радио обекта и поставянето му в режим на приемане
 radio.begin();
 radio.openReadingPipe(1, pipe);
 radio.startListening();
}


   Един примерен Loop():

int ccTest = 0;

void loop()  
{
 String recievedData = NRF24Listener(); //това трябва да стои в loop-а(слушаме за пакети с данни)
 if (recievedData != "") //проверка дали има приет пакет с данни
 {
  //действия с получената информация от радиото (в променливата recievedData)
  Serial.println(recievedData);
 } 
   
 //примерна ситуация за изпращане на пакет с данни
 ccTest++;
 if (ccTest == 9999)
 {
  sendDataPacket(String(ccTest)); //изпращаме пакет с данни при ccTest равнo на 9999
  ccTest = 0;
 }
 //край на примера за изпращане на пакет с данни

}


   Описание на методи за изращане и получаване на информация:

void sendDataPacket(String dataToSend) //фукция за изпращане на пакет данни
{
 radio.stopListening();
 Serial.println("Tx:" + dataToSend;
  
 int str_len = dataToSend.length() + 1;
 char text[str_len];
 dataToSend.toCharArray(text, str_len);
  
 radio.openWritingPipe(pipe);
 radio.write(&text, sizeof(text));
 delay(10);
 radio.openReadingPipe(1, pipe);
 radio.openReadingPipe(0, 0ULL); 
 radio.startListening();
}

String NRF24Listener()
{
 String result = "";
 if ( radio.available() )
  {
  // Четем докато получим целия пакет с информация
  bool done = false;
  while (!done)
   {
    // Fetch the data payload
    char text[32] = {0};
    done = radio.read(&text, sizeof(text));
    result = text;
   }
  }
}