• 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

DS+61

Mitglied
Konnte gestern noch etwas recherchieren. Sieht so aus also ob sich nur 5-6 Adapter gleichzeitig verbinden können, aber asynchron gehen wohl sehr viel mehr. Da jeder Sender aller 5min nur max. 2s "online" ist, wäre das also kein Problem. Für die Fenster offen Erkennung habe ich mir Tilt Sensoren angeschaut. Die reagieren aber teilweise erst ab 45°! Hat jemand Erfahrung mit empfindlicheren Tilt Sensoren? Wenn das Fenster kippt sind es ja nur ca. 2-3° Neigung. Tilt wäre die perfekte Lösung da diese wie ein Schalter funktionieren und so den µC aus dem Tiefschlaf holen könnte, was ein Accelerometer meines Wissens so nicht kann.
 

BAXL

Admin
Mitarbeiter
Wie sieht es mit einem Reedrelais aus, das sollte den Strom für einen Arduino schalten können. Dann liefe der Arduino nur so lange, wie das Fenster offen ist. Ich hatte mich auch mal mit der Problematik auseinandergesetzt, siehe auch das Fenster offen Thema hier im Forum.
 
Zuletzt bearbeitet:

DS+61

Mitglied
Ich glaube ich habe die Lösung für meine Funkübertragung: ESP-NOW
Sieht ähnlich schlank und schnell aus wie MQTT und funktioniert nativ auf ESP8266 und ESP32 (kein Handshake, kein WLAN Aufbau etc.) - ohne Verschlüsselung können bis zu 20 ESPs miteinander kommunizieren. Scheint vielversprechend...
 

DS+61

Mitglied
Versuche es die nächsten Tage mal zu implementieren -> Ein Wemos D1 mit BME280 sendet per ESP-NOW Daten an anderen Wemos mit I2C-Display. Unter "ESP-NOW" gibt es bei Google und Youtube zahlreiche Treffer :)
 

BAXL

Admin
Mitarbeiter
Ich bin gespannt. Allerdings wenn man nach ESP-Now sucht findet man massig an englischen Seiten - nicht jeder ist da firm - und sehr oft ist vieles verstreut und mit zusätzlichen Ballast angereichert, den man erstmal als solchen erkennen können muß. Darum habe ich das mit dem NRF24 hier noch einmal auseinanderklamüsert und versucht mit sowenig wie möglich Overhead darzustellen und ich bin auch da :).
 

DS+61

Mitglied
Sorry, bin da jetzt ein wenig abgeschweift... Hatte Post auch Fernost mit einem ESP32 Board drin, habe dann ein wenig mit Micropython experimentiert und jetzt vollauf begeistert davon. Werde also nun sehr viel Zeit damit verbringen und das Projekt wahrscheinlich mit Micropython versuchen umzusetzen. Das führt dann aber ein wenig am ursprünglichen Forum-Titel vorbei...

Und tatsächlich gibt es in den Arduino Tutorials jede Menge Overhead in Sachen ESP-Now. Mal schauen wie sich das in Micropython darstellt.
 

DS+61

Mitglied
Hallo Baxl, mein Projekt habe ich nun wie folgt umgesetzt: mehrere ESP8266 (mit BME280) auf denen Micropython laeuft senden per WLAN MQTT Datenpakete zum Raspi Zero. Der gibt dann Temp+Luchtfeuchte auf einem ePaper aus. Hat wie gesagt ja nix mehr mit dem ursprünglichen Thema zu tun.
Zu deinem urspruenglichen Threat habe ich aber auch noch was interessantes gefunden. Allerdings brauchst du einen ESP8266 und ein klein wenig Micropython: https://github.com/micropython/micropython-esp32/issues/197 So kannst du dann ohne WLAN sehr schnell und einfach Daten versenden. Es lohnt sich definitiv mal einen Blick auf Micropython zu riskieren! Viele Grueße!
 

Karlh

Neuer Benutzer
Ich bin ein Frischling in Sachen Arduino und auch neu im Forum. Dieser Beitrag hat mein Interesse geweckt und ich kämpfe mich gerade durch die Beschreibung durch. Viele Beschreibungen sind mir in anderen Projekten schon über den Weg gelaufen. Um mich besser zu orientieren fehlt mir ein Schaltplan von Sender und Empfänger. Meine Fragen: Gibt es diese und wo sund sie zu finden?
Karl-Heinz
 

BAXL

Admin
Mitarbeiter
Hallo Karl- Heinz, was meinst Du mit Schaltplan von Sender und Empfänger? Den Schaltplan des Moduls selbst, oder wie das Modul an einen myC angeschlossen werden muss?
Viele Grüße Norbert
 

Karlh

Neuer Benutzer
Mit Schaltplan meine ich die Anschlüsse von DS18B20 und Bewegungsmelder PIR bzw.Schaltkontakt. Sind beide Anschlüsse auf PIN 7 gelegt? Beim Display gehe ich davon aus, dass dieses über I2C angeschlossen wird.
Gibt es auf der Senderseite eine Möglichkeit, den Arduino z.B. durch einen ATtiny85 zu ersetzen.
Viele Grüße Karl-Heinz
 

BAXL

Admin
Mitarbeiter
Hallo Karl-Heinz,

den Anschluß hatte ich mal in einem anderen Thema beschrieben, bzw. das dazugehörige Programm gepostet. Der Pin 7 würde nur von dem Schaltkontakt belegt, Du kannst aber jeden anderen Digitaleingang dafür verwenden, z.B. 3, 4 oder 5, das ist egal. Du mußt das nur im Programm bei der Initialisierung und der Abfrage berücksichtigen. Das, was Du dort vorhast, scheint kein großes Problem zu sein.

Per ATtiny85 habe ich das noch nicht gemacht. Es gibt Seiten, da wird dasd als möglich angegeben, das Problem weden hächstens die Zahl der Eingänge des ATtiny sein, davon hat er nich soviele und alleine des DS18B20 schluckt schon einige zuzüglich der I2C Anschlüsse, das wird wahrscheinlich nicht klappen. Aber wie gesagt, da bin ich noch nicht so tief eingestiegen.

Willst Du denn den Sensor gemeinsam mit dem Display anschließen, oder soll der Zustand des PIR an einen zweiten Arduino geleitet werden, der das auf dem Display darstellt?
Wenn ja, dann ist das ein Teil dessen, was ich bereits aufgebaut habe. Das beste wird sein, wir gehen zusammen Schritt für Schritt dadurch.

Was genau möchtest Du denn bauen?

Gruß
Norbert
 

Karlh

Neuer Benutzer
Hallo Norbert,
deinen Hinweis zum Anschluss, den du im „ anderen Thema beschrieben“ beschrieben hast, wäre nach meinen Vorstellungen das Richtige für mich.
Ich hätte einen Empfänger im WZ und vier Sender im Haus und einen Sender außerhalb verteilt einzusetzen (2x nur PIR, 2x nur DS und 1x PIR und DS).
Ich komme nur mit dem Satz
Der Sender hat einen PIR-Sensor verbaut, der bei Bewegung ein Signal auf Pin 7 des Arduinos ausgibt. Für die Temperaturmessung steckt leicht versteckt ein DS18B20 Temperatursensor im TO -Gehäuse auf dem Breadboard.
nicht klar. Sind die Datenleitungen des PIR und des DS am PIN7 parallel geschalten?
Für die Anwendung des ATtiny85 habe ich im Netz einen Artikel gefunden. Mir ging es nur darum, die Senderseite so klein wie möglich zu halten.
Ich hoffe, du kannst mit meiner Beschreibung etwas anfangen.
Viele Grüße
Karl-Heinz
 

Anhänge

BAXL

Admin
Mitarbeiter
Hallo Karl-Heinz,

ich habe mir meine Schaltung angesehen (hätte man theoretisch auch aus dem Code rausfummeln können :)).
Sind die Datenleitungen des PIR und des DS am PIN7 parallel geschalten?
Nein, das PIR liegt wirklich mit seinem Ausgang an D7, Das DS18B20 auf D6.

Das NRF24 auf D8-D13 wie folgt angeschlossen:
CE - D8
CSN - D9
IRQ - D10
MOSI - D11
MISO - D12
SCK - D13

Wenn das mit dem ATtiny so funktionieren soll, dann probiere es mal aus. ich habe das noch nicht gemacht und kann deshalb auch beim Code nicht wirklich helfen. Bedenke, dass das NRF24l01 ordentlich Strom braucht.
 

LP1503

Mitglied
Hallo, ich bin neu hier und bin auf der Suche nach einem Tipp. Ich habe diesen Beitrag gesehen und war echt begeistert wie ausführlich und genau der Beitrag ist. Da ich schon selber versucht habe Daten per Funk zu übertragen, es aber nicht geschafft habe, habe ich direkt mal den Code getestet. Ich habe alles so angeschlossen (mehrfach überprüft) und den Code rüber kopiert allerdings hat nichts funktioniert. Ich habe den Post bis zu ende gelesen in der Hoffnung, dass jemand das selbe Problem hat, allerdings hat mir das auch nicht weitergeholfen. Das einzige was bei mir anders ist, sind die Kondensatoren zwischen Modul und Stromversorgung, bei mir sind sie kleiner, da mir keine 100µF Kondensatoren zur Verfügung stehen. Ich habe mir jetzt auch die Adapter bestellt, mit denen keine Kondensatoren mehr nötig sind aber ich weiß absolut nicht weiter. Ich habe schon vier oder fünf verschiedene Codes ausprobiert und ich habe nie eine Kommunikation zustande gebracht. Einmal kam ein Datenpaket an aber das wars dann auch schon wieder. Gibt es sonst noch Ideen, die ich ausprobieren kann?

LG Laurin
 

BAXL

Admin
Mitarbeiter
Hallo Laurin,

da bist Du ja :). Wie ich Dir schon per PN schrieb, steckt der Teufel oft im Detail. Manchmal sind das Kleinigkeiten, die man für unwesentlich hält. So hat bei mir, bei einem anderen Projekt, schon den Ausschlag gegeben, welchen Massenanschluß ich verwendet habe. Der Kondensator ist immer ein Faktor gewesen. Das Problem ist ja, dass der NRF beim Senden sehr viel Strom braucht, den der Arduino über die 3,3V nicht liefern kann. Deshalb puffert der Kondensator in der "sendefreien" Zeit Strom, den sich der NRF24 dann genehmigt. Sind die Zeiten zwischen den Sendevorgängen zu kurz, reicht das hinten und vorne nicht.

Du hast also meinen Code 1:1 übernommen und wirklich keine Codezeile geändert? Manchmal ändert man eine scheinbare Kleinigkeit von der man sich nicht vorstellen kann, dass das einen Einfluß hat.
Wichtig ist es auch, die Verkabelung immer wieder zu kontrollieren. Auch da habe ich mir schon oft ein Bein gestellt, weil ich versehentlich zwei Anschlüsse vertauscht habe. Das ist bei dieser Sache besonders blöd, weil man zwei Schaltungen hat, in denen ein Fehler stecken kann.

Einmal kam ein Datenpaket an aber das wars dann auch schon wieder. Gibt es sonst noch Ideen, die ich ausprobieren kann?
Wenn aber tatsächlich mal ein datenpaket angekommen ist, dass sieht es so aus, als wenn es grundsätzlich funktioniert, aber nicht reproduzierbar ist. Da spricht dann alles für die unzureichende Stromversorgung (zu kleiner Elko), bzw. für zu kurze Sendeintervalle (Elko kann den benötigten Strom nicht liefern, weil er keine Zeit zum Wiederaufladen hat).

Wie schon in meinen Berichten (NRF24L01 2,4 GHz Sende und Empfangsmodul für Arduino ) zu lesen ist, benötigen die NRF24l01 Module eine recht stabile 3,3V Spannungsversorgung, weil die gezogenen Ströme bis über 100mA im Sendebetrieb erreichen können.
 

LP1503

Mitglied
Hallo BAXL,
vielen Dank für deine Antwort. Ich war die letzten zwei Wochen sehr inaktiv, weil ich auch noch andere Projekte am laufen hatte und habe zudem keine Benachrichtigung mehr bekommen. Allerdings sitze ich seit gestern mal wieder an der drahtlosen Verbindung und habe es tatsächlich geschafft eine Verbindung zustande zu bekommen und sogar meinen Servo und die Motoren zu steuern, da allerdings die Art der Steuerung über einen Joystick nicht gut zu meinem Projekt gepasst hat, habe ich eine Poti angeschlossen und musste den Code dann dementsprechend verändern und schon ging nichts mehr.

Zum Thema Kondensator: Ich habe jetzt die Adapter und versorge die Module jetzt mit 5V, was also mein Stromproblem lösen sollte. Ich habe also wieder alle möglichen Arten von Codes ausprobiert und siehe da, einfache Nachrichten lassen sich Teilweise verschicken. Teilweise, weil ich die Module ganz speziell halten muss, damit die Nachricht ankommt. Müsste das nicht normalerweise so sein, dass die Nachricht ankommt, egal wie die Module zueinander stehen, denn wenn ich die in mein Auto bzw. Fernbedienung einbaue, kann ich auch nicht gewährleisten, dass die Position immer so gehalten wird oder habe ich da einen Denkfehler drin? Ich habe dafür aber auch keinen richtigen Lösungsansatz, weil ich absolut nicht weiß warum das so ist. Hat da jemand eine Idee?

Danke

LG Laurin
 

BAXL

Admin
Mitarbeiter
Es ist schwierig etwas zu sagen wenn es funktioniert hat und nach Programmänderungen nicht mehr, ohne den vorherigen und den neuen Code zu kennen. Das wäre dann nur im Trüben fischen. Bei der Position weiß ich auch nicht wie die sind. Wie ist der Abstand, wie ist der Winkel usw. Bedenke, dass die Antenne nicht in alle Richtungen gleich stark abstrahlt. Da sind ganz viele Faktoren die eine Rolle spielen. Darum immer nur eine Sache verändern.
 

LP1503

Mitglied
@BAXL ich habe deinen Code nochmal kopiert und so abgeändert (code folgt), dass kein Taster ausgelesen wird sondern ich die boolean auf true oder false setze und ich dann am Receiver eine null oder eine eins ausgegeben bekomme. Ich habe auch den Receiver Code so verändert, dass keine LED mehr gesteuert wird sondern mir nur im Seriellen Monitor eine eins oder eine null angezeigt wird. Jetzt ist das interessante, dass ich am Receiver immer (egal was ich am Sender eingebe) eine null ausgegeben bekomme und nun frage ich mich wieso.

Das mit der Richtung der Antennen hängt denke ich mit der instabilen Kabelverbindung zwischen Modul und Arduino zusammen, wenn ich die Kabel fixiere kommt ein Signal an, egal wie ich die Module halte.

Code für den Sender:

Code:
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>



RF24 radio(7, 8);
const byte address[6] = "00001";
boolean button_state = 0;

void setup()
{
  Serial.begin(9600);

  radio.begin(); // Start der 2,4 GHz Wireless Kommunikation
  radio.openWritingPipe(address); // Setzen der Sendeadresse zur Übermittlung der Daten
  radio.setPALevel(RF24_PA_HIGH); // Leistung des NRF Moduls je nach Entfernung kann man von MIN bis MAX einstellen (MAX,HIGH,LOW,MIN)
  radio.stopListening(); // Das angeschlossene Modul wird als Sender konfigurieret
}

void loop()
{
  button_state = true;
 
  radio.write(&button_state, sizeof(button_state));
 
  Serial.println(button_state);

  delay(50); // kurze Verschnaufpause, damit der Empfänger sich nicht verschluckt
}
Code für den Empfänger:

Code:
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>

RF24 radio(7, 8); // CE, CSN
const byte address[6] = "00001";
boolean button_state;



void setup() {

  Serial.begin(9600);
 
  radio.begin();
  radio.openReadingPipe(0, address); //Setting the address at which we will receive the data
  radio.setPALevel(RF24_PA_MIN); //You can set this as minimum or maximum depending on the distance between the transmitter and receiver.
  radio.startListening(); //This sets the module as receiver
 
  Serial.println("gestartet");
}

void loop()
{
  if (radio.available()) //Looking for the data.
  {
    Serial.println("empfange!");
    radio.read(&button_state, sizeof(button_state)); //Reading the data
    
    if (button_state == HIGH)
    {
     Serial.println("HIGH");
    }
    else
    {
      Serial.println("LOW");
    }
  }

  else
  {
    Serial.println("kein Signal");
  }
 
  delay(50);
}
 

BAXL

Admin
Mitarbeiter
Nimm einfach mal anstelle von boolean byte und sende eine 1 oder 0. Bist Du sicher, dass Deine if else Abfrage richtig ist. Im Zweifel erst einmal einzelne if Abfragen ohne else. Bei solchen Konstrukten schleichen sich schnell Fehler ein. Lass also erst nur den empfangenen Wert anzeigen ohne solche if else Abzweigungen. Wie gesagt, der Teufel steckt im Detail ;)
 
Zuletzt bearbeitet:
Top Bottom