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
}

kuvaa.jpg