In Finland Digita operates LoraWAN network (ISM 868 MHz) which covers quite a large geographical area.
Finnish LoraWAN radio coverage map: https://www.digita.fi/yrityksille/iot/iot_lorawan-verkon_peittokartta
Hardware: Arduino and Semtech SX1278 shield for the Arduino. Install SX1278 library for the Arduino and do some modifications: https://teknokoodiradio.vuodatus.net/lue/2017/03/arduino-lora-868-mhz
Also add some lines of code in method sx1278.setMode (switch case structure)
/*
setMode switch-case
case 11: setCR(CR_5); // CR = 4/5
setSF(SF_7); // SF = 7
setBW(BW_125); // BW = 125 KHz
break;
// mode 12
case 12: setCR(CR_5); // CR = 4/5
setSF(SF_8); // SF = 8
setBW(BW_125); // BW = 125 KHz
break;
// mode 13
case 13: setCR(CR_5); // CR = 4/5
setSF(SF_9); // SF = 9
setBW(BW_125); // BW = 125 KHz
break;
// mode 14
case 14: setCR(CR_5); // CR = 4/5
setSF(SF_10); // SF = 10
setBW(BW_125); // BW = 125 KHz
break;
// mode 15
case 15: setCR(CR_5); // CR = 4/5
setSF(SF_11); // SF = 11
setBW(BW_125); // BW = 125 KHz
break;
*/
/*
* 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
* 11 125 4/5 7
* 12 125 4/5 8
* 13 125 4/5 9
* 14 125 4/5 10
* 15 125 4/5 11
*/
/*
Set mode additions
case 11: setCR(CR_5); // CR = 4/5
setSF(SF_7); // SF = 7
setBW(BW_125); // BW = 125 KHz
break;
// mode 12
case 12: setCR(CR_5); // CR = 4/5
setSF(SF_8); // SF = 8
setBW(BW_125); // BW = 125 KHz
break;
// mode 13
case 13: setCR(CR_5); // CR = 4/5
setSF(SF_9); // SF = 9
setBW(BW_125); // BW = 125 KHz
break;
// mode 14
case 14: setCR(CR_5); // CR = 4/5
setSF(SF_10); // SF = 10
setBW(BW_125); // BW = 125 KHz
break;
// mode 15
case 15: setCR(CR_5); // CR = 4/5
setSF(SF_11); // SF = 11
setBW(BW_125); // BW = 125 KHz
break;
*/
#include <SX1278.h>
#define rxPacketLen 255
#define serialSpeed 9600
#define debug_mode 0
#define show_modem_stat 0
#define loraFreq 7
float f868[8] = {868.1, 868.3, 868.5, 867.1, 867.5, 867.7, 867.9, 869.525};
char rxPacket[rxPacketLen];
uint8_t loraMode = 11; // SF7 BW 125 kHz
void setup() {
Serial.begin(serialSpeed);
sx1278.OFF();
delay(20);
sx1278.ON();
Serial.println(F("sx1278.ON"));
delay(20);
sx1278.setCRC_OFF();
sx1278.setFreq(f868[loraFreq]);
chgMode(loraMode);
Serial.println(f868[loraFreq], DEC);
Serial.println();
}
// receiveAll returns 1 if no packets received within timeout. receive() returns "NOT 'RxDone' flag" when
// timeout and no data received
void loop() {
int r = sx1278.receiveAll();
#if (debug_mode > 0)
Serial.println();
Serial.print(F("receiveAll: "));
Serial.println(r, DEC);
#endif
#if (show_modem_stat == 1)
int modemStat = sx1278.readRegister(REG_MODEM_STAT);
Serial.print(F("Modem status: "));
Serial.println(modemStat, DEC);
#endif
if (r == 0) {
Serial.println();
for (r = 0; r < sx1278.packet_received.length; r++) {
Serial.print(sx1278.packet_received.data[r], HEX);
rxPacket[r] = (char) sx1278.packet_received.data[r];
if (r == rxPacketLen - 1) {
break;
}
}
Serial.println();
Serial.println(f868[loraFreq], DEC);
Serial.println(F("Msg: "));
Serial.print(rxPacket);
memset(rxPacket, 0, sizeof(rxPacket));
}
}
void chgMode(int m) {
int r = sx1278.setMode(m);
#if (debug_mode > 0)
Serial.print(F("sx1278.setMode result "));
Serial.print(r, DEC);
Serial.print(F(" value "));
Serial.print(m, DEC);
Serial.println();
#endif
}
void setOFF() {
sx1278.OFF();
Serial.println(F("sx1278.OFF"));
Serial.println();
}
Kommentit
Tämän blogin kommentit tarkistetaan ennen julkaisua.