Last active
April 24, 2022 18:07
-
-
Save shadministrator/57764853aa8695333905a33f4d5b0713 to your computer and use it in GitHub Desktop.
Modified Arduino MKRWAN 1300 LoraSendAndReceive.ino example for use with Helium Network
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
Lora Send And Receive | |
This sketch demonstrates how to send and receive data with the MKR WAN 1300/1310 LoRa module. | |
This example code is in the public domain. | |
*/ | |
#include <MKRWAN.h> | |
#include <CayenneLPP.h> | |
DynamicJsonDocument jsonBuffer(4096); | |
CayenneLPP lpp(51); | |
JsonArray root = jsonBuffer.to<JsonArray>(); | |
// My device has the Murata chip so I used this instead of "LoRaModem modem();" | |
LoRaModem modem(Serial1); | |
#include "arduino_secrets.h" | |
// Please enter your sensitive data in the Secret tab or arduino_secrets.h | |
String appEui = SECRET_APP_EUI; | |
String appKey = SECRET_APP_KEY; | |
void setup() { | |
// put your setup code here, to run once: | |
Serial.begin(115200); | |
while (!Serial); | |
// change this to your regional band (eg. US915, AS923, ...) | |
if (!modem.begin(US915)) { | |
Serial.println("Failed to start module"); | |
while (1) {} | |
}; | |
Serial.print("Your module version is: "); | |
Serial.println(modem.version()); | |
Serial.print("Your device EUI is: "); | |
Serial.println(modem.deviceEUI()); | |
// I copied this code for enabling/disabling the channels from hpssjellis on Github (thanks!) | |
Serial.println("Now Disabling all channels and enable channel 1 only for Helium "); | |
modem.disableChannel(0); | |
modem.enableChannel(1); // only one enabled for Helium | |
modem.disableChannel(2); | |
modem.disableChannel(3); | |
modem.disableChannel(4); | |
modem.disableChannel(5); | |
modem.disableChannel(6); | |
delay(3000); | |
Serial.println("Now Joining the Helium Network "); | |
// Device configured as Class C | |
modem.configureClass(CLASS_C); | |
int connected = modem.joinOTAA(appEui, appKey); | |
if (!connected) { | |
Serial.println("Something went wrong; are you indoor? Move near a window and retry"); | |
while (1) {} | |
} | |
// Set poll interval to 60 secs. | |
modem.minPollInterval(60); | |
// NOTE: independently by this setting the modem will | |
// not allow to send more than one message every 2 minutes, | |
// this is enforced by firmware and can not be changed. | |
} | |
void loop() { | |
Serial.println(); | |
Serial.println("Enter a message to send to network"); | |
Serial.println("(make sure that end-of-line 'NL' is enabled)"); | |
while (!Serial.available()); | |
String msg = Serial.readStringUntil('\n'); | |
Serial.println(); | |
Serial.print("Sending: " + msg + " - "); | |
for (unsigned int i = 0; i < msg.length(); i++) { | |
Serial.print(msg[i] >> 4, HEX); | |
Serial.print(msg[i] & 0xF, HEX); | |
Serial.print(" "); | |
} | |
Serial.println(); | |
// Code for adding payload to Cayenne LPP packet. Using temperature as an example. Input a numerical value for the message in the serial monitor. | |
lpp.reset(); | |
lpp.addTemperature(1, msg.toInt()); | |
lpp.decode(lpp.getBuffer(), lpp.getSize(), root); | |
serializeJsonPretty(root, Serial); | |
Serial.println(); | |
int err; | |
modem.beginPacket(); | |
// Using modem.write instead of modem.print in the original LoraSendAndReceive example becuase we are passing a buffer of bytes. | |
modem.write(lpp.getBuffer(), lpp.getSize()); | |
err = modem.endPacket(true); | |
if (err > 0) { | |
Serial.println("Message sent correctly!"); | |
} else { | |
Serial.println("Error sending message :("); | |
Serial.println("(you may send a limited amount of messages per minute, depending on the signal strength"); | |
Serial.println("it may vary from 1 message every couple of seconds to 1 message every minute)"); | |
} | |
delay(1000); | |
if (!modem.available()) { | |
Serial.println("No downlink message received at this time."); | |
return; | |
} | |
char rcv[64]; | |
int i = 0; | |
while (modem.available()) { | |
rcv[i++] = (char)modem.read(); | |
} | |
Serial.print("Received: "); | |
for (unsigned int j = 0; j < i; j++) { | |
Serial.print(rcv[j] >> 4, HEX); | |
Serial.print(rcv[j] & 0xF, HEX); | |
Serial.print(" "); | |
} | |
Serial.println(); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment