Add ability to set Datarate

This commit is contained in:
seiichiro 2020-01-20 13:43:37 +01:00
parent 2e430f2c03
commit 68697a4b19
5 changed files with 85 additions and 13 deletions

View file

@ -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 //Define variables
unsigned char i; unsigned char i;
@ -66,7 +66,6 @@ void LoRaWAN::Send_Data(unsigned char *Data, unsigned char Data_Length, unsigned
111 (0xE0) Proprietary 111 (0xE0) Proprietary
*/ */
// Unconfirmed data up // Unconfirmed data up
unsigned char Mac_Header = 0x40; 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 the data
Encrypt_Payload(Data, Data_Length, Frame_Counter_Tx, Direction); Encrypt_Payload(Data, Data_Length, Frame_Counter_Tx, Direction);
//Build the Radio Package //Build the Radio Package
RFM_Data[0] = Mac_Header; 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 //Add MIC length to RFM package length
RFM_Package_Length = RFM_Package_Length + 4; RFM_Package_Length = RFM_Package_Length + 4;
//Set Lora Datarate
_rfm95->RFM_Set_Datarate(datarate);
//Send Package //Send Package
_rfm95->RFM_Send_Package(RFM_Data, RFM_Package_Length); _rfm95->RFM_Send_Package(RFM_Data, RFM_Package_Length);
} }
/* /*
Encryption stuff after this line Encryption stuff after this line
*/ */

View file

@ -40,7 +40,7 @@ class LoRaWAN
public: public:
LoRaWAN(RFM95 &rfm95); LoRaWAN(RFM95 &rfm95);
void setKeys(unsigned char NwkSkey[], unsigned char AppSkey[], unsigned char DevAddr[]); 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: private:
RFM95 *_rfm95; RFM95 *_rfm95;

View file

@ -33,6 +33,11 @@ void RFM95::init()
pinMode(_NSS, OUTPUT); pinMode(_NSS, OUTPUT);
pinMode(_DIO0, INPUT); pinMode(_DIO0, INPUT);
// Set default Datarate Config SF7BW125
_sf = 0x74;
_bw = 0x72;
_mc = 0x04;
// NSS for starting and stopping communication with the RFM95 module // NSS for starting and stopping communication with the RFM95 module
digitalWrite(_NSS, HIGH); digitalWrite(_NSS, HIGH);
@ -147,6 +152,59 @@ unsigned char RFM95::RFM_Read(unsigned char RFM_Address)
return RFM_Data; 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 * 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 //SF7 BW 125 kHz
RFM_Write(0x1E,0x74); //SF7 CRC On RFM_Write(0x1E,_sf); //SF7 CRC On
RFM_Write(0x1D,0x72); //125 kHz 4/5 coding rate explicit header mode RFM_Write(0x1D,_bw); //125 kHz 4/5 coding rate explicit header mode
RFM_Write(0x26,0x04); //Low datarate optimization off AGC auto on RFM_Write(0x26,_mc); //Low datarate optimization off AGC auto on
//Set IQ to normal values //Set IQ to normal values
RFM_Write(0x33,0x27); RFM_Write(0x33,0x27);

View file

@ -12,6 +12,17 @@
#include "Arduino.h" #include "Arduino.h"
typedef enum lora_dr
{
SF7BW125,
SF7BW250,
SF8BW125,
SF9BW125,
SF10BW125,
SF11BW125,
SF12BW125,
} lora_dr_t;
class RFM95 class RFM95
{ {
public: public:
@ -20,9 +31,11 @@ class RFM95
void RFM_Write(unsigned char RFM_Address, unsigned char RFM_Data); void RFM_Write(unsigned char RFM_Address, unsigned char RFM_Data);
unsigned char RFM_Read(unsigned char RFM_Address); unsigned char RFM_Read(unsigned char RFM_Address);
void RFM_Send_Package(unsigned char *RFM_Tx_Package, unsigned char Package_Length); void RFM_Send_Package(unsigned char *RFM_Tx_Package, unsigned char Package_Length);
void RFM_Set_Datarate(lora_dr_t datarate);
private: private:
int _DIO0; int _DIO0;
int _NSS; int _NSS;
unsigned char _sf, _bw, _mc;
}; };

View file

@ -66,6 +66,7 @@
// Global Variable used for deep sleep // Global Variable used for deep sleep
uint16_t sleep_interval; uint16_t sleep_interval;
#ifdef LED_PIN
void blink(uint8_t num) { void blink(uint8_t num) {
pinMode(LED_PIN, OUTPUT); pinMode(LED_PIN, OUTPUT);
digitalWrite(LED_PIN, 0); digitalWrite(LED_PIN, 0);
@ -75,6 +76,7 @@ void blink(uint8_t num) {
} }
digitalWrite(LED_PIN, 0); digitalWrite(LED_PIN, 0);
} }
#endif
// Setup Wakeup Interrupt Timer // Setup Wakeup Interrupt Timer
void init_wdt() void init_wdt()
@ -158,8 +160,10 @@ void setup()
void loop() void loop()
{ {
// Without Sensor (Beacon Mode) just send the Battery Voltage // 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 #ifdef HAS_NO_SENSOR
int32_t data[1]; uint8_t data[1];
#endif #endif
// Get Sensor Data // Get Sensor Data
@ -175,7 +179,7 @@ void loop()
#endif #endif
#ifdef HAS_NO_SENSOR #ifdef HAS_NO_SENSOR
data[0] = readVcc(); data[0] = (uint8_t)(readVcc()/20);
#else #else
data[3] = readVcc(); data[3] = readVcc();
#endif #endif
@ -187,7 +191,7 @@ void loop()
#ifdef RF_LORA #ifdef RF_LORA
// Send LoRa Packet, Increment Frame Counter // 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++; Frame_Counter_Tx++;
#endif #endif