Forum: Mikrocontroller und Digitale Elektronik NRF24L01 Sensornetzwerk?


von Nitram E. (slexx)


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?

von .... (Gast)


Lesenswert?

Martin T. schrieb:
> warum werden nach dem 2
> durchlauf andere Werte angezeigt?

Widerstand R42 ist verpolt eingelötet.
Und in Zeile 43 fehlt eine Klammer

von Nitram E. (slexx)


Lesenswert?

.... schrieb:
> Martin T. schrieb:
>> warum werden nach dem 2
>> durchlauf andere Werte angezeigt?
>
> Widerstand R42 ist verpolt eingelötet.
> Und in Zeile 43 fehlt eine Klammer


Ja, sorry Code poste ich noch, bin mit Handy unterwegs.

von Nitram E. (slexx)


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
}

von Abdul K. (ehydra) Benutzerseite


Lesenswert?

Struktogramme, Kommentarzeichen usw. wurden schon erfunden.

von Meckerziege (Gast)


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?

von Lutz (Gast)


Lesenswert?

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

von Lutz (Gast)


Lesenswert?

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.

von Nitram E. (slexx)


Angehängte Dateien:

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. :)

von Nitram E. (slexx)


Lesenswert?

Keiner kann helfen? :(

von Ulrich F. (Gast)


Lesenswert?

Martin T. schrieb:
> Keiner kann helfen? :(

Naja...
Mit dem Mirf Gedöns kenne ich mich nicht aus.....

Habe das RF24Network von maniacbug im Einsatz.
Tuts...

Hat das geholfen?

von Jojo S. (Gast)


Lesenswert?

ist  Mirf.send((byte *) &data); richtig?
Müsste eigentlich '(byte*) data' oder '(byte*) &data[0]' heissen.

von Nitram E. (slexx)


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
...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.