Created
December 19, 2017 19:51
-
-
Save opless/a050d63ba057726a49a0a7ae329765c1 to your computer and use it in GitHub Desktop.
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 Duplex communication | |
Sends a message every half second, and polls continually | |
for new incoming messages. Implements a one-byte addressing scheme, | |
with 0xFF as the broadcast address. | |
Uses readString() from Stream class to read payload. The Stream class' | |
timeout may affect other functuons, like the radio's callback. For an | |
created 28 April 2017 | |
by Tom Igoe | |
*/ | |
#include <SPI.h> // include libraries | |
#include <LoRa.h> | |
#include <U8x8lib.h> | |
const int csPin = 18; // LoRa radio chip select | |
const int resetPin = 14; // LoRa radio reset | |
const int irqPin = 26; // change for your board; must be a hardware interrupt pin | |
String outgoing; // outgoing message | |
byte msgCount = 0; // count of outgoing messages | |
byte localAddress = 0xBB; // address of this device | |
byte destination = 0xFF; // destination to send to | |
long lastSendTime = 0; // last send time | |
int interval = 2000; // interval between sends | |
U8X8_SSD1306_128X64_NONAME_SW_I2C u8x8(/* clock=*/ 15, /* data=*/ 4, /* reset=*/ 16); | |
void setup() { | |
Serial.begin(115200); // initialize serial | |
while (!Serial); | |
Serial.println("LoRa Duplex"); | |
u8x8.begin(); | |
u8x8.setFont(u8x8_font_chroma48medium8_r); | |
Serial.println("LoRa Receiver"); | |
u8x8.drawString(0, 1, "LoRa Receiver"); | |
// override the default CS, reset, and IRQ pins (optional) | |
LoRa.setPins(csPin, resetPin, irqPin);// set CS, reset, IRQ pin | |
if (!LoRa.begin(8695E5)) { // initialize ratio at 868 MHz | |
Serial.println("LoRa init failed. Check your connections."); | |
u8x8.drawString(0, 1, "Starting LoRa failed!"); | |
while (true); // if failed, do nothing | |
} | |
Serial.println("LoRa init succeeded."); | |
} | |
void loop() { | |
if (millis() - lastSendTime > interval) { | |
String m = "HeLoRa World! %"; | |
String message = m + lastSendTime; // send a message | |
sendMessage(message); | |
Serial.println("Sending " + message); | |
lastSendTime = millis(); // timestamp the message | |
interval = 500; //random(2000) + 1000; // 2-3 seconds | |
} | |
// parse for a packet, and call onReceive with the result: | |
onReceive(LoRa.parsePacket()); | |
} | |
void sendMessage(String outgoing) { | |
LoRa.beginPacket(); // start packet | |
LoRa.write(destination); // add destination address | |
LoRa.write(localAddress); // add sender address | |
LoRa.write(msgCount); // add message ID | |
LoRa.write(outgoing.length()); // add payload length | |
LoRa.print(outgoing); // add payload | |
LoRa.endPacket(); // finish packet and send it | |
msgCount++; // increment message ID | |
} | |
void onReceive(int packetSize) { | |
if (packetSize == 0) return; // if there's no packet, return | |
// read packet header bytes: | |
int recipient = LoRa.read(); // recipient address | |
byte sender = LoRa.read(); // sender address | |
byte incomingMsgId = LoRa.read(); // incoming msg ID | |
byte incomingLength = LoRa.read(); // incoming msg length | |
String incoming = ""; | |
while (LoRa.available()) { | |
incoming += (char)LoRa.read(); | |
} | |
if (incomingLength != incoming.length()) { // check length for error | |
Serial.println("error: message length does not match length"); | |
return; // skip rest of function | |
} | |
// if the recipient isn't this device or broadcast, | |
if (recipient != localAddress && recipient != 0xFF) { | |
Serial.println("This message is not for me."); | |
return; // skip rest of function | |
} | |
// if message is for this device, or broadcast, print details: | |
Serial.println("Received from: 0x" + String(sender, HEX)); | |
Serial.println("Sent to: 0x" + String(recipient, HEX)); | |
Serial.println("Message ID: " + String(incomingMsgId)); | |
Serial.println("Message length: " + String(incomingLength)); | |
Serial.println("Message: " + incoming); | |
Serial.println("RSSI: " + String(LoRa.packetRssi())); | |
Serial.println("Snr: " + String(LoRa.packetSnr())); | |
Serial.println(); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment