Add ability to set Datarate
This commit is contained in:
parent
2e430f2c03
commit
68697a4b19
|
@ -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
|
||||
*/
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
};
|
||||
|
||||
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
Loading…
Reference in New Issue