NRF24L01 Sensornetzwerk?

#3965147
Lesenswert?

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?
#3965403
Lesenswert?

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
Lesenswert?

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?
#3966724
Lesenswert?

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:
#3967147
Lesenswert?

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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren