NRF24L01 Sensornetzwerk?

OP #3965147
Hallo Leute,
Ich bin gerade mit den NRF24 Modulen am forschen.
Ich möchte für meine Wohnung ein Netzwerk aus Sensoren konstruieren, 
also Daten die von einem DHT11/22 eingehen, sollen an eine Masterstation 
geleitet werden. Geplant sind 5 Räume und die Masterstation mit Display, 
wären also 6 NRF 24 Module.
Softwaretechnisch klappt alles nur bedingt. Ich möchte das der Master 
ein Befehl an Sensor 1 schickt "schicke Werte an Master", und das dann 
wiederum mit den anderen Sensoren macht.
Klappt nur teilweise, habe das Problem wenn ich die Werte am Master 
Auslese von z.b. Sensor1 dann klappt das beim ersten Durchlauf doch dann 
zeigt er mir einfach bei Sensor 1 Werte von einem anderen Sensor an. 
Welche lib ist dafür am besten geeignet und warum werden nach dem 2 
durchlauf andere Werte angezeigt?
OP #3965403
Master:
1
#include <Wire.h>
2
#include <LiquidCrystal_I2C.h>
3
LiquidCrystal_I2C lcd(0x3F,20,4);
4

5
#include <SPI.h>
6
#include <Mirf.h>
7
#include <MirfHardwareSpiDriver.h>
8
#include <MirfSpiDriver.h>
9
#include <nRF24L01.h>
10

11

12
//RX
13

14
int Sens1[] = {4};
15
int Sens2[] = {1011};
16
float data[3];
17

18
  
19
void setup()
20
{
21
  Serial.begin(9600);
22
  lcd.init();    
23
  lcd.setBacklight(100);
24
  
25
  Mirf.spi = &MirfHardwareSpi;
26
  Mirf.init();
27
  Mirf.channel = 2;
28
  Mirf.setRADDR((byte *)"serv0");
29
  //Mirf.setTADDR((byte *)"sens1");
30
  Mirf.payload = sizeof(data);
31
  //Mirf.payload = sizeof(Sens1);
32
  //Mirf.payload = sizeof(Sens2);
33
  
34
  Mirf.config();
35
}
36
  
37
void loop()
38
{
39
  Sensor1();
40
  delay(500);
41
  Sensor2();
42
}
43

44

45
void Sensor1(void)
46
{
47
  data[0] = 4,
48
  data[1] = 0;
49
  data[2] = 0;
50
  
51
  Mirf.setTADDR((byte *)"sens1");
52
  Mirf.send((byte *) &data);
53
  while(Mirf.isSending()){}
54
  Serial.println("Send...");
55
  Serial.println(data[0]);
56
  
57
  while(1){ if(Mirf.dataReady()) break; }
58

59
  Mirf.setRADDR((byte *)"serv0");
60
  Mirf.getData((byte *) &data);
61
  
62
  Serial.println("Sensor1:"); 
63
  Serial.print("Temp: "); Serial.println(data[1]);
64
  Serial.print("Feu:  "); Serial.println(data[2]);
65
  
66
  delay(2000);
67
  data[0] = 0;
68
  data[1] = 0;
69
  data[2] = 0;
70
}
71

72
void Sensor2(void)
73
{
74
  data[0] = 5,
75
  data[1] = 0;
76
  data[2] = 0;
77
  
78
  Mirf.setTADDR((byte *)"sens2");
79
  Mirf.send((byte *) &data);
80
  while(Mirf.isSending()){}
81
  Serial.println("Send...");
82
  Serial.println(data[0]);
83
  
84
  while(1){ if(Mirf.dataReady()) break; }
85

86
  Mirf.setRADDR((byte *)"serv0");
87
  Mirf.getData((byte *) &data);
88
  
89
  Serial.println("Sensor2:"); 
90
  Serial.print("Temp: "); Serial.println(data[1]);
91
  Serial.print("Feu:  "); Serial.println(data[2]);
92
  
93
  delay(2000);
94
  data[0] = 0;
95
  data[1] = 0;
96
  data[2] = 0;
97
}

Sensor1:
1
#include <dht11.h>
2
dht11 DHT11;
3

4
#include <SPI.h>
5
#include <Mirf.h>
6
#include <MirfHardwareSpiDriver.h>
7
#include <MirfSpiDriver.h>
8
#include <nRF24L01.h>
9

10
//TX
11
int Sens1[1];
12
int x = 101;
13
float data[3];
14

15
void setup()
16
{
17
  DHT11.attach(4);
18
  Serial.begin(9600);
19
  Mirf.spi = &MirfHardwareSpi;
20
  Mirf.init();
21
  Mirf.channel = 2;
22
  Mirf.setRADDR((byte *)"sens1");
23
  Mirf.setTADDR((byte *)"serv0");
24
  Mirf.payload = sizeof(data);
25
  //Mirf.payload = sizeof(Sens1);
26
  Mirf.config();
27
}
28
  
29
void loop()
30
{
31
  while(Mirf.dataReady())
32
  {
33
    Serial.println("Warte...");
34
    Mirf.setRADDR((byte *)"sens1");
35
    Mirf.getData((byte *) &data);
36
    Serial.println(data[0]);
37
    
38
    if(data[0] == 4)
39
    {
40
      delay(300);
41
      data[0] = 7;
42
      int chk = DHT11.read();
43
      data[1] = (float)DHT11.temperature;
44
      data[2] = (float)DHT11.humidity;
45
      Serial.println(data[1]);
46
      Serial.println(data[2]);
47
      
48
      Mirf.setTADDR((byte *)"serv0");
49
      Mirf.send((byte *) &data);
50
      while(Mirf.isSending()){}
51
      
52
      data[0] = 0;
53
      data[1] = 0;
54
      data[2] = 0;
55
      Serial.println(data[2]);
56
    }
57
  }
58
}

Sensor2:
1
#include <dht11.h>
2
dht11 DHT11;
3

4
#include <SPI.h>
5
#include <Mirf.h>
6
#include <MirfHardwareSpiDriver.h>
7
#include <MirfSpiDriver.h>
8
#include <nRF24L01.h>
9

10
//TX
11
int Sens1[1];
12
int x = 101;
13
float data[3];
14

15
void setup()
16
{
17
  DHT11.attach(4);
18
  Serial.begin(9600);
19
  Mirf.spi = &MirfHardwareSpi;
20
  Mirf.init();
21
  Mirf.channel = 2;
22
  Mirf.setRADDR((byte *)"sens2");
23
  Mirf.setTADDR((byte *)"serv0");
24
  Mirf.payload = sizeof(data);
25
  //Mirf.payload = sizeof(Sens1);
26
  Mirf.config();
27
}
28
  
29
void loop()
30
{
31
  while(Mirf.dataReady())
32
  {
33
    Serial.println("Warte...");
34
    Mirf.setRADDR((byte *)"sens2");
35
    Mirf.getData((byte *) &data);
36
    Serial.println(data[0]);
37
    
38
    if(data[0] == 5)
39
    {
40
      delay(300);
41
      data[0] = 8;
42
      int chk = DHT11.read();
43
      data[1] = (float)DHT11.temperature;
44
      data[2] = (float)DHT11.humidity;
45
      Serial.println(data[1]);
46
      Serial.println(data[2]);
47
      
48
      Mirf.setTADDR((byte *)"serv0");
49
      Mirf.send((byte *) &data);
50
      while(Mirf.isSending()){}
51
      
52
      data[0] = 0;
53
      data[1] = 0;
54
      data[2] = 0;
55
      Serial.println(data[2]);
56
    }
57
  }
58
}
Gast #3965460
Martin T. schrieb:
> Ja, sorry Code poste ich noch, bin mit Handy unterwegs.
Toll Idee, so eine Frage zu posten, ohne das irgend jemand den 
blassesten Schimmer haben kann, was du da programmiert hast.

Und warum hängst du den Code nicht als Dateianhang und gibst vielleicht 
einen Link zu den von dir verwendeten Bibliotheken an?
Oder soll sich die jeder selbst zusammen suchen?
Gast #3965482
Meckerziege schrieb:
> gibst vielleicht
> einen Link zu den von dir verwendeten Bibliotheken an?
Oh ja...

Ohne weit zu lesen mal eine Frage:
Was soll
1
Mirf.payload = sizeof(data);
 zurückliefern?
Und was liefert auf deiner Architektur (welche das auch immer sein 
mag...) sizeof(float)?
Gast #3965491
Aus versehen doch weitergelesen:

float data[3];
...
data[0] = 4,
data[1] = 0;
data[2] = 0;
...

Also wenn der Compiler da nicht mindestens 2 Sachen angemeckert hat, 
schmeiß ihn weg!

Also so kann dir echt keiner helfen.
OP #3966724
Habe jetzt die Lib und die Codes hochgeladen...

Okay,
das Problem ist einfach dass ich überall im Netz gesucht habe nach ein 
paar Bspl, dass ich weiß wie der NRF funktioniert und wie man was 
programmieren muss. Das mit dem Payload verstehe ich gar nicht und 
brauche dabei bitte hilfe.
Ich hoffe man kann meinen Codehaufen etwas nachvollziehen.

Achso mal zu Funktion wie das ganze ablaufen soll:
Der Master sendet ein Startzeichen im Unterprogramm an einen 
Senor(besteht aus DHT11 und ArduinoProMini und NRF-Chip, dieses Zeichen 
z.b. "4" wird am Sensor empfangen und sendet nun die Werte an den 
Master. Das Array data[3], ist so gelegt das data[0] das Startzeichen 
enthält, data[1] die Temperaturwerte und [2] die Feuchtigkeit.
Das ganze funktioniert mit einem Sensor super(dafür habe ich ein anderes 
Programm), sobald ich aber einen zweiten Senor abrufen möchte zeigt mein 
Display die Sensowerte vertauscht an, d.h.
Sensor1: hier stehen daten von Sensor 2
Sensor2: hier stehen daten von Sensor 1

Ich hoffe ihr versteht was ich meine und könnt mir irgendwie helfen. :)
Angehängte Dateien:
OP #3967147
Jojo S. schrieb:
> ist  Mirf.send((byte *) &data); richtig?
> Müsste eigentlich '(byte*) data' oder '(byte*) &data[0]' heissen.


Werde ich morgen mal ausprobieren, aber wie empfange ich data[0]?  mit 
Mirf.getData((byte *) &data[0]);   ??? und was ist wenn ich z.b. data[1] 
und [2] hintereinander weg sende, wie sieht das mit dem empfangscode 
aus?

So richtig? ->
1
//Sender:
2
...
3
Mirf.setTADDR((byte *)"Master");
4
Mirf.send((byte *) &data[0]);
5
while(Mirf.isSending()){}
6
Mirf.send((byte *) &data[1]);
7
while(Mirf.isSending()){}
8
...
9

10

11
//Empfänger:
12
...
13
Mirf.setRADDR((byte *)"Sens1");
14
Mirf.getData((byte *) &data[0]);
15
Mirf.getData((byte *) &data[1]);
16
...

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 11 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.