nrf24 - Kommunikation optimieren?

Hallo zusammen,

ich bin grad dabei mir ein kleines Funknetzwerk mit NRF24- Modulen aufzubauen. Ich habe Probleme mit der Zuordnung der Adressen- eine Funkverbindung zwischen mehreren Modulen ist kein Problem- das läuft. Aber ich bekomme die Pipes nicht sauber zugeordnet, so dass ich gezielt von der Zentrale ein bestimmtes Node ansprechen kann.

Um das ganze übersichtlich zu halten, habe ich die Sketche mal aufs Minimum reduziert…

Zentrale:

#include <SPI.h>
#include "RF24.h"
#include "FastLED.h"
#include <DS3232RTC.h>
#include <Time.h>
#include <Wire.h>

RF24 radio(9,10);
byte addresses[][6] = {"1Pipe","2Pipe","3Pipe","4Pipe","5Pipe","6Pipe",};

long Status[6] = {10,11,12,13,14,15};  // definiere das Verhalten der Lampen
long Sensor[6];  // Fadingzeit, Farbe (CSV), Helligkeit (CSV), Sättigung (CSV), Haltezeit, Adresse Lampe, Pipe

int IRStatus;
int IRRaum; // 01 = Raum 1, 02 = Raum 2, 03 = Raum 3, 04 = Raum 4, 05 = Raum 5, 06 = alle Räume
int Auto = 1; // wenn Auto = 0, dann gelten die manuellen Vorgaben, Wenn Auto = 1, dann gelten die Programmvorgaben
          // wenn Auto = 2, starte Pogramm???
// Ordne automatische Programme zu

int i;

#define DATA_PIN 4
#define NUM_LEDS 3
CRGB leds[NUM_LEDS];

void setup() 
{
  Serial.begin(57600);
  Serial.println("Test Zentrale");
  
  FastLED.addLeds<WS2812B, DATA_PIN, GRB>(leds, NUM_LEDS);
    
    setSyncProvider(RTC.get);   // the function to get the time from the RTC
    if(timeStatus() != timeSet) 
        Serial.println("Unable to sync with the RTC");
    else
        Serial.println("RTC has set the system time"); 
  
  radio.begin();

    radio.openWritingPipe(addresses[1]);
    radio.openReadingPipe(1,addresses[0]);
    radio.openReadingPipe(1,addresses[1]);
    radio.openReadingPipe(1,addresses[2]);
    radio.openReadingPipe(1,addresses[3]);
    radio.openReadingPipe(1,addresses[4]);
    radio.openReadingPipe(1,addresses[5]);
    
  radio.startListening();
}

void loop() 
{            
     while ( ! radio.available() )
     {                          
        radio.read( Sensor, sizeof(Sensor) ); 
        Serial.println("empfange ");
        Serial.print(" PIR:      " );
        Serial.println(Sensor[0]);
        Serial.print(" IR- Code: " );
        Serial.println(Sensor[1]);
        Serial.print(" IR- Raum " );
        Serial.println(Sensor[2]);
        Serial.print(" Raum ID " );
        Serial.println(Sensor[3]);
        Serial.print(" ? " );
        Serial.println(Sensor[4]);
        Serial.print(" ? " );
        Serial.println(Sensor[5]);                   
        Serial.println("  ");                      
        Serial.println("  ");
        delay(200);
     }   
        radio.stopListening(); 
        Serial.print("Sende Vorgaben an Lampe  "); 
        Serial.println();     
        Serial.print("Fadingzeit:    ");
        Serial.println(Status[0]);                      
        Serial.print("Farbe (CSV):   ");
        Serial.println(Status[1]);                            
        Serial.print("Helligkeit:    ");
        Serial.println(Status[2]);                        
        Serial.print("Saettigung   ");
        Serial.println(Status[3]);                    
        Serial.print("Programm: ");
        Serial.println(Status[4]);                       
        Serial.print("Auto? ");
        Serial.println(Status[5]);                      
        Serial.println("  ");                      
        Serial.println("  ");
      
    (radio.write( Status, sizeof(Status) ));
    
    radio.startListening();   
}

Node:

#include <SPI.h>
#include "RF24.h"
#include "FastLED.h"
#include "IRremote.h"

RF24 radio(9,10);

byte addresses[][6] = {"1Pipe","2Pipe","3Pipe","4Pipe","5Pipe","6Pipe"};

long Sensor[6];
long Status[6];
long Trigger[6];
int IRStatus;
int IRRaum; // 01 = Raum 1, 02 = Raum 2, 03 = Raum 3, 04 = Raum 4, 05 = Raum 5, 06 = alle Räume
int RaumID = 1;

int receiver = 3;
IRrecv irrecv(receiver);      
decode_results results; 

int PIR;
int sensorPin = 4;

#define DATA_PIN 2
#define NUM_LEDS 3
CRGB leds[NUM_LEDS];

void setup() 
{
  Serial.begin(57600);
  Serial.print("Test Lampe  ");
  Serial.println(RaumID);
  
  pinMode(sensorPin, INPUT);
  irrecv.enableIRIn();
  
  FastLED.addLeds<WS2812B, DATA_PIN, GRB>(leds, NUM_LEDS);
  
  radio.begin();

    radio.openWritingPipe(addresses[0]);
    radio.openReadingPipe(1,addresses[0]);
    
  radio.startListening();
}

void loop() {
  
    leds[0] = CRGB::Black;
    FastLED.show();
    leds[1] = CRGB::Black;
    FastLED.show();
    leds[2] = CRGB::Black;
    FastLED.show();  
    
 PIR = digitalRead(sensorPin);
    if (PIR == HIGH)
         {  
                leds[1] = CRGB::Green;
		FastLED.show();
                Serial.println("Bewegung erkannt.");
         }
    else
         {
                leds[1] = CRGB::Red;
		FastLED.show(); 
                Serial.println("keine Bewegung.");   
         }
        
if (irrecv.decode(&results))
  {
    translateIR();
    irrecv.resume();
  }  
  
  Sensor[0] = PIR;
  Sensor[1] = IRStatus;
  Sensor[2] = IRRaum;
  Sensor[3] = RaumID;     
    
    while ( ! radio.available() )
    {     
        IRStatus = 0;
        radio.read( Status, sizeof(Status) );
        
        Serial.println("empfange Vorgaben:   ");
        Serial.print("Fadingzeit: ");
        Serial.println(Status[0]);
        Serial.print("  Farbe (CSV): ");
        Serial.println(Status[1]);
        Serial.print("  Helligkeit (CSV: )");
        Serial.println(Status[2]);
        Serial.print("  Saettigung (CSV): ");
        Serial.println(Status[3]);
        Serial.print("  offen ");
        Serial.println(Status[4]);
        Serial.print("  offen   ");  
        Serial.println(Status[5]);
        Serial.print("  offen ");
        Serial.println(" ");  
        Serial.println(" ");  
        leds[0] = CRGB::Green;
	FastLED.show();
    }        
        radio.stopListening();     
        Serial.println("Sende...");
        Serial.print("  Bewegung erkannt: ");
        Serial.println(Sensor[0]);
        Serial.print("  IR- Code ");
        Serial.println(Sensor[1]);
        Serial.print("  IR- Raum ");
        Serial.println(Sensor[2]);
        Serial.print("  Raum ID ");
        Serial.println(Sensor[3]);
        Serial.print("  offen ");
        Serial.println(Sensor[4]);
        Serial.print("  offen ");  
        Serial.println(Sensor[5]);
        Serial.println(" ");  
        Serial.println(" ");
      
    (radio.write( Sensor, sizeof(Sensor) ));
    
    radio.startListening();   

}

void translateIR()
{}

Bitte erkläre mir die folgenende Sequenz:

void loop()
{           
     while ( ! radio.available() )
     {                         
        radio.read( Sensor, sizeof(Sensor) );

Immmer und immer wieder
solange kein Paket empfangen wurde
lies eines und verarbeite es

Wie kannst du erwarten dass das funktioniert?

Du solltest für die Zentrale eine für alle gleiche Empfangs-Adresse benutzen,
für die einzelnen Kinder jeweils eine persönliche Empfangs-Addresse.

ah, ich dachte der Befehl bedeutet, dass ich das Paket empfange, wenn das Radio vefügbar ist- aber du hast recht, ich will es ja nur haben wenn es keines gibt... (ich glaub ich bekomme zu oft Pakete von DHL :wink: )

OK, ich bastel mal nochmal.... und setze ich gleich rein

So, hab mich jetzt mal auf die Kommunikation mit einem Node und dem Master konzentriert… die Informationen der Zentrale kommen sehr schnell und stabil durch. Die Rückmeldung vom Node nur sporadisch…

Zentrale:

#include <SPI.h>
#include "RF24.h"
#include "FastLED.h"
#include <DS3232RTC.h>
#include <Time.h>
#include <Wire.h>

RF24 radio(9,10);
byte addresses[][6] = {"1Pipe","2Pipe","3Pipe","4Pipe","5Pipe","6Pipe",};

long Status[6] = {10,11,12,13,14,15};  // definiere das Verhalten der Lampen
long Sensor[6];  // Fadingzeit, Farbe (CSV), Helligkeit (CSV), Sättigung (CSV), Haltezeit, Adresse Lampe, Pipe

int IRStatus;
int IRRaum; // 01 = Raum 1, 02 = Raum 2, 03 = Raum 3, 04 = Raum 4, 05 = Raum 5, 06 = alle Räume
int Auto = 1; // wenn Auto = 0, dann gelten die manuellen Vorgaben, Wenn Auto = 1, dann gelten die Programmvorgaben
          // wenn Auto = 2, starte Pogramm???
// Ordne automatische Programme zu

int i;

#define DATA_PIN 4
#define NUM_LEDS 3
CRGB leds[NUM_LEDS];

void setup() 
{
  Serial.begin(57600);
  Serial.println("Test Zentrale");
  
  FastLED.addLeds<WS2812B, DATA_PIN, GRB>(leds, NUM_LEDS);
  
    leds[0] = CRGB::Cyan;
    FastLED.show();
    delay(200);
    leds[1] = CRGB::Cyan;
    FastLED.show();
    delay(200);
    leds[2] = CRGB::Cyan;
    FastLED.show();
    delay(200);
    leds[0] = CRGB::Orange;
    FastLED.show();
    delay(200);
    leds[1] = CRGB::Orange;
    FastLED.show();
    delay(200);
    leds[2] = CRGB::Orange;
    FastLED.show(); 
    delay(200);    
    leds[0] = CRGB::Black;
    FastLED.show();
    delay(200);
    leds[1] = CRGB::Black;
    FastLED.show();
    delay(200);
    leds[2] = CRGB::Black;
    FastLED.show(); 
    
    setSyncProvider(RTC.get);   // the function to get the time from the RTC
    if(timeStatus() != timeSet) 
        Serial.println("Unable to sync with the RTC");
    else
        Serial.println("RTC has set the system time"); 
  
  radio.begin();

    radio.openWritingPipe(addresses[1]);
    radio.openReadingPipe(1,addresses[0]);
    
  radio.startListening();
}

void loop() 
{      
        
  while ( radio.available() )
  {
        leds[0] = CRGB::Green;
        FastLED.show();  
        
        radio.read( Sensor, sizeof(Sensor) ); 
        Serial.println("empfange ");
        Serial.print(" PIR:      " );
        Serial.println(Sensor[0]);
        Serial.print(" IR- Code: " );
        Serial.println(Sensor[1]);
        Serial.print(" IR- Raum " );
        Serial.println(Sensor[2]);
        Serial.print(" Raum ID " );
        Serial.println(Sensor[3]);
        Serial.print(" ? " );
        Serial.println(Sensor[4]);
        Serial.print(" ? " );
        Serial.println(Sensor[5]);                   
        Serial.println("  ");                      
        Serial.println("  ");
  }
        radio.stopListening();  
        Serial.print("Sende Vorgaben an Lampe  "); 
        Serial.println();     
        Serial.print("Fadingzeit:    ");
        Serial.println(Status[0]);                      
        Serial.print("Farbe (CSV):   ");
        Serial.println(Status[1]);                            
        Serial.print("Helligkeit:    ");
        Serial.println(Status[2]);                        
        Serial.print("Saettigung   ");
        Serial.println(Status[3]);                    
        Serial.print("Programm: ");
        Serial.println(Status[4]);                       
        Serial.print("Auto? ");
        Serial.println(Status[5]);                      
        Serial.println("  ");                      
        Serial.println("  ");
      
    (radio.write( Status, sizeof(Status) ));
    
    radio.startListening();   
}

Node;

#include <SPI.h>
#include "RF24.h"
#include "FastLED.h"
#include "IRremote.h"

RF24 radio(9,10);

byte addresses[][6] = {"1Pipe","2Pipe","3Pipe","4Pipe","5Pipe","6Pipe"};

long Sensor[6];
long Status[6];
long Trigger[6];
int IRStatus;
int IRRaum; // 01 = Raum 1, 02 = Raum 2, 03 = Raum 3, 04 = Raum 4, 05 = Raum 5, 06 = alle Räume
int RaumID = 1;

int receiver = 3;
IRrecv irrecv(receiver);      
decode_results results; 

int PIR;
int sensorPin = 4;

#define DATA_PIN 2
#define NUM_LEDS 3
CRGB leds[NUM_LEDS];

void setup() 
{
  Serial.begin(57600);
  Serial.print("Test Lampe  ");
  Serial.println(RaumID);
  
  pinMode(sensorPin, INPUT);
  irrecv.enableIRIn();
  
  FastLED.addLeds<WS2812B, DATA_PIN, GRB>(leds, NUM_LEDS);
    leds[0] = CRGB::Cyan;
    FastLED.show();
    delay(200);
    leds[1] = CRGB::Cyan;
    FastLED.show();
    delay(200);
    leds[2] = CRGB::Cyan;
    FastLED.show();
    delay(200);
    leds[0] = CRGB::Orange;
    FastLED.show();
    delay(200);
    leds[1] = CRGB::Orange;
    FastLED.show();
    delay(200);
    leds[2] = CRGB::Orange;
    FastLED.show(); 
    delay(200);    
    leds[0] = CRGB::Black;
    FastLED.show();
    delay(200);
    leds[1] = CRGB::Black;
    FastLED.show();
    delay(200);
    leds[2] = CRGB::Black;
    FastLED.show(); 
    
  
  radio.begin();

    radio.openWritingPipe(addresses[0]);
    radio.openReadingPipe(1,addresses[1]);
    
  radio.startListening();
}

void loop() {
  
    leds[0] = CRGB::Black;
    FastLED.show();
    leds[1] = CRGB::Black;
    FastLED.show();
    leds[2] = CRGB::Black;
    FastLED.show();  
    
 PIR = digitalRead(sensorPin);
    if (PIR == HIGH)
         {  
                leds[1] = CRGB::Green;
		FastLED.show();
                Serial.println("Bewegung erkannt.");
         }
    else
         {
                leds[1] = CRGB::Red;
		FastLED.show(); 
                Serial.println("keine Bewegung.");   
         }
        
if (irrecv.decode(&results))
  {
    translateIR();
    irrecv.resume();
  }  
  
  Sensor[0] = PIR;
  Sensor[1] = IRStatus;
  Sensor[2] = IRRaum;
  Sensor[3] = RaumID;     

  while (radio.available() )
  {
        leds[0] = CRGB::Green;
        FastLED.show();  
        
        IRStatus = 0;
        radio.read( Status, sizeof(Status) );
        Serial.println("empfange Vorgaben:   ");
        Serial.print("Fadingzeit: ");
        Serial.println(Status[0]);
        Serial.print("  Farbe (CSV): ");
        Serial.println(Status[1]);
        Serial.print("  Helligkeit (CSV: )");
        Serial.println(Status[2]);
        Serial.print("  Saettigung (CSV): ");
        Serial.println(Status[3]);
        Serial.print("  offen ");
        Serial.println(Status[4]);
        Serial.print("  offen   ");  
        Serial.println(Status[5]);
        Serial.print("  offen ");
        Serial.println(" ");  
        Serial.println(" ");  
        leds[0] = CRGB::Green;
	FastLED.show();
  }
        radio.stopListening();
        Serial.println("Sende...");
        Serial.print("  Bewegung erkannt: ");
        Serial.println(Sensor[0]);
        Serial.print("  IR- Code ");
        Serial.println(Sensor[1]);
        Serial.print("  IR- Raum ");
        Serial.println(Sensor[2]);
        Serial.print("  Raum ID ");
        Serial.println(Sensor[3]);
        Serial.print("  offen ");
        Serial.println(Sensor[4]);
        Serial.print("  offen ");  
        Serial.println(Sensor[5]);
        Serial.println(" ");  
        Serial.println(" ");
      
    (radio.write( Sensor, sizeof(Sensor) ));
    
    radio.startListening();   
}

void translateIR()
{}

Ich würde jetzt sagen, dass ich dem Node sagen muss, dass es, wenn ein Paket erfolgreich empfangen wurde, zunächst erstmal gesendet werden soll…

mit der Idee schau ich jetzt nochmal ob ich dazu was in der Class-Documentation von TmRh20 lesen kann…

@Whandall: Ich muss mich mal bei dir bedanken, dass du so geduldig hilfst... Ich habe 30 Jahre lang nur analog gelebt und mir alle Schaltungen damit realisieren können.

Nun bin ich seit etlichen Monaten dabei mich in Arduino einzuarbeiten, mein erstes Projekt mit den NRF24 läuft super und stabil.... wobei ich mich inzwischen immer mehr wundere warum.... :slight_smile: OK, die Kommunikation geht nur eine Richtung, aber es läuft reibungslos....

Ich habe auch mal angefangen mich in generelle Regeln zum Programmieren einzulesen, um bei meinen Sketchen eine gewisse Übersichtlichkeit und Logik zu wahren.

Was ich jetzt bei dem aktuellen Thema schon durch lesen erfahren konnte ist, dass mein Multi-Ceiver- Betrieb ACK auf enable setzen sollte- OK...

Ansonsten lege ich eben erstmal die Adresse der Pipes fest- Pipe 0 kann einen komplett anderen Namen haben - 1 bis 5 dürfen sich nur in der 1. der 5 Stellen unterscheiden. Verstanden habe ich noch nicht sicher, ob ich bei der Kommunikation zu den Child- Child dann andere Pipe- Namen verwenden kann oder muss...

Meine Logik wäre:

  • Master : {1Zent, 2Zent, 3Zent, 4 Zent, 5Zent, 6Zent}

  • Child1: {1Zent, 1Flur, 2Flur, 3Flur, 4Flur, 5Flur}

  • Child2: {2Zent, 1Wohn, 2Wohn, 3Wohn, 4Wohn, 5Wohn}

  • Child1 von Child1: {1Flur, 1FlSe, 2FlSe, 3FlSe, 4FlSe, 5FlSe}

und so weiter und so fort....

Soll nun die Zentrale mit Child 1 reden öffne ich an beiden entsprechende Pipes- also was bei der Zentrale die ReadingPipe ist ist beim Child die WritingPipe und umgedreht. Dafür verwiese ich im Array auf die entsprechende Position der Pipe. An der Stelle wäre schon die Frage- geht es dabei nach dem Name der Pipe? Ich denke mal ja, wenn ich also die Position der Pipe- Namen tausche, dann muss ich auch auf die entsprechende Stelle im Array verweisen. Das muss ich dann beachten, wenn das Child mit seinem Child reden soll, denn da habe ich ja an der ersten Stelle im Array den Namen der Pipe für die Kommunikation mit der Zentrale....

also z.b. für die Zenrale:

    radio.openWritingPipe(addresses[1]);
    radio.openReadingPipe(1,addresses[0]);

und Child:

    radio.openWritingPipe(addresses[0]);
    radio.openReadingPipe(1,addresses[1]);

Im Setup setze ich dann erstmal alle Werte die der NRF24 braucht oder gern hätte, zumindest aber muss ich radio.begin() sagen, damit überhaupt was passiert- klar, Pipes noch öffnen...

In der Loop schaue ich erstmal ob es was zum Lesen gibt, der NRF24 also ein Paket empfangen hat, was ich über SPI aus dem FIFO- Speicher auslesen kann. Empfangen wurde es schon, wenn alles richtig aufgesetzt wurde- ich muss es "nur" noch abholen.... gut, den Erhalt sollte ich bestätigen, damit ich dann zum schreiben übergehen kann. Für mein Verständnis sage ich erstmal stopplistening, damit ich senden kann. Dann sende ich. Ist das erledigt starte ich wieder start.listening und schaue ob es was zum lesen gibt....
Aber an der Stelle bin ich mir schon nicht schlüssig wie ich die Daten der verschiedenen Childs abholen kann... mit openreading.pipe würde ich ja nur sagen, dass auf der pipe Daten zu erwarten sind- damit hab ich se aber noch nicht abgeholt....

Das ist genau die Stelle wo ich hänge......

Jede Station bekommt eine eigene Addresse.
Die Adresse der Zentrale ist allen Kindern bekannt,
die Zentrale kann die Adressen der Kinder entweder von denen mitgeteilt bekommen, oder 'wissen'.
Man könnte ein festes Prefix (oder Postfix in deiner Notation) verwenden und nur die id-Bytes abspeichern, z.B. im EEPROM.

Im Normalbetrieb lauschen alle Stationen auf ihre Adresse (mit Acknowledge).

Will eine Station senden, öffnet sie die entsprechende Adresse, sendet und kehrt wieder in den Lauschmodus zurück.

Da alle Stationen auf verschiedene Adressen lauschen (und acknowledgen), gibt es keine Probleme mit Kollisionen.

Wenn du noch einen zusätzlichen Broadcast-Kanal haben willst, kannst du in jeder Station noch eine zusätzliche (gleiche) Adresse öffnen. Auf dieser Adresse schaltest du dann Acknowledge ab und sendest auch nur ohne Acks zu verlangen (das könnte ein Aufbohren der Library verlangen), oder schaltest für diese Sends das Autoack ganz ab (fände ich aber unsportlicher und habe ich noch nicht getestet).

Du musst es also gar nicht so kompliziert mit den vielen offenen Pipes machen. :wink:

ah, ich glaub ich verstehe....

Die Adressierung müßte ich ja dann schon korrekt haben- ich muss nun also nur steuern in welcher Reihenfolge etwas passiert...

Also in der void Loop zunächst erstmal start.listening starten, dann warten bis dann verfügbar sind, diese auslesen- so wie es jetzt schon im sketch ist. Dann fehlt mir der Befehl gewissermaßen den Empfang zu quittieren und dann das Senden zu starten.
Also muss ich in der Dokumentation mal nach einen Befehl wie IF (done) {} schauen... bei Radio.available() sollte ich in den Klammern sicher noch nach der pipenum fragen, zumindest bei der Zentrale... Ich setze mich damit heute Abend nochmal hin...

also irgendwie komme ich nicht weiter.... egal was ich probiere- die Zentrale sendet eisern und es wird von der Lampe empfangen... die Lampe sendet auch, aber es kommt einfach nicht bei der Zentrale an... :-/

allgemeine Anmerkung: Da sich die Problematik anscheinend anders darstellt als am Anfang, habe ich den Beitragstitel angepaßt.

@Whandall: Ich habe jetzt die Kommunikation zwischen der Zentrale und einem Node nach bestem Wissen und Gewissen aufgebaut… Ich habe zur Kontrolle eine LED die mir den Status des Sendens anzeigt und eine die mir den Status des Empfangens anzeigt…

Was mir jetzt aufgefallen ist, ist dass nur die LED fürs Senden ab und zu mal grün leuchtet, in gleichem Masse auch rot…
Aaaaaaaaaaber nur, wenn ich den seriellen Monitor auf habe. Mache ich den zu schlägt das Senden wesentlich seltener fehl und es wird in regelmäßigen Abständen die LED fürs Empfangen aktiv…

anbei die aktuellen Sketche:

Zentrale

#include <SPI.h>
#include "RF24.h"
#include "FastLED.h"
#include <DS3232RTC.h>
#include <Time.h>
#include <Wire.h>

RF24 radio(9,10);
byte addresses[][6] = {"1Pipe","2Pipe","3Pipe","4Pipe","5Pipe","6Pipe",};

long Status[6] = {10,11,12,13,14,15};  // definiere das Verhalten der Lampen
long Sensor[6];  // Fadingzeit, Farbe (CSV), Helligkeit (CSV), Sättigung (CSV), Haltezeit, Adresse Lampe, Pipe

int IRStatus;
int IRRaum; // 01 = Raum 1, 02 = Raum 2, 03 = Raum 3, 04 = Raum 4, 05 = Raum 5, 06 = alle Räume
int Auto = 1; // wenn Auto = 0, dann gelten die manuellen Vorgaben, Wenn Auto = 1, dann gelten die Programmvorgaben
          // wenn Auto = 2, starte Pogramm???
// Ordne automatische Programme zu

int i;

#define DATA_PIN 4
#define NUM_LEDS 3
CRGB leds[NUM_LEDS];

void setup() 
{
  Serial.begin(57600);
  Serial.println("Test Zentrale");
  
  FastLED.addLeds<WS2812B, DATA_PIN, GRB>(leds, NUM_LEDS);
  
    setSyncProvider(RTC.get);   // the function to get the time from the RTC
    if(timeStatus() != timeSet) 
        Serial.println("Unable to sync with the RTC");
    else
        Serial.println("RTC has set the system time"); 
  
  radio.begin();
  radio.setAutoAck(1); 
  radio.enableAckPayload();
  radio.enableDynamicPayloads(); 
  radio.setRetries(15,15);               
  radio.setPALevel(RF24_PA_HIGH);
  radio.setDataRate(RF24_1MBPS);

    radio.openWritingPipe(addresses[1]);
    radio.openReadingPipe(1,addresses[0]);
    
  radio.startListening();
}

void loop() 
{    
    leds[0] = CRGB::Black;
    leds[1] = CRGB::Black;
    leds[2] = CRGB::Black;
    FastLED.show();    
    
    Serial.print(hour());
    printDigits(minute());
    printDigits(second());
    Serial.print(' ');
    Serial.print(day());
    Serial.print(' ');
    Serial.print(month());
    Serial.print(' ');
    Serial.print(year());                    
    Serial.println("  ");
    Serial.println(); 
    
    
        radio.stopListening();  
        Serial.print("Sende Vorgaben an Lampe  "); 
        Serial.println();    
        Serial.print("Fadingzeit:    ");
        Serial.println(Status[0]);                      
        Serial.print("Farbe (CSV):   ");
        Serial.println(Status[1]);                            
        Serial.print("Helligkeit:    ");
        Serial.println(Status[2]);                        
        Serial.print("Saettigung   ");
        Serial.println(Status[3]);                    
        Serial.print("Programm: ");
        Serial.println(Status[4]);                       
        Serial.print("Auto? ");
        Serial.println(Status[5]);                      
        Serial.println("  ");                      
        Serial.println("  ");
      
        bool ok = (radio.write( Status, sizeof(Status) ));
        if (ok)
        {
        leds[1] = CRGB::Green;
        FastLED.show(); 
        }
        else
        {
        leds[1] = CRGB::Red;
        FastLED.show();  
        }
        
  radio.openReadingPipe(1,addresses[0]);     
  radio.startListening(); 

if ( radio.available() )
  {        
        leds[0] = CRGB::Orange;
        FastLED.show(); 
        
  while ( radio.available() )
    {
        leds[0] = CRGB::Green;
        FastLED.show();  
        
        radio.read( Sensor, sizeof(Sensor) ); 
        Serial.println("empfange ");
        Serial.print(" PIR:      " );
        Serial.println(Sensor[0]);
        Serial.print(" IR- Code: " );
        Serial.println(Sensor[1]);
        Serial.print(" IR- Raum " );
        Serial.println(Sensor[2]);
        Serial.print(" Raum ID " );
        Serial.println(Sensor[3]);
        Serial.print(" ? " );
        Serial.println(Sensor[4]);
        Serial.print(" ? " );
        Serial.println(Sensor[5]);                   
        Serial.println("  ");                      
        Serial.println("  ");
    }     
  }
}
void printDigits(int digits)
{
    // utility function for digital clock display: prints preceding colon and leading 0
    Serial.print(':');
    if(digits < 10)
        Serial.print('0');
    Serial.print(digits);
}

Node:

#include <SPI.h>
#include "RF24.h"
#include "FastLED.h"
#include "IRremote.h"

RF24 radio(9,10);

byte addresses[][6] = {"1Pipe","2Pipe","3Pipe","4Pipe","5Pipe","6Pipe"};

long Sensor[6];
long Status[6];
long Trigger[6];
int IRStatus;
int IRRaum; // 01 = Raum 1, 02 = Raum 2, 03 = Raum 3, 04 = Raum 4, 05 = Raum 5, 06 = alle Räume
int RaumID = 1;

int receiver = 3;
IRrecv irrecv(receiver);      
decode_results results; 

int PIR;
int sensorPin = 4;

#define DATA_PIN 2
#define NUM_LEDS 3
CRGB leds[NUM_LEDS];

void setup() 
{
  Serial.begin(57600);
  Serial.print("Test Lampe  ");
  Serial.println(RaumID);
  
  pinMode(sensorPin, INPUT);
  irrecv.enableIRIn();
  
  FastLED.addLeds<WS2812B, DATA_PIN, GRB>(leds, NUM_LEDS);

  radio.begin();
  radio.enableAckPayload();
  radio.enableDynamicPayloads(); 
  radio.enableDynamicPayloads(); 
  radio.setRetries(15,15);              
  radio.setPALevel(RF24_PA_HIGH);
  radio.setDataRate(RF24_1MBPS);
  
    radio.openWritingPipe(addresses[0]);
    radio.openReadingPipe(1,addresses[1]);
    
  radio.startListening();
}

void loop() {
  
    leds[0] = CRGB::Black;
    leds[1] = CRGB::Black;
    leds[2] = CRGB::Black;
    FastLED.show();  
    
 PIR = digitalRead(sensorPin);
    if (PIR == HIGH)
         {  
                leds[1] = CRGB::Green;
 FastLED.show();
                Serial.println("Bewegung erkannt.");
         }
    else
         {
                leds[1] = CRGB::Red;
 FastLED.show(); 
                Serial.println("keine Bewegung.");   
         }
        
if (irrecv.decode(&results))
  {
    translateIR();
    irrecv.resume();
  }  
  
  Sensor[0] = PIR;
  Sensor[1] = IRStatus;
  Sensor[2] = IRRaum;
  Sensor[3] = RaumID;     

  while (radio.available() )
  {
        leds[0] = CRGB::Green;
        FastLED.show();  
        
        IRStatus = 0;
        radio.read( Status, sizeof(Status) );
        Serial.println("empfange Vorgaben:   ");
        Serial.print("Fadingzeit: ");
        Serial.println(Status[0]);
        Serial.print("  Farbe (CSV): ");
        Serial.println(Status[1]);
        Serial.print("  Helligkeit (CSV: )");
        Serial.println(Status[2]);
        Serial.print("  Saettigung (CSV): ");
        Serial.println(Status[3]);
        Serial.print("  offen ");
        Serial.println(Status[4]);
        Serial.print("  offen   ");  
        Serial.println(Status[5]);
        Serial.print("  offen ");
        Serial.println(" ");  
        Serial.println(" ");  
        leds[0] = CRGB::Green;
 FastLED.show();
  
        radio.stopListening();
        Serial.println("Sende...");
        Serial.print("  Bewegung erkannt: ");
        Serial.println(Sensor[0]);
        Serial.print("  IR- Code ");
        Serial.println(Sensor[1]);
        Serial.print("  IR- Raum ");
        Serial.println(Sensor[2]);
        Serial.print("  Raum ID ");
        Serial.println(Sensor[3]);
        Serial.print("  offen ");
        Serial.println(Sensor[4]);
        Serial.print("  offen ");  
        Serial.println(Sensor[5]);
        Serial.println(" ");  
        Serial.println(" ");
      
    (radio.write( Sensor, sizeof(Sensor) ));
  
    radio.startListening();   
}}

Warum sendest du mit maximaler Geschwindigkeit und moderierst das nur mit massenweise Output?

Warum bringst du FastLED ins Spiel, obwohl deine Kommunikation noch nicht funktioniert?

Warum betreibst du so ein festes Schema von Senden und Empfangen (in der Basis)?

  radio.openReadingPipe(1,addresses[0]);in loop ist überflüssig.

Ich würde vorschlagen:

Grundzustand ist Empfangen.
Wenn kein Paket empfangen wurde und es Zeit ist ein neues Kommando zu senden:

  • stopListening
  • Senden des Kommandos
  • startListening

Jedes stopListening löscht den Rx-Fifo und bricht eine eventuell laufende Rx-Operation ab.

Wenn du alles empfangen willst was in der Luft rumschwirrt, solltest du die Zeit in der der Empfänger deaktiviert ist, so klein wie möglich halten.

loop sollte mit hoher Geschwindigkeit laufen, nicht gebremst von den ablaufenden Aktionen.

Ich habe es auch schon so hier versucht:

#include <SPI.h>
#include "RF24.h"
#include "FastLED.h"
#include <DS3232RTC.h>
#include <Time.h>
#include <Wire.h>

RF24 radio(9,10);
byte addresses[][6] = {"1Pipe","2Pipe","3Pipe","4Pipe","5Pipe","6Pipe",};

long Status[6] = {10,11,12,13,14,15};  // definiere das Verhalten der Lampen
long Sensor[6];  // Fadingzeit, Farbe (CSV), Helligkeit (CSV), Sättigung (CSV), Haltezeit, Adresse Lampe, Pipe

int IRStatus;
int IRRaum; // 01 = Raum 1, 02 = Raum 2, 03 = Raum 3, 04 = Raum 4, 05 = Raum 5, 06 = alle Räume
int Auto = 1; // wenn Auto = 0, dann gelten die manuellen Vorgaben, Wenn Auto = 1, dann gelten die Programmvorgaben
          // wenn Auto = 2, starte Pogramm???
// Ordne automatische Programme zu

int i;

#define DATA_PIN 4
#define NUM_LEDS 3
CRGB leds[NUM_LEDS];

void setup() 
{
  Serial.begin(57600);
  Serial.println("Test Zentrale");
  
  FastLED.addLeds<WS2812B, DATA_PIN, GRB>(leds, NUM_LEDS);
  
  
    setSyncProvider(RTC.get);   // the function to get the time from the RTC
    if(timeStatus() != timeSet) 
        Serial.println("Unable to sync with the RTC");
    else
        Serial.println("RTC has set the system time"); 
  
  radio.begin();
  radio.setAutoAck(1); 
  radio.enableAckPayload();
  radio.enableDynamicPayloads(); 
  radio.setRetries(15,15);               
  radio.setPALevel(RF24_PA_HIGH);
  radio.setDataRate(RF24_1MBPS);

    radio.openWritingPipe(addresses[1]);
    radio.openReadingPipe(1,addresses[0]);
    
  radio.startListening();
}

void loop() 
{    
    leds[0] = CRGB::Black;
    leds[1] = CRGB::Black;
    leds[2] = CRGB::Black;
    FastLED.show();    
    
    Serial.print(hour());
    printDigits(minute());
    printDigits(second());
    Serial.print(' ');
    Serial.print(day());
    Serial.print(' ');
    Serial.print(month());
    Serial.print(' ');
    Serial.print(year());                    
    Serial.println("  ");
    Serial.println(); 
    
      radio.startListening(); 

if ( radio.available() )
  {        
        leds[0] = CRGB::Orange;
        FastLED.show(); 
        
  while ( radio.available() )
    {
        leds[0] = CRGB::Green;
        FastLED.show();  
        
        radio.read( Sensor, sizeof(Sensor) ); 
        Serial.println("empfange ");
        Serial.print(" PIR:      " );
        Serial.println(Sensor[0]);
        Serial.print(" IR- Code: " );
        Serial.println(Sensor[1]);
        Serial.print(" IR- Raum " );
        Serial.println(Sensor[2]);
        Serial.print(" Raum ID " );
        Serial.println(Sensor[3]);
        Serial.print(" ? " );
        Serial.println(Sensor[4]);
        Serial.print(" ? " );
        Serial.println(Sensor[5]);                   
        Serial.println("  ");                      
        Serial.println("  ");
    }     
  }
        radio.stopListening();  
        Serial.print("Sende Vorgaben an Lampe  "); 
        Serial.println();    
        Serial.print("Fadingzeit:    ");
        Serial.println(Status[0]);                      
        Serial.print("Farbe (CSV):   ");
        Serial.println(Status[1]);                            
        Serial.print("Helligkeit:    ");
        Serial.println(Status[2]);                        
        Serial.print("Saettigung   ");
        Serial.println(Status[3]);                    
        Serial.print("Programm: ");
        Serial.println(Status[4]);                       
        Serial.print("Auto? ");
        Serial.println(Status[5]);                      
        Serial.println("  ");                      
        Serial.println("  ");
      
        bool ok = (radio.write( Status, sizeof(Status) ));
        if (ok)
        {
        leds[1] = CRGB::Green;
        FastLED.show(); 
        }
        else
        {
        leds[1] = CRGB::Red;
        FastLED.show();  
        }
}

leider ohne Erfolg… Die LEDs haben mir zumindest schon mal gezeigt, dass der serielle Monitor offensichtlich etwas stört…

Ich habe mich auch schon mal durch diverse Beispiele gehangelt… habe auch entsprechend dieser Beschreibung: https://arduino-info.wikispaces.com/Nrf24L01-2.4GHz-HowTo ein ganz einfaches Sketch gebaut, wo ich wirklich nur das Radio starte, auf listening schalte und dann lese- also quasi nur 3 Zeilen in der Loop habe… auch da kam keine Antwort durch… als wenn ich auf der falschen Pipe oder Adresse lausche…

wobei er ja bei IF radio.available und while radio.available erst was versucht zu lesen wenn es was zu lesen gibt… also scheint ja was empfangen zu werden…

Liest du eigentlich was ich schreibe?

Sorry- lesen tue ich es schon... ich glaub verstehen tue ich es noch nicht ganz... sorry...

Ich mache vielleicht den Fehler, dass ich versuche mich am Sketch der Nodes zu orientieren, weil die so schön sauber laufen und immmer im Wechsel empfangen und senden...

Ich tue mir auch noch etwas schwer, den Ablauf den ich logisch in normalen Worten formulieren kann in Arduino zu übersetzen.

Was ich hoffentlich verstanden habe ist dass ich stop.listening erst aufrufen darf, wenn ich die Daten ausgelesen habe. Nur weiß ich nicht sicher, ob ich das über einen Befehl/ eine Abfrage steuern muss, oder ob es reicht eine Reihenfolge einzuhalten weil der Arduino den Sketch Zeile für Zeile durchläuft... (?)

Davon abgesehen ist für mich noch die Frage wie ich den Sketch im nächsten Schritt so mit den übrigen Funktionen ausstatte, dass die Kommunikation nicht gebremst wird... reicht es das in eine andere void auszulagern und die von der loop jedesmal aufzurufen? Also ich denke bei denen die nicht bei jedem Loop- Durchlauf was machen müssen macht es Sinn... aber gut, so weit bin ich ja noch nicht....

Dein Kode bedient aber doch momentan nur einen Node, oder?

Wenn du die alle Nodes auf ein Paket an eine Adresse antworten lässt, geht das in die Hose, auch das Acknowledge ist gefährdet. Auch wenn alle Nodes für die Antwort unterschiedliche Adressen benutzen, müssen diese Pakete zeitlich versetzt sein, siehe Kollisionsvermeidung.

Schau mal ob dein Sender so nicht besser geht

#include <SPI.h>
#include "RF24.h"
#include "FastLED.h"
#include <DS3232RTC.h>
#include <Time.h>
#include <Wire.h>

RF24 radio(9, 10);
byte addresses[][6] = {"1Pipe", "2Pipe", "3Pipe", "4Pipe", "5Pipe", "6Pipe",};

long Status[6] = {10, 11, 12, 13, 14, 15}; // definiere das Verhalten der Lampen
long Sensor[6];  // Fadingzeit, Farbe (CSV), Helligkeit (CSV), Sättigung (CSV), Haltezeit, Adresse Lampe, Pipe

int IRStatus;
int IRRaum; // 01 = Raum 1, 02 = Raum 2, 03 = Raum 3, 04 = Raum 4, 05 = Raum 5, 06 = alle Räume
int Auto = 1; // wenn Auto = 0, dann gelten die manuellen Vorgaben, Wenn Auto = 1, dann gelten die Programmvorgaben
// wenn Auto = 2, starte Pogramm???
// Ordne automatische Programme zu

int i;

#define DATA_PIN 4
#define NUM_LEDS 3
CRGB leds[NUM_LEDS];

void setup()
{
  Serial.begin(57600);
  Serial.println("Test Zentrale");

  FastLED.addLeds<WS2812B, DATA_PIN, GRB>(leds, NUM_LEDS);

  setSyncProvider(RTC.get);   // the function to get the time from the RTC
  if (timeStatus() != timeSet)
    Serial.println("Unable to sync with the RTC");
  else
    Serial.println("RTC has set the system time");

  radio.begin();

  radio.openWritingPipe(addresses[1]);
  radio.openReadingPipe(1, addresses[0]);
  radio.openReadingPipe(1, addresses[1]);
  radio.openReadingPipe(1, addresses[2]);
  radio.openReadingPipe(1, addresses[3]);
  radio.openReadingPipe(1, addresses[4]);
  radio.openReadingPipe(1, addresses[5]);

  radio.startListening();
}

unsigned long letztesKommando;
const unsigned int kommandoAbstand = 500;

void loop()
{
  while (radio.available()) {
    radio.read( Sensor, sizeof(Sensor) );
    printSensorArray();
  }
  if (millis() - letztesKommando > kommandoAbstand) {
    letztesKommando = millis();
    printStatusArray();
    radio.stopListening();
    radio.write( Status, sizeof(Status));
    radio.startListening();
  }
}

void printSensorArray() {
  Serial.println("empfange ");
  Serial.print(" PIR:      " );
  Serial.println(Sensor[0]);
  Serial.print(" IR- Code: " );
  Serial.println(Sensor[1]);
  Serial.print(" IR- Raum " );
  Serial.println(Sensor[2]);
  Serial.print(" Raum ID " );
  Serial.println(Sensor[3]);
  Serial.print(" ? " );
  Serial.println(Sensor[4]);
  Serial.print(" ? " );
  Serial.println(Sensor[5]);
  Serial.println("  ");
}

void printStatusArray() {
  Serial.print(F("Sende Vorgaben an Lampe  "));
  Serial.println();
  Serial.print(F("Fadingzeit:    "));
  Serial.println(Status[0]);
  Serial.print(F("Farbe (CSV):   "));
  Serial.println(Status[1]);
  Serial.print(F("Helligkeit:    "));
  Serial.println(Status[2]);
  Serial.print(F("Saettigung   "));
  Serial.println(Status[3]);
  Serial.print(F("Programm: "));
  Serial.println(Status[4]);
  Serial.print(F("Auto? "));
  Serial.println(Status[5]);
  Serial.println(F("  "));
}

Ich kann das nicht compilieren und testen, also ohne Gewähr.

Du solltest dir angewöhnen für Zeichenkettenkonstanten das F() Macro zu benutzen,
sonst geht dir innerhalb kürzester Zeit der RAM aus (dort landen sie alle, zusätzlich zu einer Kopie im Flash). Ich habe das mal bei der letzten neuen Routine printStatusArray vorgemacht…

Guten Morgen Whandall- ich bitte dir auf jeden Fall mal einen guten Rotwein oder ein Bier schuldig! Viiiiieeeelen Dank!

Ich habe zwar beim compilieren ein paar kleine Fehlermeldungen- aber die sagen mir ja eigentlich genau wo der Hund begraben ist.... das sollte ich hinbekommen... :slight_smile:

Leider ist das Ergebnis das gleiche.... :-/

die Kommunikation geht nur in eine Richtung.... kann sich das mit der Libary DS3232RTC beißen? Ich nehme die mal raus und teste neu und setze mich dann nochmal hin und baue die Zentrale mit einem Mega auf den ich hier noch liegen habe... morgen Abend melde ich mich dann mal mit den neuen ERkenntnissen...

byte addresses[6] = {"1Pipe","2Pipe","3Pipe","4Pipe","5Pipe","6Pipe",};

Ist das denn richtig ?

Mal abgesehen davon, dass mehrdimensionale Arrays die menschliche Intelligenz generell überbeanspruchen, würde ich da eine der folgenden Varianten verwenden:

char* texte[] = {"1Pipe","2Pipe","3Pipe","4Pipe","5Pipe","6Pipe"};   // Texte können auch unterschiedlich lang sein.
__FlashStringHelper* texte[] = {F("1Pipe"),F("2Pipe"),F("3Pipe"),F("4Pipe"),F("5Pipe"),F("6Pipe")}; // spart RAM