small update to code of post #42 to include Node ID and a packet sequence number (to check for lost packets) in the transmitted data structure
sender (node modified for 32u4 pins and frequency 868mHz)
// Lora transmit Node using Feather 32u4
#include <SPI.h>
#include <LoRa.h>
#define nodeID 2 // <<< set up required node ID
struct Data {
int NodeID; // ID of transmitting node
int seq; // sequence number
int x;
float y;
char z[10];
};
Data data={nodeID, 0, 1 , 4.5, "hello"};
void setup() {
Serial.begin(115200);
while (!Serial);
Serial.println("LoRa Sender");
// LoRa.setPins(10, 9, 2); // 10 for UNO, 53 for Mega
// if (!LoRa.begin(433E6)) {
LoRa.setPins(8,4,7); // for Lora 32u4
if (!LoRa.begin(866E6)) {
Serial.println("Starting LoRa failed!");
while (1);
}
LoRa.onTxDone(onTxDone);
}
void loop() {
// put your main code here, to run repeatedly:
if (runEvery(1000)) { // repeat every 1000 millis
sendMessage(); // send a message
}
}
void LoRa_txMode(){
LoRa.idle(); // set standby mode
LoRa.disableInvertIQ(); // normal mode
}
void sendMessage() {
LoRa_txMode(); // set tx mode
LoRa.beginPacket(); // start packet
LoRa.write((byte *)&data, sizeof(data)); // transmit packet
// display packet contents
//for (unsigned int i = 0; i < sizeof(Data);i++) {
// Serial.print(' ');
//LoRa.write(((byte *) &data)[i]);
// Serial.print(((byte *) &data)[i]);
//}
LoRa.endPacket(true); // finish packet and send it
data.seq++;
data.x += 1;
data.y += 1;
data.z[0] += 1;
}
void onTxDone() {
Serial.print("Node "); Serial.print(nodeID);
Serial.print(" TxDone seq number "); Serial.println(data.seq);
}
boolean runEvery(unsigned long interval)
{
static unsigned long previousMillis = 0;
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval*nodeID)
{
previousMillis = currentMillis;
return true;
}
return false;
}
receiver using a UNO with Lora 868MHz shield
// Lora receiver using Arduino UNO with Lora shield
#include <SPI.h>
#include <LoRa.h>
struct Data {
int NodeID; // ID of transmitting node
int seq; // sequence number
int x;
float y;
char z[10];
} data;
void setup() {
Serial.begin(115200);
while (!Serial);
Serial.println("LoRa Receiver");
LoRa.setPins(10, 9, 2); // 10 for UNO, 53 for Mega
// if (!LoRa.begin(433E6)) {
// LoRa.setPins(8,4,7); // for Lora 32u4
if (!LoRa.begin(866E6)) {
Serial.println("Starting LoRa failed!");
Serial.println("Lora Receiver started");
while (1);
}
LoRa.onReceive(onReceive);
LoRa_rxMode();
}
void loop() {
}
void LoRa_rxMode(){
LoRa.disableInvertIQ(); // normal mode
LoRa.receive(); // set receive mode
}
void onReceive(int packetSize) {
LoRa.readBytes((byte *)&data, packetSize); // receive packet
// display packet
// while (LoRa.available())
//for (int i = 0; i < packetSize; i++) {
// ((byte *) &data)[i] = LoRa.read();
// Serial.print(' ');
// Serial.print(((byte *) &data)[i]);
// }
Serial.print("\n Lora receive RSSI ");
Serial.print(LoRa.packetRssi());
Serial.print(" from Node "); Serial.print(data.NodeID);
Serial.print(" seq number "); Serial.print(data.seq);
Serial.print(" x = "); Serial.print(data.x);
Serial.print(" y = "); Serial.print(data.y);
Serial.print(" z = "); Serial.print(data.z);
}
a run a the transmitter NodeID 2 looks like
LoRa Sender
Node 2 TxDone seq number 1
Node 2 TxDone seq number 2
Node 2 TxDone seq number 3
Node 2 TxDone seq number 4
Node 2 TxDone seq number 5
the receiver looks like - three Feather 32u4 devices are transmitting to a UNO with a Lora shield
Lora receive RSSI -35 from Node 2 seq number 129 x = 130 y = 133.50 z = ⸮ello
Lora receive RSSI -86 from Node 1 seq number 192 x = 193 y = 196.50 z = (ello
Lora receive RSSI -34 from Node 3 seq number 255 x = 256 y = 259.50 z = gello
Lora receive RSSI -86 from Node 1 seq number 193 x = 194 y = 197.50 z = )ello
Lora receive RSSI -35 from Node 2 seq number 130 x = 131 y = 134.50 z = ⸮ello
Lora receive RSSI -86 from Node 1 seq number 194 x = 195 y = 198.50 z = *ello
Lora receive RSSI -86 from Node 1 seq number 195 x = 196 y = 199.50 z = +ello
Lora receive RSSI -34 from Node 3 seq number 256 x = 257 y = 260.50 z = hello
Lora receive RSSI -35 from Node 2 seq number 131 x = 132 y = 135.50 z = ⸮ello
Lora receive RSSI -85 from Node 1 seq number 196 x = 197 y = 200.50 z = ,ello
Lora receive RSSI -87 from Node 1 seq number 197 x = 198 y = 201.50 z = -ello
Lora receive RSSI -35 from Node 2 seq number 132 x = 133 y = 136.50 z = ⸮ello
Lora receive RSSI -88 from Node 1 seq number 198 x = 199 y = 202.50 z = .ello
Lora receive RSSI -34 from Node 3 seq number 257 x = 258 y = 261.50 z = iello
Lora receive RSSI -88 from Node 1 seq number 199 x = 200 y = 203.50 z = /ello
Lora receive RSSI -35 from Node 2 seq number 133 x = 134 y = 137.50 z = ⸮ello
Lora receive RSSI -88 from Node 1 seq number 200 x = 201 y = 204.50 z = 0ello
Lora receive RSSI -88 from Node 1 seq number 201 x = 202 y = 205.50 z = 1ello
Lora receive RSSI -34 from Node 3 seq number 258 x = 259 y = 262.50 z = jello
Lora receive RSSI -35 from Node 2 seq number 134 x = 135 y = 138.50 z = ⸮ello
the transmittion interval depends on the nodeID
if (currentMillis - previousMillis >= interval*nodeID)
node 1 is interval, node 2 is interval*2, etc etc