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?
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
.... 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.
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 | }
|
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?
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)?
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.
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. :)
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?
ist Mirf.send((byte *) &data); richtig? Müsste eigentlich '(byte*) data' oder '(byte*) &data[0]' heissen.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.