LoRa Serial Passthrough
For many network you will need the hardware eui to register your device on their network.
Replace [x] with your own keys.
Command | Action |
sys reset | Will reset the module and shows the version on the module |
sys get ver | Firmware version of the RN2XX3 module |
sys get hweui | Get the hardware eui |
mac set devaddr [x] | Set the device address |
mac set nwkskey [x] | Set the network session key |
mac set appskey [x] | Set the application session key |
mac join abp | Join the network with personalized keys |
mac tx uncnf 1 01 | Send the hexadeciamal message “01” unconfirmed on port 1 |
Full command set: http://ww1.microchip.com/downloads/en/DeviceDoc/40001784B.pdf
/* * Compatible with: * SODAQ MBILI * SODAQ Autonomo * SODAQ ONE * SODAQ ONE BETA * SODAQ EXPLORER */ #include "Arduino.h" #if defined(ARDUINO_AVR_SODAQ_MBILI) #define debugSerial Serial #define loraSerial Serial1 #elif defined(ARDUINO_SODAQ_AUTONOMO) || defined(ARDUINO_SODAQ_ONE) || defined(ARDUINO_SODAQ_ONE_BETA) #define debugSerial SerialUSB #define loraSerial Serial1 #elif defined(ARDUINO_SODAQ_EXPLORER) #define debugSerial SerialUSB #define loraSerial Serial2 #else // please select a sodaq board #endif void setup() { // Enable LoRa module #if defined(ARDUINO_SODAQ_AUTONOMO) pinMode(BEE_VCC, OUTPUT); digitalWrite(BEE_VCC, HIGH); //set input power BEE high #elif defined(ARDUINO_AVR_SODAQ_MBILI) pinMode(20, OUTPUT); digitalWrite(20, HIGH); //set input power BEE high #endif // Hard reset the RN module #if defined(LORA_RESET) pinMode(LORA_RESET, OUTPUT); digitalWrite(LORA_RESET, LOW); delay(100); digitalWrite(LORA_RESET, HIGH); delay(100); #endif while ((!debugSerial) && (millis() < 10000)){ // wait 10 seconds for serial monitor } debugSerial.begin(57600); loraSerial.begin(57600); debugSerial.println("Please send command"); } void loop() { //send and receive data with serial if (debugSerial.available()){ //debugSerial.print("SEND: "); while (debugSerial.available()) { uint8_t inChar = debugSerial.read(); //debugSerial.write(inChar); loraSerial.write(inChar); } } if (loraSerial.available()){ //debugSerial.print("RECEIVE: "); while (loraSerial.available()) { uint8_t inChar = loraSerial.read(); debugSerial.write(inChar); } } }
Simple LoRa sketch
Install the required libraries from the Arduino library manager.
Sketch -> Include library -> Manage libraries…
Install “Sodaq_RN2483” and “Sodaq_wdt”
/* * Compatible with: * SODAQ MBILI * SODAQ Autonomo * SODAQ ONE * SODAQ ONE BETA * SODAQ EXPLORER */ #include "Arduino.h" #include <Sodaq_RN2483.h> #define debugSerial SERIAL_PORT_MONITOR #if defined(ARDUINO_AVR_SODAQ_MBILI) #define loraSerial Serial1 #define BEE_VCC 20 #elif defined(ARDUINO_SODAQ_AUTONOMO) || defined(ARDUINO_SODAQ_ONE) || defined(ARDUINO_SODAQ_ONE_BETA) #define loraSerial Serial1 #elif defined(ARDUINO_SODAQ_EXPLORER) #define loraSerial Serial2 #else // please select a sodaq board debugSerial.println("Please select a sodaq board!!"); #endif // ABP const uint8_t devAddr[4] = { 0x00, 0x00, 0x00, 0x00 }; const uint8_t appSKey[16] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; const uint8_t nwkSKey[16] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; // OTAA uint8_t DevEUI[8] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; uint8_t AppEUI[8] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; uint8_t AppKey[16] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; void setupLoRaABP(){ if (LoRaBee.initABP(loraSerial, devAddr, appSKey, nwkSKey, false)) { debugSerial.println("Communication to LoRaBEE successful."); } else { debugSerial.println("Communication to LoRaBEE failed!"); } } void setupLoRaOTAA(){ if (LoRaBee.initOTA(loraSerial, DevEUI, AppEUI, AppKey, false)) { debugSerial.println("Communication to LoRaBEE successful."); } else { debugSerial.println("OTAA Setup failed!"); } } void setup() { //Power up the LoRaBEE #if defined(ARDUINO_AVR_SODAQ_MBILI) || defined(ARDUINO_SODAQ_AUTONOMO) pinMode(BEE_VCC, OUTPUT); digitalWrite(BEE_VCC, HIGH); #endif delay(3000); while ((!SerialUSB) && (millis() < 10000)){ // Wait 10 seconds for the Serial Monitor } //Set baud rate debugSerial.begin(57600); loraSerial.begin(LoRaBee.getDefaultBaudRate()); // Debug output from LoRaBee // LoRaBee.setDiag(debugSerial); // optional //connect to the LoRa Network setupLoRa(); } void setupLoRa(){ // ABP // setupLoRaABP(); // OTAA setupLoRaOTAA(); LoRaBee.setSpreadingFactor(9); } void sendPacket(String packet){ switch (LoRaBee.send(1, (uint8_t*)packet.c_str(), packet.length())) { case NoError: debugSerial.println("Successful transmission."); break; case NoResponse: debugSerial.println("There was no response from the device."); setupLoRa(); break; case Timeout: debugSerial.println("Connection timed-out. Check your serial connection to the device! Sleeping for 20sec."); delay(20000); break; case PayloadSizeError: debugSerial.println("The size of the payload is greater than allowed. Transmission failed!"); break; case InternalError: debugSerial.println("Oh No! This shouldn't happen. Something is really wrong! Try restarting the device!\r\nThe network connection will reset."); setupLoRa(); break; case Busy: debugSerial.println("The device is busy. Sleeping for 10 extra seconds."); delay(10000); break; case NetworkFatalError: debugSerial.println("There is a non-recoverable error with the network connection. You should re-connect.\r\nThe network connection will reset."); setupLoRa(); break; case NotConnected: debugSerial.println("The device is not connected to the network. Please connect to the network before attempting to send data.\r\nThe network connection will reset."); setupLoRa(); break; case NoAcknowledgment: debugSerial.println("There was no acknowledgment sent back!"); // When you this message you are probaly out of range of the network. break; default: break; } } void loop() { // put your main code here, to run repeatedly: String packet = "SODAQ"; sendPacket(packet); delay(5000); }
Peer-to-peer