• 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

BAXL

Admin
Mitarbeiter
Danke für das Lob, ich bin aber noch nicht am Ende angekommen, da droht noch die Sache mit mehr als 6 Messstellen und falls eine Messstelle mit ihrer Sendeleistung nicht bis zum Master kommt (Stichwort Mesh). Aber dafür muß ich noch etwas lesen, verstehen und experimentieren. Im Moment habe ich da absolut keine Peilung.:confused: Vorher will ich noch das OLED-Display einsetzen und in meinem Hirn reift der erste Prototyp, der nicht mehr auf einem Steckbrett ist und mittelfristig in ein Gehäuse gepackt werden soll.
 

ersatzteil

Mitglied
Große klasse! Vielen Dank! Ich bekomme richtig Lust, auch mal was mit nem Arduino zu basteln. Es liegt sogar schon seit ein paar Jahren einer hier rum. Aber irgendwie finde ich keine Zeit und Muße, mich da mal ranzusetzen. Da muss man sich ja schon richtig einarbeiten, das macht man nicht mal so nebenbei...
 

BAXL

Admin
Mitarbeiter
Große klasse! Vielen Dank! Ich bekomme richtig Lust, auch mal was mit nem Arduino zu basteln. Es liegt sogar schon seit ein paar Jahren einer hier rum. Aber irgendwie finde ich keine Zeit und Muße, mich da mal ranzusetzen. Da muss man sich ja schon richtig einarbeiten, das macht man nicht mal so nebenbei...
Das ist wahr, es hat mich viele Stunden gekostet, bis die Fuhre mit dem NRF24 endlich gelaufen ist. Es ist aber immer ein tolles Gefühl, wenn man nicht aufgegeben hat und plötzlich der Groschen fällt. Man muß nur einmal etwas Anschwung haben und gedanklich drin sein. Mit meinen Sachen kratze ich aber längst noch an der Oberfläche. Der größte Motivator ist aber eine konkrete Anwendung, die man Stück für Stück wachsen sieht. Nebenbei gewinnt man immer mehr Erkenntnisse und Übung. Der finanzielle Aufwand hält sich auch in Grenzen.
 

BAXL

Admin
Mitarbeiter
Als nächstes arbeite ich daran, einen NRF24l01 an einen WEMOS D1 mini anzuschließen. Das D1 mini hat zwar von Hause aus ein eigenes 2,4GHz Sende- und Empfangsteil, benötigt zum Betrieb aber immer ein funktionierendes WLAN, was man nicht immer zur Verfügung hat, oder aus gewissen Gründen nicht nutzen möchte. Es gibt verschiedentlich Informationen dazu, aber wie gehabt, alles irgendwie lückenhaft und verstreut. Es geht kaum einer etwas mehr in die Tiefe. Irgendwie klappt bei denen was, aber wie und warum, und vor allem, wie man das für eigene Projekte adaptieren kann, da ist wieder intensive Eigenarbeit gefragt.

 

BAXL

Admin
Mitarbeiter
Kurzes Intermezzo

Für die Spannungsversorgung habe ich mir zusätzliche Adapterplatinen bestellt, mit dem man die NRF24l01 über einen 3,3V Spannungsregler direkt an die 5V Versorgung des Arduinos anschließen kann. Damit entfällt auch der obligatorische 10µF Elko zur Strompufferung im Sendebetrieb. Die ersten Tests verliefen sehr positiv.

 

BAXL

Admin
Mitarbeiter
Hallo heidepower, willkommen bei uns im Forum. Zuerst hätte ich noch eine Bitte an Dich, würdest Du den Code bitte hier direkt in den Post einfügen? Das hat den Grund, dass es oft ungewiss ist, ob der Content auf Deinem Host immer zur Verfügung steht. Es ist ja nicht mal eben in ein paar Sekunden erledigt, Deinen Code zu analysieren und darauf hin zu antworten. Sollte Dein Code von dem fremden Hoster verschwinden, sind alle nachfolgenden Bemühungen hier im Thema verloren, weil schlicht der Bezug fehlt.

Das Einfügen geht hier auch ganz einfach. Klicke dazu auf das Symbol links neben dem Kamerasymbol, Dann geht ein Dropdown Menü auf, wähle dort die Eintrag Code. Kopiere Deinen Code in das Fensterchen, das dann aufgeht. Du kannst Deinen Beitrag noch 24 Stunden editieren.

Nun zu dem, was mir ad hoc aufgefallen ist. Du verwendest in der Setuproutine den Befehl radio.setRetries(5,15); , den ich nicht verwende. Das muß nichts heißen, stellt aber einen Unterschied dar. Was ist der Grund dafür? Du setzt eine andere Sendefrequenz, hat das einen Grund, oder ist das nur zum Ausprobieren gewesen, weil es bislang nicht funktioniert? Warum steht im Empfangsprogramm radio.openWritingPipe(rxAddr); und nicht radio.openReadingPipe(rxAddr);


Wie stabil ist Deine Versorgungsspannung, die 500ms in der Dauerschleife scheinen mir auf den ersten Blick ebenfalls recht kurz? Hast Du den Stützkondensator angeschlossen? Auf was für einem Board läuft Deine Anwendung?

Du solltest zuerst alle Möglichkeiten ausschöpfen um technisch sicher zu stellen, dass auch wirklich Daten gesendet werden.
 
Zuletzt bearbeitet:

heidepower

Neuer Benutzer
Hey, erstmal hier den Code.....

Code:
//RX
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
//float druck = 0.00;
//float temp = 0.00;
struct Wert {float temp = 0.00; float druck = 0.00 ;} Messung;
const byte rxAddr[6] = {0xF0F0F0F0E1LL};                   
RF24 radio(9, 10);                                          // Define Radio (CE-PIN,CSN-PIN)
void setup() {
pinMode(9,OUTPUT);
pinMode(10,OUTPUT);
Serial.begin(9600);                                         // Diganose
radio.begin();
radio.setPALevel(RF24_PA_MAX);                              // Transmit Power (MAX,HIGH,LOW,MIN)
radio.setDataRate( RF24_250KBPS );                          // Transmit Speeed (250 Kbits)
radio.setChannel(125);                                      // Channel 126
radio.setRetries(5,15);                                     // 15 Wiederholungen
radio.openWritingPipe(rxAddr); 
radio.startListening();                                      // enable Receiver
}
void loop()
{
  Serial.println(Messung.temp); 
  Serial.println(Messung.druck);
  radio.startListening();
  if ( radio.available())
  {   
  radio.read(&Messung, sizeof(Messung));
  Serial.println(Messung.temp); 
  Serial.println(Messung.druck);
  }                           
}
Code:
//TX
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
//float druck = 1.11;
//float temp = 2.22;
struct Wert {float temp = 1.11; float druck = 2.22 ;} Messung;
const byte rxAddr[6] = {0xF0F0F0F0E1LL};                   
RF24 radio(9, 10);                                          // Define Radio (CE-PIN,CSN-PIN)
void setup() {
pinMode(9,OUTPUT);
pinMode(10,OUTPUT);
Serial.begin(9600); 
radio.begin();
radio.setPALevel(RF24_PA_MAX);                              // Transmit Power (MAX,HIGH,LOW,MIN)
radio.setDataRate( RF24_250KBPS );                          // Transmit Speeed (250 Kbits)
radio.setChannel(125);                                      // Channel 126
radio.setRetries(5,15);                                     // 15 Wiederholungen
radio.openWritingPipe(rxAddr); 
radio.stopListening();                                      // Disable Receiver
}
void loop()
{
  //radio.stopListening();
  radio.write(&Messung, sizeof(Messung)); // Sendebefehl
  Serial.println(Messung.temp); 
  Serial.println(Messung.druck);
                             
  delay(500);
}
Zur frequenz..., weil hier nicht soviel los ist wie auf anderen Kanälen.
Zur Spannungsversorgung... Elkos, und Etnstörkondensatoren sitze nahst möglich am NRF
Welches Board...Das Programm läuft jeweils auf einem mini 5V 16Mhz der auf einer selbst geäzten Platine sitz, mit netzteil NRF etc...
Abtastrate... Ist kein Problem in dem bisherigen Programm wo ich nur einen Wert übertrage, mache ich dies in einer 50ms Schleife.

Aber danke für den Tipp mit dem "radio.openReadingPipe(0, rxAddr); " das war tatsachlich der Fehler. Jetz bekomme ich einen Wert empfangen!

Was ich nicht ganz verstanden habe in deine Erkläreung mit dem "const byte rxAddr[6] = {0xF0F0F0F0E1LL};" habe ich das so richtig gemacht? Denn dadurch sollte ja die Kommunikation Stör empfindlicher sein!?
Denn der Aufbau soll später in einem Auto verbaut werden. Und bei den Testfahrten ist mir aufgefallen das ich ab und zu (in der Stadt) immer mal wieder die Kommunikation gestört ist. Auf dem Land kein Problem. Eig immer nur an den gleichen Stellen treten die Kommunikationsstörungen auf. Deswegen auch der Kanal von 126 ;) da war es wesentlich besser!
 

BAXL

Admin
Mitarbeiter
Ah, ok, das mit der Frequenz verstehe ich jetzt. Meintest Du bei der Adresse störempfindlicher oder störunempfindlicher. Bei meinen Recherchen hatte ich gelesen, dass es besser sei, wenn bei der Adresse bzw. Generell möglichst viele Flanken vorhanden sind. Bei den Daten hat man kaum einen Einfluss, bei der Adresse svhon. Ich müsste selbst nochmal nachlesen warum das so ist, damit ich hier keinen Blödsinn schreibe :)
 

heidepower

Neuer Benutzer
Ich dachte bzw ich habe es so verstanden das wenn die Adresse durch die 1 0 Flanken besteht, die Komunikation StörUNempfindlicher ist. Die Frage ist ob ich das so richtig in meinem Code umgestzet habe??
 

BAXL

Admin
Mitarbeiter
Du hast ja die Adresse aus meinem Beispielprogramm verwendet, sollte eigentlich passen, die habe ich von der Seite auf der der Hinweis mit den Flanken stammt.

magst Du Deine Applikation hier vorstellen, oder ist die streng geheim?
 

DS+61

Mitglied
Hi und erstmal großes Kompliment für diesen ausführlichen Beitrag! Fast alle Fragen wurden dann beim weiteren Lesen geklärt!
Ursprünglich wollte ich mein Projekt mit dem ESP8266 umsetzen (weil Mesh, AccessPoint und separates WLAN möglich ist). Außerdem plane ich aktuell mit 12 Sendern. Kurzer Exkurs zum geplanten Projekt: insgesamt 12x ESP8266 senden Daten per MQTT zu einem Raspi. Jeder ESP8266 hängt batteriebetrieben am Fenster inkl. Gyro- und Temp.-Sensor. Alle 5min werden Temp. + Feuchtigkeit an den Raspi gesendet. Wird das Fenster angekippt, meldet der Gyro dass das Fenster offen ist. Alle Daten werden auf dem Raspi gespeichert und auf einem Display (evtl. ePaper) visualisiert - Ende Exkurs.
Wie sieht es mit dem Stromverbrauch des NRF24L01 im Vergleich zum ESP8266 aus? Gibt es einen Deepsleep Modus? Hast du schon eine Möglichkeit gefunden, mehr als 6 Sender zu betreiben?
Vielen Dank und viele Grüße

Ergänzung: Es soll alles an einer 18650er Zelle betrieben werden - also alles 3,3V tauglich. Nur der Raspi bekommt ein Netzteil...

Ach verdammt... Während ich den ESP8266 autark betreiben kann, benötige ich für den NRF24L01 ja noch einen µC... Da wird es natürlich sehr schwierig gute Verbrauchswerte zu erzielen. Aber vielleicht hat ja noch jemand Ideen dazu.
 
Zuletzt von einem Moderator bearbeitet:

BAXL

Admin
Mitarbeiter
@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.
 
Zuletzt bearbeitet:

DS+61

Mitglied
Danke für die schnelle Antwort. Weniger als 1µA klingt tatsächlich sehr gut! Habe mir gestern auch noch ein paar Gedanken gemacht. Mit dem Tiny85 würde das bestimmt gut funktionieren. Und wie du richtig schreibst, wenn man sich da selbst was zusammen frickelt, kann man wahrscheinlich gute Powerdown Werte erreichen. Bleibt noch das "Problem" mit den Node-Hubs. Neben dem Raspi würde ich also noch einen weiteren Hub im Dauerbetrieb benötigen... Evtl. könnte ich dann 2 Steuerzentralen jeweils mit Raspi und Display nehmen, die sich gegenseitig synchronisieren.
Außerdem habe ich gestern noch folgendes sehr interessantes Teil gefunden: https://www.christians-shop.de/GY-LTC3588-LTC-3588-Energy-Harvester kurz gegoogelt und laut Datenblatt sehr interessant. Wenn man hier noch mit einem Elko puffert müsste man doch ganz gut damit auskommen und benötigt eigentlich nur noch eine kleine Backup Batterie. Hier hört aber mein gefährliches Halbwissen auf :-D Vielleicht hat aber schon mal jemand Erfahrung damit gesammelt?!
 

BAXL

Admin
Mitarbeiter
Hallo DS,

es freut mich wenn ich etwas helfen konnte. Spontan fällt mir noch eine Idee ein, wie wäre es, wenn Du mit einem 1s LiPo arbeitest? Es gibt kombinierte Ladeelektroniken, die einen USB-Anschluß für das Laden eines Akkus bereitstellen. Mit einem Step-Up Wandler kommst Du mit dem 1s Lipo auf die benötigten 5V. Den Bauvorschlag findest Du auf der Seite von AZ-Delivery. Denkbar wäre es auch, mit einem Solarkollektor und einem entsprechenden Wandler die 5V für die Ladelektronik unabhängig von einem USB-Ladekabel zum Laden des LiPos einzusetzen, also quasi eine Kombination aus beiden Lösungen. Das habe ich sogar schon als Bauvorschlag bei Adafruit gesehen. Da wurde das Problem mit der Energieversorgung auf diesem Weg gelöst.

Oder gleich als komplettes Set bei Amazon.

Hier ist noch ein Laderegler von AZ-Delivery, den man auch als Laderegler für Powerbänke verwenden kann. Der Vorteil ist wohl, dass gleichzeit geladen und Strom vom Akku entnommen werden kann.

Das könnte etwa so aussehen:

 
Zuletzt bearbeitet:

DS+61

Mitglied
Hallo BAXL, danke für die ausführliche Schaltung. Allerdings wollte ich die Schaltung minimal halten. Es sollen ja 12 Fenster bestückt und keine Kabel verlegt werden. Deshalb finde ich den Energy-Harvester deutlich interessanter. Was wäre wenn ein angeschlossener Elko voll ist und der Harvester will noch mehr Energie abgeben? Wie müsste man den Elko dimensionieren wenn in der Spitze 200mA bei 3,3V benötigt werden?
Und was hat es mit dem CC1101 in deiner Schaltung auf sich? Besten Dank
 

BAXL

Admin
Mitarbeiter
Hallo DS,

die Schaltung ist nicht von mir, sondern von irgendwoher verlinkt. Das sollte auch nicht als 1:1 Lösungsvorschlag dienen sondern nur als Anregung, bzw. damit Du ein ungefähre Vorstellung hast. Interessant ist nur der obere Teil, indem es um die reine Ladeelektronik geht. Meine Idee war dabei, dass Du nicht alle Stellen damit ausstattest, sondern nur die "Relaisstellen", also die µCs, die immer erreichbar sein müssen.
 
Top Bottom