beelogger

Funk – nRF24L01 (2,4GHz)

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 !
Bild Bezugsquelle Preis ab Suchbegriffe* Bemerkungen
 beelogger nRF24L01 eBay 5,55€ nRF24L01+PA NRF24 U.FL-Buchse für externe Antenne, “Plus-Modul”
 beelogger nRF24L01 Antenne eBay 2,00€ SMA Antenna RP-SMA IPX U.fl cable 2.4 Kit externe Antenne & Kabel
  eBay 1,00€ Step Down Regulator 3,3 Voltage Spannungsregler auf 3,3V

 *Einkaufstipps

Beschaltung

beelogger nRF24L01 Pinout
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
Download

 

Der komplette Programmcode für den Arduino Datenlogger mit Stockwaage für Imker ist unter Programmcode zu finden.