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
|
//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
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue