Skip to content

Technik Blog

Programmieren | Arduino | ESP32 | MicroPython | Python | Raspberry Pi | Raspberry Pi Pico

Menu
  • Smarthome
  • Arduino
  • ESP32 & Co.
  • Raspberry Pi & Pico
  • Solo Mining
  • Über mich
  • Deutsch
  • English
Menu

Übertragen von Sensordaten per nRF24L01 Modul

Posted on 12. April 20213. Mai 2023 by Stefan Draeger

In diesem Beitrag möchte ich dir zeigen wie du Sensordaten mit Hilfe des nRF24L01 Modules zwischen zwei Microcontroller der Arduino Familie senden bzw. empfangen kannst.

Arduino Nano V3 mit DHT11 Sensor & OLED Display
Arduino Nano V3 mit DHT11 Sensor & OLED Display

Zusätzlich möchte ich diese Daten auf einem kleinen OLED Display anzeigen lassen.

Wie du einfache Daten zwischen zwei nRF24L01 Module senden bzw. empfangen kannst, habe ich dir im Beitrag Arduino Nano V3 – nRFL01 Modul – Datenübertragung ausführlich erläutert.

nRF24L01 Modul zusammngesteckt
nRF24L01 Modul mit SMA Antenne und Regler Modul
nRF24L01 Modul mit SMA Antenne und Regler Modul

  • benötigte Bauteile für das übertragen von Sensordaten per nRF24L01
  • Aufbau der Schaltungen
    • Sender – für das Übertragen der Sensordaten
    • Empfänger – für das Empfangen der Sensordaten
    • Pins – Arduino Nano > Module
  • Quellcode
    • Sender mit nRF24L01 und DHT11 Modul
    • Empfänger mit nRF24L01 und 0,96″ OLED Display
  • Sketche / Programme zum Download
  • Video

benötigte Bauteile für das übertragen von Sensordaten per nRF24L01

Für dieses kleine Projekt benötigst du folgende Bauteile:

  • zwei Microcontroller der Arduino Familie (zbsp. Arduino Nano V3, Arduino UNO R3 oder Arduino MEGA 2560)
  • zwei nRF24L01 Module mit SMA Antenne,
  • einen DHT11 Sensor,
  • ein 0,96″ OLED Display,
  • diverse Breadboardkabel,
  • zwei 170 Pin Breadboards

Aufbau der Schaltungen

Sender – für das Übertragen der Sensordaten

An dem Sender schließen wir den DHT11 Sensor an. Dieser Sensor liefert uns die Temperatur sowie die relative Luftfeuchtigkeit.

Schaltung - Arduino Nano mit DHT11 Sensor un nRF24L01 Modul
Schaltung – Arduino Nano mit DHT11 Sensor un nRF24L01 Modul

Empfänger – für das Empfangen der Sensordaten

Dem Empfänger „verpassen“ wir das OLED Display welches dazu dient die Sensordaten anzuzeigen.

Schaltung - Arduino Nano mit OLED Display & nRF24L01 Modul
Schaltung – Arduino Nano mit OLED Display & nRF24L01 Modul

Pins – Arduino Nano > Module

Im nachfolgenden möchte ich dir gerne eine kleine Tabelle zeigen wo ich dir die Pins der Module zum Arduino Nano V3 aufzeige.

ModulArduino Nano V3
nRF24L01
VCC5 V (im betrieb ohne Regler an 3,3V)
GNDGND
CEdigitaler Pin D6
CSNdigitaler Pin D7
SCKdigitaler Pin D13
MO (MOSI)digitaler Pin D11
MI (MISO)digitaler Pin D12
IRQ– bleibt leer –
DHT11 Sensor
VCC5V
Datadigitaler Pin D2
NC / NULL– bleibt leer –
GNDGND
OLED Display
SCLanaloger Pin A5
SDAanaloger Pin A4
VCC5V
GNDGND

Quellcode

Hier nun der Quellcode für das Senden und Empfangen von Daten mit dem nRF24L01 Modul.

Sender mit nRF24L01 und DHT11 Modul

//Bibliotheken laden
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>

#include <DHT.h>
#include <DHT_U.h>

#define DHTTYPE    DHT11
#define DHTPIN 2 
DHT dht(DHTPIN, DHTTYPE);

//CE - digitaler Pin D6
//CSN - digitaler Pin D7
RF24 radio(6, 7);  // CE, CSN

//Adresse über welche die Kommunikation stattfinden soll
const byte address[6] = "00001";

void setup(){
  //beginn der seriellen Kommunikation mit 9600baud
  Serial.begin(9600);
 
  radio.begin();
  dht.begin();
  
  //setzen der Adresse
  radio.openWritingPipe(address);
  
  //das Modul soll als Sender agieren daher
  //keine "abhören"
  radio.stopListening();
}
void loop(){
    //Nachricht welche gesendet werden soll
    const char status[200];
    readDHT11ValuesAsJSON().toCharArray(status, 200);
    //senden der Nachricht
    radio.write(&status, sizeof(status));

    //Der DHT11 Sensor liefert nur alle 2 Sekunden neue Messwerte
    //daher eine kleine Pause.
    delay(2000);
}

String readDHT11ValuesAsJSON(){
  //lesen der rel. Luftfeuchtigkeit
  float h = dht.readHumidity();
  //lesen der Temperatur in Celsius
  //wenn die Temperatur in Fahrenheit gelesen werden soll
  //muss der boolische Parameter "true" übergeben werden
  float t = dht.readTemperature();

  //Aufbauen des JSONs
  String result = "{";
  result = result + "t:" + String(t, 2) + ",";
  result = result + "h:" + String(h, 2);
  result = result + "}";

  return result;
}
Sketch in der Arduino IDE zum senden der Daten des DHT11 Sensors mit dem nRF24L01
Sketch in der Arduino IDE zum senden der Daten des DHT11 Sensors mit dem nRF24L01

Empfänger mit nRF24L01 und 0,96″ OLED Display

//Bibliotheken laden
#include <Wire.h>
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>

//Bibliotheken für den betrieb des Displays
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);

//CE - digitaler Pin D6
//CSN - digitaler Pin D7
RF24 radio(6, 7);  // CE, CSN

//Adresse über welche die Kommunikation stattfinden soll
const byte address[6] = "00001";

void setup() {
  //solange der serielle Port nicht initialisiert ist
  //soll ein leere Schleife ausgeführt werden
  while (!Serial);

  //beginn der seriellen Kommunikation mit 9600baud
  Serial.begin(9600);

  radio.begin();

  //setzen der Adresse
  //es können mehr als eine Adresse verwendet werden
  radio.openReadingPipe(0, address);

  //starten des "abhören"
  radio.startListening();

  //initialisieren des Displays
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  display.display();
  delay(1000);
  display.setTextSize(1);
  display.setTextColor(WHITE);
}

void loop() {
  //Wenn Daten empfangen wurden, dann...
  if (radio.available()) {
    display.clearDisplay();
    //einen Buffer für den gelesen Text initialisieren
    char text[200] = {0};
    //lesen der Daten in den Buffer
    radio.read(&text, sizeof(text));

    //Umwandeln des char Arrays in ein String
    String jsonLine = String(text);
    //parsen des Textes
    parseAndDisplayText(jsonLine);
  }
}

void parseAndDisplayText(String jsonLine) {
  //Wenn das JSON komplett empfangen wurde, dann...
  if (jsonLine.startsWith("{") && jsonLine.endsWith("}")) {

    //Variablen um die Temperatur & die rel. Luftfeuchtigkeit zu speichern
    String temp = "";
    String hum = "";

    //zunächst schneiden wir das erste und letze Zeichen ab (die geschweiften Klammern)
    String subStr = jsonLine.substring(1, jsonLine.length() - 1);

    //Als trenner zwischen den Werten haben wir ein Komma, dieses suchen wir nun
    for (int i = 0; i <= subStr.length(); i++) {
      //Wenn das Komma gefunden wurde, dann...
      if (subStr.charAt(i) == ',') {
        //die Temperatur ist an der ersten Stelle, wird aber durch "t:" eingeleitet welches wird auch abschneiden,
        temp = subStr.substring(2, i);
        //die rel. Luftfeuchtigkeit ist an der zweiten Stelle und wird durch "h:" eingeleitet, zusätzlich müssen
        //wir noch das Komma mit abschneiden
        hum = subStr.substring(i + 3, subStr.length());
        break;
      }
    }

    //anzeigen der Daten auf dem Display
    displayLine(0, "Temperatur: " + temp + "C");
    displayLine(1, "Luftfeuchte: " + hum + "%");
  }
}

void displayLine(int zeile, String text) {
  display.setCursor(0, zeile * 10);
  display.println(text);
  display.display();
}

Sketche / Programme zum Download

Hier nun die beiden Programme zum Download:

Beispiel 3 – Übertragen und anzeigen der Daten eines DHT11 Sensors mit nRF24L01 ModuleHerunterladen

Video

13 thoughts on “Übertragen von Sensordaten per nRF24L01 Modul”

  1. Wolfgang Matti sagt:
    23. Juni 2021 um 09:09 Uhr

    Sehr guter Beitrag, leider funktioniert das Ganze bei mir nicht.- Der Sender gibt seriell die korrekten Werte aus, das Display auf der Empfängerseite zeigt nur „Adafruit industries“ und keine Werte (Temperatur und Luftfeuchte).
    Was könnte hier falsch sein?

    Antworten
    1. GeZe sagt:
      8. September 2021 um 15:55 Uhr

      … da kann alles Mögliche falsch sein.
      Empfehlung zur Selbsthilfe: Sender und Empfänger mit print()-Meldungen debagen um die Fehlerursache einzugrenzen.
      Pauschal kann die Frage aus der Ferne nicht beantwortet werden.

      Antworten
  2. Wolfgang Matti sagt:
    23. Juni 2021 um 13:55 Uhr

    Gibt es Antworten zu gestellten Fragen, wenn ja, wo?

    Antworten
    1. Stefan Draeger sagt:
      24. Juni 2021 um 13:01 Uhr

      Hallo Herr Matti,

      es gibt Antworten unter den Fragen.
      Aber es kann manchmal etwas länger dauern bis eine Antwort kommt.

      Gruß,

      Stefan

      Antworten
  3. Niels Nelson sagt:
    17. Januar 2023 um 18:19 Uhr

    Hallo wie würde es beim Empfänger Code aussehen, falls man z.B. 3 Variablen zu empfangen hätte. Wie sollte man in dem if Statement vorgehen?
    Danke im Voraus für die Rückmeldung.

    Antworten
    1. Stefan Draeger sagt:
      18. Januar 2023 um 07:44 Uhr

      Hi,

      wenn du drei Werte übertragen möchtest, dann musst du zunächst das JSON um den Wert der Variable erweitern:
      //Aufbauen des JSONs
      String result = "{";
      result = result + "t:" + String(t, 2) + ",";
      result = result + "h:" + String(h, 2)+ ",";
      result = result + "v:" + String(v, 2);
      result = result + "}";

      Beim Empfänger muss man nun auf diese Variable auslesen, in der For-Schleife habe ich definiert, dass bis zum ersten Komma der Wert der Temperatur und nach dem Komma der rel. Luftdruck ist.
      Für die neue Variable müsste man hier den String splitten und dann die einzelnen Textstellen auswerten.


      //Als trenner zwischen den Werten haben wir ein Komma, dieses suchen wir nun
      int index = 0;
      int offset = 2;
      for (int i = 0; i <= subStr.length(); i++) { //Wenn das Komma gefunden wurde, dann... if (subStr.charAt(i) == ',') { if(index == 0){ temp = subStr.substring(offset, 2); } else if(index == 1){ hum = subStr.substring(offset + i, 2); } else if(index == 2){ v = subStr.substring(offset + i, 2); } index++; break; } }

      Gruß
      Stefan

      Antworten
  4. Niels Nelson sagt:
    25. Januar 2023 um 17:28 Uhr

    Hallo Stefan,
    ich bedanke mich die die schnelle Rückmeldung. Beim Sender habe ich mir auch gedacht, dass man die Werte einfach weiter hinzufügen muss. Aber beim Empfänger verstehe ich nicht ganz, was die Variablen offset und index machen. Und auch der Wert 2 in der Funktion subString ist mir nicht sehr klar. Was würde geschehen, falls man z.B. eine 3 da stehen hätte.

    Vielen Dank noch für den Vorschlag, denn ich muss für ein Projekt mit drei sensoren arbeiten und die Werte mit dem NRF24l01 per funk senden. Nur hier konnte ich einen Ansatz bezüglich der Programmierung finden.

    Antworten
    1. Stefan Draeger sagt:
      25. Januar 2023 um 17:48 Uhr

      Hi,

      der Wert offset steht für die Länge der Keys im JSON also „t:“, „h:“, „v:“, die Variable index dient dazu zu erkennen an welcher Stelle wir im JSON gerade sind.
      An Stelle 0 werten wir die Temperatur aus, an 1 die Luftfeuchtigkeit und an 2 den neuen Wert.

      Ich denke, ich werde da mal was aufbauen und mit einer entsprechenden Bibliothek arbeiten damit wird es deutlich einfacher.

      Gruß

      Stefan

      Antworten
      1. Niels Nelson sagt:
        25. Januar 2023 um 19:54 Uhr

        Okay darauf würde ich mich wirklich freuen.
        Danke für die Erklärung ich war nicht sicher, ob ich damit richtig lag.

        Antworten
      2. Niels Nelson sagt:
        26. Januar 2023 um 11:41 Uhr

        Dankeschön darauf würde ich mich wirklich sehr freuen. Ich hätte aber noch eine Frage. Ich bin, wie du im Kommentar geschrieben hast, vorgegangen aber beim Empfänger wird im seriellen Monitor keine Werte angezeigt. Da frage ich mich, ob die Größe des Buffers eine Rolle spielt, denn ich möchte 7 Werte aus Sensoren mit dem NRF20l01+ Modul empfangen. Ich bekomme jedoch Eq<rgebnisse, wenn ich die Methode mit zwei Variablen verwende.

        Ich freue mich auf deine Antwort
        Gruß
        Niels

        Antworten
  5. Niels Nelson sagt:
    25. Januar 2023 um 19:51 Uhr

    Ich hätte eine Frage und zwar bin ich wie im Kommentar vorgegangen aber im seriellen Monitor bleibt die Zeile leer und nichts wird angezeigt und ich möchte 7 Werte auslesen, dabei kommen 6 Werte aus Sensoren und einen Wert aus einem analogen Pin. Ich möchte also wissen, ob die Größe des Buffer dabei eine Rolle spielt, denn ich habe für das Buffer den Wert 300 initialisiert.
    Danke im Voraus für die Hilfe

    Antworten
  6. Niels Nelson sagt:
    25. Januar 2023 um 20:24 Uhr

    Hi,
    hätte noch eine Frage und zwar bin ich , wie im Kommentar geschrieben, vorgegangen aber bei mir wird eine leere Zeile anzeigt. Daher möchte ich wissen, ob die Größe des Buffers eine Rolle spielt, denn ich möchte 7 Werte empfangen.

    Viele Grüße
    Niels

    Antworten
  7. Niels Nelson sagt:
    26. Januar 2023 um 10:26 Uhr

    Dankeschön darauf würde ich mich sehr freuen.
    Ich habe aber noch eine Frage . Ich bin wie du im Kommentar geschrieben hast, vorgegangen aber die Werte werden nicht angezeigt. Dabei frage ich mich, ob die Größe des Buffers eine Rolle spielt , denn ich möchte 7 Werte mit dem NRF-Modul empfangen. Werte werden nur gezeigt, wenn ich das Beispiel mit zwei variablen übernehme.

    Antworten

Schreibe einen Kommentar Antworten abbrechen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Fragen oder Feedback?

Du hast eine Idee, brauchst Hilfe oder möchtest Feedback loswerden?
Support-Ticket erstellen

Newsletter abonnieren

Bleib auf dem Laufenden: Erhalte regelmäßig Updates zu neuen Projekten, Tutorials und Tipps rund um Arduino, ESP32 und mehr – direkt in dein Postfach.

Jetzt Newsletter abonnieren

Unterstütze meinen Blog

Wenn dir meine Inhalte gefallen, freue ich mich über deine Unterstützung auf Tipeee.
So hilfst du mit, den Blog am Leben zu halten und neue Beiträge zu ermöglichen.

draeger-it.blog auf Tipeee unterstützen

Vielen Dank für deinen Support!
– Stefan Draeger

Kategorien

Tools

  • Unix-Zeitstempel-Rechner
  • ASCII Tabelle
  • Spannung, Strom, Widerstand und Leistung berechnen
  • Widerstandsrechner
  • 8×8 LED Matrix Tool
  • 8×16 LED Matrix Modul von Keyestudio
  • 16×16 LED Matrix – Generator

Links

Blogverzeichnis Bloggerei.de TopBlogs.de das Original - Blogverzeichnis | Blog Top Liste Blogverzeichnis trusted-blogs.com

Stefan Draeger
Königsberger Str. 13
38364 Schöningen

Tel.: 01778501273
E-Mail: info@draeger-it.blog

Folge mir auf

  • Impressum
  • Datenschutzerklärung
  • Disclaimer
  • Cookie-Richtlinie (EU)
©2025 Technik Blog | Built using WordPress and Responsive Blogily theme by Superb
Cookie-Zustimmung verwalten
Wir verwenden Technologien wie Cookies, um Geräteinformationen zu speichern und/oder darauf zuzugreifen. Wir tun dies, um das Surferlebnis zu verbessern und um personalisierte Werbung anzuzeigen. Wenn Sie diesen Technologien zustimmen, können wir Daten wie das Surfverhalten oder eindeutige IDs auf dieser Website verarbeiten. Wenn Sie Ihre Zustimmung nicht erteilen oder zurückziehen, können bestimmte Funktionen beeinträchtigt werden.
Funktional Immer aktiv
Die technische Speicherung oder der Zugang ist unbedingt erforderlich für den rechtmäßigen Zweck, die Nutzung eines bestimmten Dienstes zu ermöglichen, der vom Teilnehmer oder Nutzer ausdrücklich gewünscht wird, oder für den alleinigen Zweck, die Übertragung einer Nachricht über ein elektronisches Kommunikationsnetz durchzuführen.
Vorlieben
Die technische Speicherung oder der Zugriff ist für den rechtmäßigen Zweck der Speicherung von Präferenzen erforderlich, die nicht vom Abonnenten oder Benutzer angefordert wurden.
Statistiken
Die technische Speicherung oder der Zugriff, der ausschließlich zu statistischen Zwecken erfolgt. Die technische Speicherung oder der Zugriff, der ausschließlich zu anonymen statistischen Zwecken verwendet wird. Ohne eine Vorladung, die freiwillige Zustimmung deines Internetdienstanbieters oder zusätzliche Aufzeichnungen von Dritten können die zu diesem Zweck gespeicherten oder abgerufenen Informationen allein in der Regel nicht dazu verwendet werden, dich zu identifizieren.
Marketing
Die technische Speicherung oder der Zugriff ist erforderlich, um Nutzerprofile zu erstellen, um Werbung zu versenden oder um den Nutzer auf einer Website oder über mehrere Websites hinweg zu ähnlichen Marketingzwecken zu verfolgen.
Optionen verwalten Dienste verwalten Verwalten von {vendor_count}-Lieferanten Lese mehr über diese Zwecke
Einstellungen anzeigen
{title} {title} {title}