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.
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.
Inhaltsverzeichnis
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.
Empfänger – für das Empfangen der Sensordaten
Dem Empfänger „verpassen“ wir das OLED Display welches dazu dient die Sensordaten anzuzeigen.
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.
Modul | Arduino Nano V3 |
---|---|
nRF24L01 | |
VCC | 5 V (im betrieb ohne Regler an 3,3V) |
GND | GND |
CE | digitaler Pin D6 |
CSN | digitaler Pin D7 |
SCK | digitaler Pin D13 |
MO (MOSI) | digitaler Pin D11 |
MI (MISO) | digitaler Pin D12 |
IRQ | – bleibt leer – |
DHT11 Sensor | |
VCC | 5V |
Data | digitaler Pin D2 |
NC / NULL | – bleibt leer – |
GND | GND |
OLED Display | |
SCL | analoger Pin A5 |
SDA | analoger Pin A4 |
VCC | 5V |
GND | GND |
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; }
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:
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?
… 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.
Gibt es Antworten zu gestellten Fragen, wenn ja, wo?
Hallo Herr Matti,
es gibt Antworten unter den Fragen.
Aber es kann manchmal etwas länger dauern bis eine Antwort kommt.
Gruß,
Stefan