Draginon Semtech SX127x (Lora, xFSK, OOK, http://www.semtech.com/images/datasheet/sx1276_77_78_79.pdf) Arduino shieldejä (http://wiki.dragino.com/index.php?title=Lora_Shield) saa ebaystä parilla kympillä.
Pienellä pätkällä Arduino koodia voi vaikkapa skannata Lora kanavia. SX1278 kirjaston funktio receiveAll <MAX_TIMEOUT> vastaanottaa kaikki paketit. MAX_TIMEOUT arvoa voi säätää muuttamalla sx1278.h tiedostossa riviä:
const uint16_t MAX_TIMEOUT = 10000; //10000 msec = 10.0 sec
f <cr> asettaa modulin off tilaan
oPCM<cr> skannaa kanavia. P: '1'=packet on, '0' = off. C: '1' = CRC on, '0' = CRC OFF, M: '1' = skannataan BW 125 kHz kanavat, '2' = skannataan BW 250 kHz kanavat, '3' = skannataan BW 500 kHz kanavat. Esim. o111<cr>
/*
* 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 240
#define serialEndChar 13
#define serialDataLen 6
#define serialSpeed 38400
#define debug_mode 1
uint32_t ch433[22] = {0x6c4745, 0x6c4fe1, 0x6c587c, 0x6c6118, 0x6c69b3, 0x6c724f, 0x6c7af3, 0x6c8397, 0x6c8c32, 0x6c94ce, 0x6c9d6a, 0x6ca605, 0x6caea1 // BW 125 kHz channels. Modes 1,3
,0x6c4b45, 0x6c5e57, 0x6c716a, 0x6c847c, 0x6c978f, 0x6caaa1 // BW 250 kHz channels. Modes 2,5,7
,0x6c5345, 0x6c7af3, 0x6ca2a1}; // BW 500 kHz channels. Modes 4,6,8,9,10
float f433[22] = {433.1125, 433.247, 433.3815, 433.516, 433.6505, 433.785, 433.92, 434.055, 434.1895, 434.324, 434.4585, 434.593, 434.7275
,433.175, 433.473, 433.771, 434.069, 434.367, 434.665
,433.3, 433.92, 434.54};
byte m433[10] = {1, 3
,2, 5, 7
,4, 6, 8, 9, 10};
char rxPacket[rxPacketLen];
int bytesRead;
char serialData[serialDataLen];
bool bON;
bool bScan;
int modeL;
int modeH;
int channelL;
int channelH;
int cIndex;
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 (cIndex > channelH) {
cIndex = channelL;
if (mIndex == modeH) {
mIndex = modeL;
}
else {
mIndex += 1;
}
chgMode();
delay(10);
}
r = sx1278.setChannel(ch433[cIndex]);
#if (debug_mode > 0)
Serial.println(F("sx1278.setChannel: "));
Serial.print(r, DEC);
Serial.print("\t");
Serial.print(ch433[cIndex], HEX);
Serial.print("\t");
Serial.print(f433[cIndex]);
Serial.println();
#endif
delay(10);
rx();
cIndex += 1;
}
void chgMode() {
int r = sx1278.setMode(m433[mIndex]);
#if (debug_mode > 0)
Serial.println(F("sx1278.setMode: "));
Serial.print(r, DEC);
Serial.print("\t");
Serial.print(m433[mIndex], DEC);
Serial.println();
#endif
}
void rx() {
int r = sx1278.receiveAll();
Serial.print(F("receiveAll: "));
Serial.println(r, DEC);
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(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;
#if (debug_mode > 0)
Serial.println(F("sx1278.ON: "));
Serial.print(r, DEC);
Serial.println();
#endif
delay(100);
if (strlen(serialData) == 4) {
if (serialData[1] == '1') {
r = sx1278.setHeaderON();
#if (debug_mode > 0)
Serial.println(F("sx1278.setHeaderON: "));
#endif
}
else {
r = sx1278.setHeaderOFF();
#if (debug_mode > 0)
Serial.println(F("sx1278.setHeaderOFF: "));
#endif
}
#if (debug_mode > 0)
Serial.print(r, DEC);
Serial.println();
#endif
if (serialData[2] == '1') {
r = sx1278.setCRC_ON();
#if (debug_mode > 0)
Serial.println(F("sx1278.setCRC_ON: "));
#endif
}
else {
r = sx1278.setCRC_OFF();
#if (debug_mode > 0)
Serial.println(F("sx1278.setCRC_OFF: "));
#endif
}
#if (debug_mode > 0)
Serial.print(r, DEC);
Serial.println();
#endif
int scanMode = serialData[3] - '0';
switch (scanMode) {
case 1:
modeL = 0;
modeH = 1;
channelL = 0;
channelH = 12;
break;
case 2:
modeL = 2;
modeH = 4;
channelL = 13;
channelH = 18;
break;
case 3:
modeL = 5;
modeH = 9;
channelL = 19;
channelH = 21;
break;
default:
modeL = 0;
modeH = 1;
channelL = 0;
channelH = 12;
break;
}
cIndex = channelL;
mIndex = modeL;
chgMode();
bScan = true;
}
}
}
void setOFF() {
sx1278.OFF();
bON = false;
#if (debug_mode > 0)
Serial.println(F("sx1278.OFF"));
Serial.println();
#endif
}
Kommentit
Tämän blogin kommentit tarkistetaan ennen julkaisua.