SX1278 library for Arduino: https://github.com/wirelessopensource/lora_shield_arduino/tree/master/libraries/SX1278
receiveAll() timeout can be modified by changing this value in sx1278.h file.
const uint16_t MAX_TIMEOUT = 10000; //10000 msec = 10.0 sec
REG_FEI_MSB and REG_FEI_LSB are defined twice in sx1278.h (FSK, LORA). Warnings in sketch compile can be removed by commenting these lines.
#define REG_FEI_MSB 0x1D
#define REG_FEI_LSB 0x1E
sx1278.cpp
In function uint8_t SX1278::receive() modify line:
// Setting Testmode
writeRegister(0x31,0x43); => writeRegister(0x31,0x3);
[ RegDetectOptimize (0x31)
bits 7-3 Reserved r 0xC0 Reserved
bits 2-0 DetectionOptimize rw 0x03
LoRa Detection Optimize
0x03 -> SF7 to SF12
0x05 -> SF6 ]
Add functions:
void SX1278::setFreq(float f)
{
#if (SX1278_debug_mode > 1)
Serial.println();
Serial.println(F("setFreq"));
Serial.println(bfreq);
#endif
#if (SX1278_debug_mode > 1)
Serial.println(c);
Serial.println(f, DEC);
#endif
byte st0 = readRegister(REG_OP_MODE); // Save the previous status
if( _modem == LORA )
{
// LoRa Stdby mode in order to write in registers
writeRegister(REG_OP_MODE, LORA_STANDBY_MODE);
}
else
{
// FSK Stdby mode in order to write in registers
writeRegister(REG_OP_MODE, FSK_STANDBY_MODE);
}
union freq
{
unsigned long lfreq;
unsigned char cfreq[4];
} uf;
uf.lfreq = (f * 1000000) / 61.035;
writeRegister(REG_FRF_MSB, uf.cfreq[2]);
writeRegister(REG_FRF_MID, uf.cfreq[1]);
writeRegister(REG_FRF_LSB, uf.cfreq[0]);
writeRegister(REG_OP_MODE, st0); // Getting back to previous state
}
float SX1278::getFreq()
{
#if (SX1278_debug_mode > 1)
Serial.println();
Serial.println(F("getFreq"));
#endif
byte fLsb = readRegister(REG_FRF_LSB);
byte fMid = readRegister(REG_FRF_MID);
byte fMsb = readRegister(REG_FRF_MSB);
unsigned long l = fMsb;
l = (l << 8) + fMid;
l = (l << 8) + fLsb;
float f = (l * 61.035) / 1000000;
return f;
}
sx1278.h add lines:
void setFreq(float f);
float getFreq();
Usage:
f<cr> Set module off
oHC<cr> Set module on. H= '1' header on else header off. C='1' crc on else crc off
/*
* https://github.com/wirelessopensource/lora_shield_arduino/tree/master/libraries/SX1278
*
* bw = bandwidth, cr = coding rate, sf = spreading factor
* mode bw cr sf sensitivity (dB)
* 1 125 4/5 12 -134 max range, slow data rate
* 2 250 4/5 12 -131
* 3 125 4/5 10 -129
* 4 500 4/5 12 -128
* 5 250 4/5 10 -126
* 6 500 4/5 11 -125.5
* 7 250 4/5 9 -123
* 8 500 4/5 9 -120
* 9 500 4/5 8 -117
* 10 500 4/5 7 -114 mim range, fast data rate
*/
#include <SX1278.h>
#define rxPacketLen 255
#define serialEndChar 13
#define serialDataLen 6
#define serialSpeed 38400
#define debug_mode 0
float f868[8] = {868.1, 868.3, 868.5, 867.1, 867.5, 867.7, 867.9 // BW 125 kHz
,867.300}; // BW 250 kHz
byte m868[2] = {1, 3};
char rxPacket[rxPacketLen];
int bytesRead;
char serialData[serialDataLen];
bool bON;
bool bScan;
int modeL = 0;
int modeH = 1;
int fL = 0;
int fH = 7;
int fIndex;
int mIndex;
void setup() {
Serial.begin(serialSpeed);
bON = false;
bScan = false;
}
void loop() {
if (Serial.available() > 0) {
bytesRead = Serial.readBytesUntil(serialEndChar, serialData, serialDataLen - 1);
if (bytesRead > 0) {
serialData[bytesRead] = 0;
loraSetup();
memset(serialData, 0, sizeof(serialData));
}
}
if (bScan == true) {
scan();
}
}
void scan() {
int r;
if (fIndex > fH) {
fIndex = fL;
if (mIndex == modeH) {
mIndex = modeL;
}
else {
mIndex += 1;
}
chgMode();
delay(10);
}
sx1278.setFreq(f868[fIndex]);
#if (debug_mode > 0)
Serial.println(F("sx1278.setFreq: "));
Serial.print(f868[fIndex], DEC);
Serial.println();
#endif
delay(10);
rx();
fIndex += 1;
}
void chgMode() {
int r = sx1278.setMode(m868[mIndex]);
#if (debug_mode > 0)
Serial.println(F("sx1278.setMode: "));
Serial.print(r, DEC);
Serial.print("\t");
Serial.print(m868[mIndex], DEC);
Serial.println();
#endif
}
// receiveAll returns 1 if no packets received within timeout. receive() returns "NOT 'RxDone' flag" when
// timeout and no data received
void rx() {
int r = sx1278.receiveAll();
#if (debug_mode > 0)
Serial.print(F("receiveAll: "));
Serial.println(r, DEC);
#endif
if (r == 0) {
for (r = 0; r < sx1278.packet_received.length; r++) {
rxPacket[r] = (char) sx1278.packet_received.data[r];
if (r == rxPacketLen - 1) {
break;
}
}
Serial.println(f868[fIndex], DEC);
Serial.print("\t");
Serial.print(m868[mIndex], DEC);
Serial.println(F("Msg: "));
Serial.print(rxPacket);
Serial.println();
memset(rxPacket, 0, sizeof(rxPacket));
}
}
void loraSetup() {
bScan = false;
int r;
if (serialData[0] == 'f') {
setOFF();
return;
}
if (serialData[0] == 'o') {
if (bON == true) {
setOFF();
delay(100);
}
r = sx1278.ON();
bON = true;
Serial.println(F("sx1278.ON: "));
Serial.print(r, DEC);
Serial.println();
delay(100);
if (strlen(serialData) == 3) {
if (serialData[1] == '1') {
r = sx1278.setHeaderON();
Serial.println(F("sx1278.setHeaderON: "));
}
else {
r = sx1278.setHeaderOFF();
Serial.println(F("sx1278.setHeaderOFF: "));
}
Serial.print(r, DEC);
Serial.println();
if (serialData[2] == '1') {
r = sx1278.setCRC_ON();
Serial.println(F("sx1278.setCRC_ON: "));
}
else {
r = sx1278.setCRC_OFF();
Serial.println(F("sx1278.setCRC_OFF: "));
}
Serial.print(r, DEC);
Serial.println();
fIndex = fL;
mIndex = modeL;
chgMode();
bScan = true;
}
}
}
void setOFF() {
sx1278.OFF();
bON = false;
Serial.println(F("sx1278.OFF"));
Serial.println();
}
Kommentit
Tämän blogin kommentit tarkistetaan ennen julkaisua.