Skip to content

Instantly share code, notes, and snippets.

@shadministrator
Last active April 24, 2022 18:07
Show Gist options
  • Save shadministrator/57764853aa8695333905a33f4d5b0713 to your computer and use it in GitHub Desktop.
Save shadministrator/57764853aa8695333905a33f4d5b0713 to your computer and use it in GitHub Desktop.
Modified Arduino MKRWAN 1300 LoraSendAndReceive.ino example for use with Helium Network
/*
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