So sendet zum Beispiel ein am Stromzähler angebrachter Arduino den Stromverbrauch an meinen Master-Arduino, welcher wiederum über meinen Server die Daten speichert.
Dieser Chip samt Mirf-Bibliothek für die Arduino IDE erschienen mir damals beim Aufbau des Projektes das Passende zu sein.
Allerdings muss ich jedes Mal, wenn ich wieder einen NRF24l01 verbauen will, recherchieren, wie man die zahlreichen Pins mit dem Arduino verbindet und wie man die Mirf-Bibliothek verwendet.
Das möchte ich nun in einem Artikel zusammenfassen.
Anschlüsse
NRF24l01-Pin => Arduino1 => GND*<br/>2 => VCC (3.3 V)*<br/>3 => 8**<br/>4 => 7**<br/>5 => 13<br/>6 => 11<br/>7 => 12<br/>8 => ***
**) Pin-Belegung kann im Software-Sketch geändert werden. 8+7 sind der Standard, wenn im Software-Sketch nichts anderes angegeben wird.
***) Wird bei der Mirf-Bibliothek nicht benötigt
Die Anschlüsse sind leider nicht Breadboard-kompatibel, deshalb musste ich mir ein paar Male to Female Jumper Kabel zulegen.
Sketch-Beispiele
Die Beispiels-Sketche, die mit der Bibliothek mitgeliefert wurden, waren wir anfangs nicht sehr hilfreich, da sie nicht direkt meiner geplanten Verwendung entsprachen.Dadurch, dass nur byte versendet werden können und ich es mit der Typen-Konvertierung der Arduino-IDE noch nicht so wirklich drauf habe, war aller Anfang etwas schwer.
In meinen Beispielen haben wir zwei Sketches – ein Arduino ist der Sender, der andere Arduino ist der Empfänger – und es werden (in diesem Fall maximal) 15 alphanumerische Zeichen übertragen.
Das absolute Maximum an Zeichen, die bei einer Übertragung übertragen werden können, lautet übrigens: 32 Zeichen.
Sender
#include <MirfHardwareSpiDriver.h>
int x=0;
void setup() {
Serial.begin(9600);
// RF24/Mirf initalisieren
//Mirf.cePin = 8; // Sollte der CE-Pin (3) an einem anderen Arduino-Port angeschlossen werden müssen (8: Standard)
//Mirf.csnPin = 7; // Sollte der CSE-Pin (4) an einem anderen Arduino-Port angeschlossen werden müssen (7: Standard)
Mirf.spi = &MirfHardwareSpi;
Mirf.init();
Mirf.payload = 16; // Wir werden einen String mit 15 Zeichen versenden
Mirf.channel = 90; // Optional. Sende-/Empfangsfrequenz ändern
Mirf.config();
Mirf.configRegister(RF_SETUP, 0x06); // Optional. Soll die Datenrate angeblich auf 1MHz ändern, was zu besserer Reichweite führt
Mirf.setTADDR((byte *)"ardu01"); // Name des Empfängers. 5 Zeichen!
}
void loop() {
// Fake-Daten, die wir senden möchten. x mit einem Wert zwischen 1 und 99
if (++x > 99) { x = 1; }
// Senden
char mirfdata[16];
sprintf(mirfdata, "Test abcde x=%02i", x); // Alles in die 15 Zeichen packen. 16. Zeichen bleibt als Terminator-Zeichen leer
Mirf.send((byte *) &mirfdata);
while( Mirf.isSending() ) ;
// Konsolen-Info und nen paar Sekunden bis zum nächsten Sendevorgang warten
Serial.print(mirfdata);
Serial.println(" gesendet");
delay(5000);
}
Empfänger
Mirf.payload
, Mirf.channel
und Mirf.configRegister(RF_SETUP)sollten hier gleich wie beim Sender gesetzt werden.
Ebenso muss die
Mirf.setRADDR
(Name des Empfängers) nun der Mirf.setTADDR
(Empfänger-Adresse beim Sender) des Senders entsprechen.Achtung: Mirf.setRADDR und Mirf.setTADDR nicht verwechseln!
#include <Mirf.h>
#include <nRF24L01.h>
#include <MirfHardwareSpiDriver.h>
char mirfdata[16];
void setup() {
Serial.begin(9600);
// RF24/Mirf initalisieren
Mirf.cePin = 9; // Hier habe ich als Beispiel mal den CE-Pin beim Arduino an D9 angeschlossen
Mirf.csnPin = 10; // ...und den CSN-Pin beim Arduino an D10
Mirf.spi = &MirfHardwareSpi;
Mirf.init();
Mirf.payload = 16;
Mirf.channel = 90;
Mirf.config();
Mirf.configRegister(RF_SETUP, 0x06);
Mirf.setRADDR((byte *)"ardu01"); // Ich bin ardu01
}
void loop() {
if (Mirf.dataReady()) {
while (!Mirf.rxFifoEmpty()) {
Mirf.getData((byte *) &mirfdata);
}
if (mirfdata[0] != 0 && mirfdata != 0) {
Serial.print("Folgendes empfangen: ");
Serial.println(mirfdata);
}
}
delay(100);
}
![]() ![]() ![]() ![]() |
|
Erstellt am: 17.04.2016 | .Kommentieren |