• Hallo Zusammen, Aufgrund der aktuellen Situation setzten wir die Möglichkeit aus, sich mit Gmail zu registrieren. Wir bitten um Verständnis Das RCMP Team

Praxisbericht NRF24L01 2,4 GHz Sende und Empfangsmodul für Arduino

LP1503

Mitglied
Hallo BAXL, das hat leider alles nichts geholfen. Ich versuche jetzt noch andere Codes, dass ich zumindest einfache Werte übertragen bekomme. Vielen Dank schon mal für deine Hilfe!

LG Laurin
 

Sub-7

Mitglied
Hallo,
hier mein Code, evtl. kann jemand gebrauchen.
Video


Sender:
C:
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#define CE_PIN   8
#define CSN_PIN  9

const byte slaveAddress[5] = {'R','x','A','A','A'};
RF24 radio(CE_PIN, CSN_PIN);

char dataToSend[10] = "Message 0";
char txNum = '0';
int ackData[3] = {0, 0, 0}; // um die beiden vom Rx kommenden Werte zu halten
bool newData = false;
unsigned long currentMillis;
unsigned long prevMillis;
unsigned long txIntervalMillis = 1000; // einmal pro Sekunde senden

void setup() {
    Serial.begin(9600);
    radio.begin();
    radio.setDataRate( RF24_250KBPS );
    radio.setChannel(75);               // 0-127
    radio.setPALevel(RF24_PA_MIN);      // RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm, RF24_PA_MED=-6dBM, RF24_PA_HIGH=0dBm
    radio.enableAckPayload();
    radio.setRetries(5,5);              // delay, count
    radio.openWritingPipe(slaveAddress);
}

void loop() {
    currentMillis = millis();
    if (currentMillis - prevMillis >= txIntervalMillis) {
////////Sende/////////
    bool rslt;
    rslt = radio.write( &dataToSend, sizeof(dataToSend) );
    Serial.print("Sende: ");
    Serial.print(dataToSend);
    if (rslt)
     {
        if ( radio.isAckPayloadAvailable() ) {
            radio.read(&ackData, sizeof(ackData));
            newData = true;
        }else{
            Serial.println("  Bestätigt, aber keine Daten!");
        }
        updateMessage();
        }else{
        Serial.println("  Tx fehlgeschlagen");
      }
    prevMillis = millis();
/////////////////

    }
////////PRINT LN/////////   
   if (newData == true) {
        Serial.print("  RX antwortet mit ");
        Serial.print(ackData[0]);
        Serial.print(", ");
        Serial.print(ackData[1]);
        Serial.print(", ");
        Serial.println(ackData[2]);
        newData = false;
    }
/////////////////     
}

// So kannst Du sehen, dass neue Daten gesendet werden
void updateMessage() {
        
    txNum += 1;
    if (txNum > '9') {
        txNum = '0';
    }
    dataToSend[8] = txNum;
}
Empfänger
C:
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#define CE_PIN   8
#define CSN_PIN  9

const byte thisSlaveAddress[5] = {'R','x','A','A','A'};
RF24 radio(CE_PIN, CSN_PIN);

char dataReceived[10];         // Dies muss mit dataToSend im TX übereinstimmen
int  Acceleration = 12;        // Siehe "ackData"
int  Angle        = 95;
int  Depth        = 22;
int  ackData[3] = {Acceleration, Angle, Depth}; // Die Werte, die an den Master gesendet werden sollen
bool newData = false;

void setup() {
    Serial.begin(9600);
    radio.begin();
    radio.setDataRate( RF24_250KBPS ); // RF24_250KBPS for 250kbs, RF24_1MBPS for 1Mbps, or RF24_2MBPS for 2Mbps
    radio.setChannel(75);              // 0-127
    radio.setPALevel(RF24_PA_MIN);     // RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm, RF24_PA_MED=-6dBM, RF24_PA_HIGH=0dBm
    radio.openReadingPipe(1, thisSlaveAddress);
    radio.enableAckPayload();
    radio.startListening();
    radio.writeAckPayload(1, &ackData, sizeof(ackData)); // vorbereite Daten
}

void loop() {
 
        if ( radio.available() ) {
        radio.read( &dataReceived, sizeof(dataReceived) );
        radio.writeAckPayload(1, &ackData, sizeof(ackData)); // load the payload for the next time
        newData = true;
    }

        if (newData == true) {
        Serial.print("Daten erhalten: ");
        Serial.print(dataReceived);
        Serial.print(" Antworte mit: ");
        Serial.print(ackData[0]);
        Serial.print(", ");
        Serial.print(ackData[1]);
        Serial.print(", ");
        Serial.println(ackData[2]);
        newData = false;
    }

}
 

Anhänge

BAXL

Admin
Mitarbeiter
Hey super, danke für den Code:thumbsup:
Könntest Du einen kurzen Hinweis geben was der Code macht, bzw. Was das Besondere an ihm ist? :)
 

Sub-7

Mitglied
Sehr gerne :thumbsup:

Features sind:
Funke verschickt ALLE Variablen (Licht, Knüppel, Servo.. usw) als Paket (Array), allso man packt alles was man braucht in ein Array (Paket) und raus mit.
Funke erhält eine Rückmeldung wenn Paketversand Fehlerhaft ist, siehe Kommentar -> " Bestätigt, aber keine Daten!"
Funke wirft eine Fehlermeldung wenn die Verbindung fehlschlägt, siehe Kommentar -> " Tx fehlgeschlagen"
nRF24L01-Transceiver-Working-Packet-Transmission-Data-Lost.gif

49-te Sekunde -> Video, sieht man im Display in der Zeile zwei (rechts von der Batterie) ist es grün bis ich Empfänger von der Batterie trenne, so erhalte ich ein Fehler " Tx fehlgeschlagen", da wird Verbindungszeichen rot und der Buzzer löst aus.


Achtung:
in meinem Beispiel stellt die Funke nur die Verbindung zum Sender her, es werden KEINE Variablen gesendet, nur auf Verbindungsfehler geprüft, aber es wird Empfangen.
siehe Zeile: int ackData[3] = {Acceleration, Angle, Depth}; // Die Werte, die an den Master (Sender) gesendet werden sollen
Mit "radio.write" könnt ihr auch Daten/Variable senden, ja ich weiß, das kennt ihr schon.

Tipp:
1. kommentiert was ihr im Code schreibt oder ändert.
2. jede geschriebene Zeile testen.
3. und immer ein Backup machen.


Viel Spaß beim ausprobieren.
 
Zuletzt von einem Moderator bearbeitet:

Runni

Mitglied
@DS+61

Hallo DS und willkommen im Forum. Ich schreibe mal der Reihe nach. Man kann im Prinzip mehr als 6 NRF24 zusammen betreiben, allerdings kann ein NRF24 nur mit maximal 6 anderen NRF24 quasi gleichzeitig kommunizieren.

Die Lösung sind so eine Art Hub-Systeme, das kann sogar jeder einzelne Arduino sein. Damit würde quasi ein Baum aufgebaut. Das hätte sogar noch den Vorteil, dass, wenn die Sensoren im Haus verteilt sind, dadurch eine Reichweitenerhöhung entsteht. Guck mal bei schullebernd.de:
https://schullebernd.de/master-slave-netzwerk-mit-nrf24l01-und-arduino-esp8266/
und bei : howtomechatronics.com
https://howtomechatronics.com/tutor...eless-network-with-multiple-nrf24l01-modules/


Zum Schlafmodus, ja der NRF24 hat sowas und soll dann wohl ~0,900 µA brauchen, das habe ich selbst nur noch nicht ausprobiert, das müsste ich mir auch mal ansehen. Wie hoch bzw. niedrig der Stromkonsum tatsächlich ist, weiß ich deshalb leider auch (noch) nicht.
Guckst Du hier: https://forum.mysensors.org/topic/2693/sensor-nrf24l01-sleep-current

Es gibt dazu auch einen Funktionsaufruf:
radio.powerDown(); PowerDown .0009mA, das habe ich von hier: https://github.com/nRF24/RF24/issues/195

Wenn Du einen µC einsetzt, sollte der doch auch in den Schlafmodus zu versetzen sein (~75µA), allerdings wird das bei den Hub µCs etwas schwierig.

Zumindest beim Nano gibt es ein paar Tricks um den Stromverbrauch noch zu drücken, oder Du mußt Dir einen Atmel µC nehmen und die Peripherie selbst stricken. Ob man evtl. noch einen ATTiny nehmen kann wäre auszuprobieren, zumindest sollte der einen NRF24 ansteuern können.
Hallo,
ich hätte da 2 Fragen zu diesem Beitrag, die mir hoffentlich Jemand beantworten kann.
Ich habe dieses Mesh-Network Beispiel nachgebaut und es funktioniert einwandfrei!
(https://howtomechatronics.com/tutor...eless-network-with-multiple-nrf24l01-modules/)

Aber

1. Wie kann man 2 Netzwerke parallel laufen lassen, also wie verhindert man , dass sich die Module stören, wenn jetzt z.B. mein Nachbar das selbe aufgebaut hat und es im Moment betreibt?
Wie mache ich mein Netzwerk von Modulen individuell? Oder falls im Code schon vorhanden und ich verstehe es nicht, welche Variable ist zu ändern?

2. Ist im Beispielcode von diesem Netzwerk eine legale Frequenz (für Deutschland) eingestellt? Beiträge früher haben ja auf sowas sensibilisiert.

Gruß
und danke schonmal, falls sich Jemand Meiner annimmt :)
 
Zuletzt bearbeitet:

BAXL

Admin
Mitarbeiter
Hallo Runni,

das Mesh-Network habe ich (noch) nicht aufgebaut und auch keine zwei Netzwerke parallel betrieben. Ich würde rein aus der Logik heraus das Problem mit unterschiedlichen Adressräumen lösen.

Eine zusätzliche Sicherheit ist vermutlich, dass die Datentelegramme gewissen Vereinbarungen genügen müssen, damit diese auch verwertet werden.
Du könntest evtl. in das Datentelegramm, ans Ende, eine Art "Netzwerkadresse" hängen. Also quasi ein weiteres Datenfeld, dass beim Emfang abgeglichen wird.

Ist die Sache mit Deinem Nachbarn denn tatsächlich so, oder ist das nur eine allgemeine Annahme von Dir um sicherzustellen, dass im Fall der Fälle keine Störungen auftreten können?

Mit den Frequenzen könntest Du zusätzlich "spielen", damit zumindest die Doppeltbelegung von Kanälen die Kommunikation nicht noch zusätzlich belastet. Die zugelassenen Kanäle/Frequenzen, hatte ich bereits eingegrenzt.
Welcher Kanal/Frequenz per Default gesetzt wird, wenn kein Parameter gewollt mit setChannel() übergeben wird, müsstest Du in der NRF-Library nachsehen. Dokumentation RF24 Library
Das habe ich bisher nicht explizit untersucht, ist aber in der Tat interessant zu wissen.

Gruß
Norbert
 

Runni

Mitglied
Hallo Runni,

das Mesh-Network habe ich (noch) nicht aufgebaut und auch keine zwei Netzwerke parallel betrieben. Ich würde rein aus der Logik heraus das Problem mit unterschiedlichen Adressräumen lösen.

Eine zusätzliche Sicherheit ist vermutlich, dass die Datentelegramme gewissen Vereinbarungen genügen müssen, damit diese auch verwertet werden.
Du könntest evtl. in das Datentelegramm, ans Ende, eine Art "Netzwerkadresse" hängen. Also quasi ein weiteres Datenfeld, dass beim Emfang abgeglichen wird.

Ist die Sache mit Deinem Nachbarn denn tatsächlich so, oder ist das nur eine allgemeine Annahme von Dir um sicherzustellen, dass im Fall der Fälle keine Störungen auftreten können?

Mit den Frequenzen könntest Du zusätzlich "spielen", damit zumindest die Doppeltbelegung von Kanälen die Kommunikation nicht noch zusätzlich belastet. Die zugelassenen Kanäle/Frequenzen, hatte ich bereits eingegrenzt.
Welcher Kanal/Frequenz per Default gesetzt wird, wenn kein Parameter gewollt mit setChannel() übergeben wird, müsstest Du in der NRF-Library nachsehen. Dokumentation RF24 Library
Das habe ich bisher nicht explizit untersucht, ist aber in der Tat interessant zu wissen.

Gruß
Norbert

Danke für die superschnelle Antwort!

Das mit dem Nachbarn war nur eine allgemeine Annahme bzw. Beispiel um meine Vorstellung zu erläutern.

Ok der Hinweis mit der Dokumentation RF24 Library werd ich bei Zeiten probieren nach zu gehen.

Gruß
Dirk
 

Runni

Mitglied
Hallo Runni,

das Mesh-Network habe ich (noch) nicht aufgebaut und auch keine zwei Netzwerke parallel betrieben. Ich würde rein aus der Logik heraus das Problem mit unterschiedlichen Adressräumen lösen.

Eine zusätzliche Sicherheit ist vermutlich, dass die Datentelegramme gewissen Vereinbarungen genügen müssen, damit diese auch verwertet werden.
Du könntest evtl. in das Datentelegramm, ans Ende, eine Art "Netzwerkadresse" hängen. Also quasi ein weiteres Datenfeld, dass beim Emfang abgeglichen wird.

Ist die Sache mit Deinem Nachbarn denn tatsächlich so, oder ist das nur eine allgemeine Annahme von Dir um sicherzustellen, dass im Fall der Fälle keine Störungen auftreten können?

Mit den Frequenzen könntest Du zusätzlich "spielen", damit zumindest die Doppeltbelegung von Kanälen die Kommunikation nicht noch zusätzlich belastet. Die zugelassenen Kanäle/Frequenzen, hatte ich bereits eingegrenzt.
Welcher Kanal/Frequenz per Default gesetzt wird, wenn kein Parameter gewollt mit setChannel() übergeben wird, müsstest Du in der NRF-Library nachsehen. Dokumentation RF24 Library
Das habe ich bisher nicht explizit untersucht, ist aber in der Tat interessant zu wissen.

Gruß
Norbert
Hast du mir vielleicht noch ein Beispiel, wie das mit "weiteres Datenfeld, dass beim Empfang abgeglichen wird" , funktioniert? Das hört sich gut an!
LG
 

BAXL

Admin
Mitarbeiter
Hast du mir vielleicht noch ein Beispiel, wie das mit "weiteres Datenfeld, dass beim Empfang abgeglichen wird" , funktioniert? Das hört sich gut an!
LG
Das ist an und für sich recht einfach. Wenn Du Temperaturen oder sonstige Messwerte und Zustände übermittelst verwendest Du jeweils eine Variable, die Du mit in den Datenkontainer packst.


Du erstellst also einfach nur eine zusätzliche Variable die z.B. "DataNet" heißt und gibst der einen Wert. Meinetwegen 86, oder 32 oder so :). Den Wert übermittelt der Sender. Der Empfänger prüft, ob diese Variable mit dem Wert 86 oder 32 oder so übertragen wurde. Wenn ja, dann ist alles in Butter.

So sieht es in meinem Urbeispiel aus: struct Wert {byte Event; int Temp; int Lux;} Messung;
So könnte es mit der Erweiterung aussehen: struct Wert {byte Event; int Temp; int Lux; byte DataNet} Messung;



Ich halte es aber für wenig wahrscheinlich, dass Du auch ohne diese Sicherung überhaupt Probleme bekommen wirst.
 
Zuletzt bearbeitet:

BAXL

Admin
Mitarbeiter
@Runni
Ich habe es raus mit dem Kanal.
In RF24.cpp findet man in der begin (void) Prozedur folgendes
...
// Set up default configuration. Callers can always change it later.
// This channel should be universally safe and not bleed over into adjacent
// spectrum.
setChannel(76);
....

Channel 76 entspricht
76 => 2476 Mhz
Für den privaten Bereich freigegeben sind die Frequenzen 2400,0 –2483,5 MHz

Damit wäre bei der Defaulteinstellung durch die Lib alles in Butter.
 

Runni

Mitglied
Hallöchen, ich mal wieder...

Hab mir so ein Mesh Netzwerk mal aufgebaut.
Jetzt bin ich auf ein neues Problem gestoßen, vielleicht kann mich hier Jemand erleuchten?!
(https://howtomechatronics.com/tutor...eless-network-with-multiple-nrf24l01-modules/)
das habe ich als Beispiel genommen.

Ich habe ein Master mit
Node 00
dann
Node 01, Node 02, Node 03, Node 04
soweit funktioniert es auch super, aber wenn ich eine Reihe tiefer gehe, funktioniert es nicht mehr.
Wenn ich dem Node 01 ein "Kind" anhänge mit 011,
Kann ich mit dem 011er den Master 00 nicht ansprechen, bei dem ich aber gerne auch mit dem Node 011 was triggern will :-(
Versteh ich das Mesh Prinzip nicht?

LG
 

BAXL

Admin
Mitarbeiter
Ich habe mich jetzt nicht wieder da rein vertieft, aber ist es nicht generell unmöglich noch eine Ebene höher zu gehen. Ich meine mich erinnern zu können, dass das nicht geht.
 

Runni

Mitglied
Lt. dem dazugehörigen Video, scheint man darüber hinaus gehen zu können.
Jedoch im Beispiel wird es nicht genutzt.
Aber Danke dir für deine schnelle Antwort.
LG
 

BAXL

Admin
Mitarbeiter
Hallo Runni, im Grunde ist es aber tatsächlich nicht nachbollziehbar, warum ebenen nicht übersprungen werden können, das würde die Sache sinnlos machen. Die Vernetzung soll es ja eigentlich ermöglichen, Geräte zu erreichen, die nicht in direkter Funkteichweite liegen. Ich sehe mit das aber noch einmal an, ich hatte die Tage leider nur wenig Zeit und für sowas braucht man Ruhe.
 

Runni

Mitglied
Hallo BAXL, nur kurz dazu eine blöde Frage, kann es daran liegen, dass ich NRF24L01 Module habe und nicht NRF24L01+ .
Dachte zwar das der Unterschied nur darin liegt, dass bei dem + keine Daten verloren gehen können. Aber vielleicht gibt's da ja noch mehr Unterschiede?
 

BAXL

Admin
Mitarbeiter
Hallo BAXL, nur kurz dazu eine blöde Frage, kann es daran liegen, dass ich NRF24L01 Module habe und nicht NRF24L01+ .
Dachte zwar das der Unterschied nur darin liegt, dass bei dem + keine Daten verloren gehen können. Aber vielleicht gibt's da ja noch mehr Unterschiede?
Gute Frage. Mit Sicherheit kann ich das nicht mit ja beantworten. Ich habe aber sehr oft die Erfahrung gemacht, dass Probleme an Kleinigkeiten liegen, die man nicht vermutet.
Das + könnte also durchaus das "Plus" ausmachen. Manchmal kommt man auf die Lösung nur durch trial and error.

Woran machst Du denn fest, dass Du nur die NRF24l01 ohne das Plus hast?
Bei meinen Modulen stand das nicht ausdrücklich in der Produktbeschreibung der Shopseite. Das sieht man wenn man die Gravur des ICs liest.
 

Runni

Mitglied
Danke für den Tip mit der Gravur, hab es gerade mal unterm USB-Microskop betrachtet, ich habe tatsächlich (+) Module :) !
Also kann es daran wohl nicht liegen :cry:
 

BAXL

Admin
Mitarbeiter
Danke für den Tip mit der Gravur, hab es gerade mal unterm USB-Microskop betrachtet, ich habe tatsächlich (+) Module :) !
Also kann es daran wohl nicht liegen :cry:
Ja, schade, wäre zumindest eine Möglichkeit gewesen. Über die Woche habe ich wenig Zeit nachzusehen, weil ich quasi den ganzen Tag am Rechner hänge und froh bin, wenn ich die Kiste ausschalten kann.
Ich würde mir am WE allerdings nur die Doku und die Codes ansehen, ein eigener Versuchsaufbau ist etwas zu aufwändig, weil ich dazu andere Aufbauten auseinanderreißen müsste.
 
Top Bottom