Das Sender-Empfänger-Modul nRF24L01 arbeitet auf einer Frequenz von 2,4GHz und ist mit zahlreichen nützlichen Features ausgestattet. Besonders interessant ist eine intelligente Paketverwaltung mit CRC-Prüfung, automatischer Empfangsbestätigung und erneuter automatischer Versendung des Paketes, falls die Empfangsbestätigung beim Sender ausbleibt. Damit sichergestellt ist, dass hierdurch beim Empfänger keine identischen Pakete ankommen, arbeiten die Module beim Versand mit einer internen Paket-ID und verwerfen identische Pakete automatisch. Ebenfalls für den Arduino Datenlogger mit Stockwaage für Imker sehr interessant, ist die Möglichkeit mit bis zu sechs Datenleitungen parallel zu arbeiten. Damit eignet sich dieses Modul auch optimal für ein beelogger-Netzwerk mit bis zu sechs Sendern, ausgestattet mit Sensoren, und einem Empfänger, welcher die Messwerte über einen Ethernet-Adapter an den Webserver sendet. Durch adressierbare Leitungen und die Möglichkeit, bis zu 127 Kanäle einzustellen, können mehrere Systeme auch parallel betrieben werden.
Bezug
Das Modul nRF24L01 gibt es in vielen verschiedenen Ausführungen. Diese Anleitung bezieht sich auf Module mit einen 2×4-Pin Header, welche im 2,54-Raster auch vom beelogger-Funk und beelogger-SMD unterstützt werden. Da die Reichweite der Standard-Module nur relativ gering ist, sollte ein Modul mit integriertem Verstärker (‚PA‘ = Power-Amplifier) gewählt werden. Zu empfehlen ist ferner ein Modul mit Buchse zum Anschluss einer externen Antenne, um die Reichweite und Stabilität der Verbindung zu optimieren. Module mit integriertem Verstärker haben einen Stromverbrauch beim Senden von bis zu 115mA. Daher muss zur Stromversorgung des Moduls ein externer 3,3V-Spannungsregler verwendet werden. Diese gibt es in einer nahezu unüberschaubaren Vielfalt.
Der nRF24L01 ist kompatibel mit beelogger-Funk und beelogger-SMD V3.0 – V4.1 ! |
Beschaltung
Module mit internem Verstärker haben einen Stromverbrauch beim Senden von bis zu 115mA. Die Stromversorgung des Moduls erfolgt beim beelogger-Funk über den 3,3V-Spannungsregler und beim beelogger-SMD über die geschaltete 3,3V.
Arduino Uno, Nano, usw. | nRF24L01 | Stromversorgung |
VCC | 3,3V | |
GND | GND | GND |
D8 | CE | |
D7 | CSN | |
D13 | SCK | |
D11 | MOSI | |
D12 | MISO |
Libraries
<SPI.h> – in der Arduino-Software bereits integriert
<RF24.h> – https://github.com/maniacbug/RF24
Test-Programmcode
Bei diesem Test-Programmcode werden alle zwei Sekunden fiktive Messwerte vom Sender an den Empfänger übertragen. Wird der Datensatz korrekt empfangen, werden diese über den seriellen Monitor des Empfängers ausgegeben. Vor der nächsten Übertragung werden die Messwerte um 1 erhöht. Die Client-Nummer wird dabei über die Sende-Empfangsleitung definiert. Im kompletten Programmcode wird über die Client-Nummer das jeweilige Unterverzeichnis für den Webserver gesetzt. Im Praxistest hat sich gezeigt, dass einige Module, speziell bei niedrigen Datenraten, Probleme bei aktivierter AutoAck-Funktion haben, weshalb diese im Programmcode deaktiviert wurde. Dadurch wird ein Datensatz mit der aktuellen Einstellung immer 15 mal gesendet, was durch die intelligente Paketverwaltung jedoch keine negativen Auswirkungen hat. Bei Verwendung eines Moduls mit integriertem Verstärker muss vor dem Einspielen des Test-Programmcodes die Sendestärke eingestellt werden, die den gesetzlichen Vorgaben des jeweiligen Landes entsprechen muss.
Zum Test des nRF24L01 mit dem beelogger-SMD muss die Stromversorgung aktiviert werden. Hierfür wird im Setup des Programmcodes der Pin 4 auf ‚HIGH‘ gesetzt.
void setup() { #ifdef AVR_PRO // beelogger verwendet Arduino Pro / Pro Mini digitalWrite(Power_Pin, HIGH); #else digitalWrite(Power_Pin, LOW); #endif pinMode(Power_Pin, OUTPUT); delay(1000); //... hier folgen weitere Befehle des Test-Programmcodes }
Test-Programmcode Client (Sender)
/* * (C) 2018 R.Schick / Thorsten Gurzan - beelogger.de * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ // beelogger.de - Arduino Datenlogger für Imker // Erläuterungen dieses Programmcodes unter https://beelogger.de #include <SPI.h> #include <RF24.h> RF24 radio(8,7); static const uint64_t pipes[6] = {0xF0F0F0F0E1LL, 0xF0F0F0F0D2LL, 0xF0F0F0F0C3LL, 0xF0F0F0F0B4LL, 0xF0F0F0F0A5LL, 0xF0F0F0F096LL}; byte ClientNummer = 1; // Mögliche Werte: 1-6 // Test-Messdaten (regulär kommen die Messdaten von den Sensoren) float TempIn = 27.25; float TempOut = 30.75; float FeuchteIn = 50.20; float FeuchteOut = 60.70; float Licht = 100000.80; long BienenIn = 3200; long BienenOut = 500; long Gewicht = 20000; void setup() { #ifdef AVR_PRO // beelogger verwendet Arduino Pro / Pro Mini digitalWrite(Power_Pin, HIGH); #else digitalWrite(Power_Pin, LOW); #endif pinMode(Power_Pin, OUTPUT); delay(1000); radio.begin(); delay(20); radio.setChannel(1); // Funkkanal - Mögliche Werte: 0 - 127 radio.setAutoAck(0); radio.setRetries(15,15); radio.setPALevel(RF24_PA_HIGH); // Sendestärke darf die gesetzlichen Vorgaben des jeweiligen Landes nicht überschreiten! // RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm, RF24_PA_MED=-6dBM, and RF24_PA_HIGH=0dBm radio.openWritingPipe(pipes[ClientNummer-1]); radio.openReadingPipe(1,pipes[0]); radio.startListening(); delay(20); } void loop() { long message[8] = {long(TempIn*100),long(TempOut*100),long(FeuchteIn*100),long(FeuchteOut*100),long(Licht*100),Gewicht,BienenIn,BienenOut}; radio.stopListening(); radio.write(&message, sizeof(message)); radio.startListening(); delay(2000); TempIn++; TempOut ++; FeuchteIn++; FeuchteOut++; Licht++; BienenIn++; BienenOut++; Gewicht++; }
Test-Programmcode Master (Empfänger)
/* * (C) 2015 Thorsten Gurzan - beelogger.de * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ // beelogger.de - Arduino Datenlogger für Imker // Erläuterungen dieses Programmcodes unter https://beelogger.de #include <SPI.h> #include <RF24.h> RF24 radio(8,7); static const uint64_t pipes[6] = {0xF0F0F0F0E1LL, 0xF0F0F0F0D2LL, 0xF0F0F0F0C3LL, 0xF0F0F0F0B4LL, 0xF0F0F0F0A5LL, 0xF0F0F0F096LL}; uint8_t ClientNummer; float TempIn, TempOut, FeuchteIn, FeuchteOut, Licht; long Gewicht, BienenIn, BienenOut; void setup() { radio.begin(); delay(20); radio.setChannel(1); // Funkkanal - Mögliche Werte: 0 - 127 radio.setAutoAck(0); radio.setPALevel(RF24_PA_HIGH); // Sendestärke darf die gesetzlichen Vorgaben des jeweiligen Landes nicht überschreiten! // RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm, RF24_PA_MED=-6dBM, and RF24_PA_HIGH=0dBm radio.openReadingPipe(0,pipes[0]); radio.openReadingPipe(1,pipes[1]); radio.openReadingPipe(2,pipes[2]); radio.openReadingPipe(3,pipes[3]); radio.openReadingPipe(4,pipes[4]); radio.openReadingPipe(5,pipes[5]); radio.startListening(); delay(20); Serial.begin(9600); Serial.println(F("Starte Empfaenger ...")); } void loop() { if (radio.available(&ClientNummer)){ long got_message[8] = {0,0,0,0,0,0,0,0}; bool done = false; while (!done){ done = radio.read(&got_message, sizeof(got_message)); } TempIn = (float (got_message[0])/100); TempOut = (float (got_message[1])/100); FeuchteIn = (float (got_message[2])/100); FeuchteOut = (float (got_message[3])/100); Licht = (float (got_message[4])/100); Gewicht = got_message[5]; BienenIn = got_message[6]; BienenOut = got_message[7]; Serial.println(); Serial.print(F("ClientNummer: ")); Serial.println(ClientNummer+1); Serial.print(F("Stocktemperatur: ")); Serial.println(TempIn); Serial.print(F("Aussentemperatur: ")); Serial.println(TempOut); Serial.print(F("Stockluftfeuchte: ")); Serial.println(FeuchteIn); Serial.print(F("Aussenluftfeuchte: ")); Serial.println(FeuchteOut); Serial.print(F("Beleuchtungsstaerke: ")); Serial.println(Licht); Serial.print(F("Gewicht: ")); Serial.println(Gewicht); Serial.print(F("Bienen In: ")); Serial.println(BienenIn); Serial.print(F("Bienen Out: ")); Serial.println(BienenOut); } }
Ausgabe des seriellen Monitors vom Master (9600 baud):
ClientNummer: 1 Stocktemperatur: 27.25 Aussentemperatur: 30.75 Stockluftfeuchte: 50.20 Aussenluftfeuchte: 60.70 Beleuchtungsstaerke: 100000.80 Gewicht: 20000 Bienen In: 3200 Bienen Out: 500 ClientNummer: 1 Stocktemperatur: 28.25 Aussentemperatur: 31.75 Stockluftfeuchte: 51.20 Aussenluftfeuchte: 61.70 Beleuchtungsstaerke: 100001.80 Gewicht: 20001 Bienen In: 3201 Bienen Out: 501 ClientNummer: 1 Stocktemperatur: 29.25 Aussentemperatur: 32.75 Stockluftfeuchte: 52.20 Aussenluftfeuchte: 62.70 Beleuchtungsstaerke: 100002.80 Gewicht: 20002 Bienen In: 3202 Bienen Out: 502
Programmcode download:
Version 2018 | Anpassung Aktivierung Stromversorgung |
Der komplette Programmcode für den Arduino Datenlogger mit Stockwaage für Imker ist unter Programmcode zu finden.