From 68697a4b19175e40a78f3681cf564bf8dd4d290e Mon Sep 17 00:00:00 2001 From: Stefan Brand Date: Mon, 20 Jan 2020 13:43:37 +0100 Subject: [PATCH] Add ability to set Datarate --- Firmware/lib/LoRaWAN/LoRaWAN.cpp | 9 ++--- Firmware/lib/LoRaWAN/LoRaWAN.h | 2 +- Firmware/lib/RFM95/RFM95.cpp | 64 ++++++++++++++++++++++++++++++-- Firmware/lib/RFM95/RFM95.h | 13 +++++++ Firmware/src/main.cpp | 10 +++-- 5 files changed, 85 insertions(+), 13 deletions(-) diff --git a/Firmware/lib/LoRaWAN/LoRaWAN.cpp b/Firmware/lib/LoRaWAN/LoRaWAN.cpp index a21d7d2..7a35d4c 100644 --- a/Firmware/lib/LoRaWAN/LoRaWAN.cpp +++ b/Firmware/lib/LoRaWAN/LoRaWAN.cpp @@ -35,7 +35,7 @@ void LoRaWAN::setKeys(unsigned char NwkSkey[], unsigned char AppSkey[], unsigned * ***************************************************************************************** */ -void LoRaWAN::Send_Data(unsigned char *Data, unsigned char Data_Length, unsigned int Frame_Counter_Tx) +void LoRaWAN::Send_Data(unsigned char *Data, unsigned char Data_Length, unsigned int Frame_Counter_Tx, lora_dr_t datarate) { //Define variables unsigned char i; @@ -66,7 +66,6 @@ void LoRaWAN::Send_Data(unsigned char *Data, unsigned char Data_Length, unsigned 111 (0xE0) Proprietary */ - // Unconfirmed data up unsigned char Mac_Header = 0x40; @@ -79,7 +78,6 @@ void LoRaWAN::Send_Data(unsigned char *Data, unsigned char Data_Length, unsigned //Encrypt the data Encrypt_Payload(Data, Data_Length, Frame_Counter_Tx, Direction); - //Build the Radio Package RFM_Data[0] = Mac_Header; @@ -119,13 +117,12 @@ void LoRaWAN::Send_Data(unsigned char *Data, unsigned char Data_Length, unsigned //Add MIC length to RFM package length RFM_Package_Length = RFM_Package_Length + 4; + //Set Lora Datarate + _rfm95->RFM_Set_Datarate(datarate); //Send Package _rfm95->RFM_Send_Package(RFM_Data, RFM_Package_Length); } - - - /* Encryption stuff after this line */ diff --git a/Firmware/lib/LoRaWAN/LoRaWAN.h b/Firmware/lib/LoRaWAN/LoRaWAN.h index 49585c5..da1db23 100644 --- a/Firmware/lib/LoRaWAN/LoRaWAN.h +++ b/Firmware/lib/LoRaWAN/LoRaWAN.h @@ -40,7 +40,7 @@ class LoRaWAN public: LoRaWAN(RFM95 &rfm95); void setKeys(unsigned char NwkSkey[], unsigned char AppSkey[], unsigned char DevAddr[]); - void Send_Data(unsigned char *Data, unsigned char Data_Length, unsigned int Frame_Counter_Tx); + void Send_Data(unsigned char *Data, unsigned char Data_Length, unsigned int Frame_Counter_Tx, lora_dr_t datarate); private: RFM95 *_rfm95; diff --git a/Firmware/lib/RFM95/RFM95.cpp b/Firmware/lib/RFM95/RFM95.cpp index 7be76fb..2461090 100644 --- a/Firmware/lib/RFM95/RFM95.cpp +++ b/Firmware/lib/RFM95/RFM95.cpp @@ -33,6 +33,11 @@ void RFM95::init() pinMode(_NSS, OUTPUT); pinMode(_DIO0, INPUT); + // Set default Datarate Config SF7BW125 + _sf = 0x74; + _bw = 0x72; + _mc = 0x04; + // NSS for starting and stopping communication with the RFM95 module digitalWrite(_NSS, HIGH); @@ -147,6 +152,59 @@ unsigned char RFM95::RFM_Read(unsigned char RFM_Address) return RFM_Data; } +/* +***************************************************************************************** +* Description : Set Datarate and Spreading Factor +* +* Arguments : datarate Lora Datarate Enum (see RFM95.h) +***************************************************************************************** +*/ + +void RFM95::RFM_Set_Datarate(lora_dr_t datarate) { + switch(datarate) { + case SF7BW125: + _sf = 0x74; + _bw = 0x72; + _mc = 0x04; + break; + case SF7BW250: + _sf = 0x74; + _bw = 0x82; + _mc = 0x04; + break; + case SF8BW125: + _sf = 0x84; + _bw = 0x72; + _mc = 0x04; + break; + case SF9BW125: + _sf = 0x94; + _bw = 0x72; + _mc = 0x04; + break; + case SF10BW125: + _sf = 0xA4; + _bw = 0x72; + _mc = 0x04; + break; + case SF11BW125: + _sf = 0xB4; + _bw = 0x72; + _mc = 0x0C; + break; + case SF12BW125: + _sf = 0xC4; + _bw = 0x72; + _mc = 0x0C; + break; + default: + _sf = 0x74; + _bw = 0x72; + _mc = 0x04; + break; + } +} + /* ***************************************************************************************** * Description : Function for sending a package with the RFM @@ -236,9 +294,9 @@ void RFM95::RFM_Send_Package(unsigned char *RFM_Tx_Package, unsigned char Packag //SF7 BW 125 kHz - RFM_Write(0x1E,0x74); //SF7 CRC On - RFM_Write(0x1D,0x72); //125 kHz 4/5 coding rate explicit header mode - RFM_Write(0x26,0x04); //Low datarate optimization off AGC auto on + RFM_Write(0x1E,_sf); //SF7 CRC On + RFM_Write(0x1D,_bw); //125 kHz 4/5 coding rate explicit header mode + RFM_Write(0x26,_mc); //Low datarate optimization off AGC auto on //Set IQ to normal values RFM_Write(0x33,0x27); diff --git a/Firmware/lib/RFM95/RFM95.h b/Firmware/lib/RFM95/RFM95.h index 37d54ae..2b5f164 100644 --- a/Firmware/lib/RFM95/RFM95.h +++ b/Firmware/lib/RFM95/RFM95.h @@ -12,6 +12,17 @@ #include "Arduino.h" +typedef enum lora_dr +{ + SF7BW125, + SF7BW250, + SF8BW125, + SF9BW125, + SF10BW125, + SF11BW125, + SF12BW125, +} lora_dr_t; + class RFM95 { public: @@ -20,9 +31,11 @@ class RFM95 void RFM_Write(unsigned char RFM_Address, unsigned char RFM_Data); unsigned char RFM_Read(unsigned char RFM_Address); void RFM_Send_Package(unsigned char *RFM_Tx_Package, unsigned char Package_Length); + void RFM_Set_Datarate(lora_dr_t datarate); private: int _DIO0; int _NSS; + unsigned char _sf, _bw, _mc; }; diff --git a/Firmware/src/main.cpp b/Firmware/src/main.cpp index 2edb387..2517e0c 100644 --- a/Firmware/src/main.cpp +++ b/Firmware/src/main.cpp @@ -66,6 +66,7 @@ // Global Variable used for deep sleep uint16_t sleep_interval; +#ifdef LED_PIN void blink(uint8_t num) { pinMode(LED_PIN, OUTPUT); digitalWrite(LED_PIN, 0); @@ -75,6 +76,7 @@ void blink(uint8_t num) { } digitalWrite(LED_PIN, 0); } +#endif // Setup Wakeup Interrupt Timer void init_wdt() @@ -158,8 +160,10 @@ void setup() void loop() { // Without Sensor (Beacon Mode) just send the Battery Voltage + // Use less acurate Battery Voltage Reading (100mv Steps) to be + // Compatible with IOT-Usergroup Basenodes #ifdef HAS_NO_SENSOR - int32_t data[1]; + uint8_t data[1]; #endif // Get Sensor Data @@ -175,7 +179,7 @@ void loop() #endif #ifdef HAS_NO_SENSOR - data[0] = readVcc(); + data[0] = (uint8_t)(readVcc()/20); #else data[3] = readVcc(); #endif @@ -187,7 +191,7 @@ void loop() #ifdef RF_LORA // Send LoRa Packet, Increment Frame Counter - lora.Send_Data((unsigned char *)data, sizeof(data), Frame_Counter_Tx); + lora.Send_Data((unsigned char *)data, sizeof(data), Frame_Counter_Tx, SF7BW125); Frame_Counter_Tx++; #endif