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
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
*/

View File

@ -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;

View File

@ -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);

View File

@ -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;
};

View File

@ -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