Ich habe mir ein paar NRF24l01-Chips zugelegt, damit einige meiner genutzten Arduinos miteinander kommunizieren können.
So sendet zum Beispiel ein am Stromzähler angebrachter Arduino den Stromverbrauch an meinen Master-Arduino, welcher wiederum über meinen Server die Daten speichert.

Dieser Chip samt Mirf-Bibliothek für die Arduino IDE erschienen mir damals beim Aufbau des Projektes das Passende zu sein.

Allerdings muss ich jedes Mal, wenn ich wieder einen NRF24l01 verbauen will, recherchieren, wie man die zahlreichen Pins mit dem Arduino verbindet und wie man die Mirf-Bibliothek verwendet.

Das möchte ich nun in einem Artikel zusammenfassen.

Anschlüsse

Ansicht von oben
NRF24l01-Pin => Arduino

1 => GND*<br/>2 => VCC (3.3 V)*<br/>3 => 8**<br/>4 => 7**<br/>5 => 13<br/>6 => 11<br/>7 => 12<br/>8 => ***

 
*) Ja nach verwendetem Arduino und Stromversorgung kann es zu Sende-/Empfangsproblemen mit dem NRF24l01 kommen. Ein direkt auf den Chip gelöteter 1µF- bis 10µF- Kondensator (es wurde wohl auch schon erfolgreich ein 100nF-Kondensator dazwischengeschaltet) zwischen GND und VCC könnte hier Abhilfe schaffen.
**) Pin-Belegung kann im Software-Sketch geändert werden. 8+7 sind der Standard, wenn im Software-Sketch nichts anderes angegeben wird.
***) Wird bei der Mirf-Bibliothek nicht benötigt

Die Anschlüsse sind leider nicht Breadboard-kompatibel, deshalb musste ich mir ein paar Male to Female Jumper Kabel zulegen.

Sketch-Beispiele

Die Beispiels-Sketche, die mit der Bibliothek mitgeliefert wurden, waren wir anfangs nicht sehr hilfreich, da sie nicht direkt meiner geplanten Verwendung entsprachen.
Dadurch, dass nur byte versendet werden können und ich es mit der Typen-Konvertierung der Arduino-IDE noch nicht so wirklich drauf habe, war aller Anfang etwas schwer.

In meinen Beispielen haben wir zwei Sketches – ein Arduino ist der Sender, der andere Arduino ist der Empfänger – und es werden (in diesem Fall maximal) 15 alphanumerische Zeichen übertragen.
Das absolute Maximum an Zeichen, die bei einer Übertragung übertragen werden können, lautet übrigens: 32 Zeichen.

Sender

#include <Mirf.h>
#include <MirfHardwareSpiDriver.h>

int x=0;

void setup() {
  Serial.begin(9600);
  // RF24/Mirf initalisieren
  //Mirf.cePin  = 8;  // Sollte der CE-Pin  (3) an einem anderen Arduino-Port angeschlossen werden müssen (8: Standard)
  //Mirf.csnPin = 7;  // Sollte der CSE-Pin (4) an einem anderen Arduino-Port angeschlossen werden müssen (7: Standard)
  Mirf.spi = &MirfHardwareSpi;
  Mirf.init();
  Mirf.payload = 16; // Wir werden einen String mit 15 Zeichen versenden
  Mirf.channel = 90; // Optional. Sende-/Empfangsfrequenz ändern
  Mirf.config();
  Mirf.configRegister(RF_SETUP, 0x06); // Optional. Soll die Datenrate angeblich auf 1MHz ändern, was zu besserer Reichweite führt
  Mirf.setTADDR((byte *)"ardu01"); // Name des Empfängers. 5 Zeichen!
  }

void loop() {
  // Fake-Daten, die wir senden möchten. x mit einem Wert zwischen 1 und 99
  if (++x > 99) { x = 1; }
  // Senden
  char mirfdata[16];
  sprintf(mirfdata, "Test abcde x=%02i", x); // Alles in die 15 Zeichen packen. 16. Zeichen bleibt als Terminator-Zeichen leer
  Mirf.send((byte *) &mirfdata);
  while( Mirf.isSending() ) ;
  // Konsolen-Info und nen paar Sekunden bis zum nächsten Sendevorgang warten
  Serial.print(mirfdata);
  Serial.println(" gesendet");
  delay(5000);
  }

Empfänger

Mirf.payload
,
Mirf.channel
und
Mirf.configRegister(RF_SETUP)
sollten hier gleich wie beim Sender gesetzt werden.

Ebenso muss die

Mirf.setRADDR
(Name des Empfängers) nun der
Mirf.setTADDR
(Empfänger-Adresse beim Sender) des Senders entsprechen.
Achtung: Mirf.setRADDR und Mirf.setTADDR nicht verwechseln!

#include <SPI.h>
#include <Mirf.h>
#include <nRF24L01.h>
#include <MirfHardwareSpiDriver.h>

char mirfdata[16];

void setup() {
  Serial.begin(9600);
  // RF24/Mirf initalisieren
  Mirf.cePin  = 9;  // Hier habe ich als Beispiel mal den CE-Pin beim Arduino an D9 angeschlossen
  Mirf.csnPin = 10; // ...und den CSN-Pin beim Arduino an D10
  Mirf.spi = &MirfHardwareSpi;
  Mirf.init();
  Mirf.payload = 16;
  Mirf.channel = 90;
  Mirf.config();
  Mirf.configRegister(RF_SETUP, 0x06);
  Mirf.setRADDR((byte *)"ardu01"); // Ich bin ardu01
  }

void loop() {
  if (Mirf.dataReady()) {
    while (!Mirf.rxFifoEmpty()) {
      Mirf.getData((byte *) &mirfdata);
      }
    if (mirfdata[0] != 0 && mirfdata != 0) {
      Serial.print("Folgendes empfangen: ");
      Serial.println(mirfdata);
      }
    }
  delay(100);
  }