Decimals, strings, and LoRa

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