#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;
}
#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;
}
}
Hallo,@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 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
Ich hatte auch schon mal schnell drüber geguckt, aber scheinbar muss man sogar in den Quellcode gehen, da komme ich gerade nicht dran. Der ist auf einem anderen Rechner zuhause.Ok der Hinweis mit der Dokumentation RF24 Library werd ich bei Zeiten probieren nach zu gehen.
Hast du mir vielleicht noch ein Beispiel, wie das mit "weiteres Datenfeld, dass beim Empfang abgeglichen wird" , funktioniert? Das hört sich gut an!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
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.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
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.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?
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.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