Anomalous LoRa Duinotech Shield

Yet another post in the ongoing saga.
For months I have struggled to get the " callback " function of the LoRa .h working.
I have been unable to get any of the " example " call backs to work.
One Way transmission TX to RX and RX to TX works just fine but I just cannot get the
Rx to TX " callback function to work.
I have " cut and pasted" several sketches I have found and now finally have a functioning
program which does exactly as I require, but I have no idea how or why it works.
I have attached an example of part of the code in the hope that someone might be able to
offer a reason for the following anomalies;

  1. TX code. The callback function only works if I use a MILLIS timing loop with an INTERVAL
    greater than 1999.
    If I use a DELAY the TX works, however I get no callback.

  2. RX code. Unless I use the " VOID CURRENT" I will not get the CALLBACK to work.

I hope someone can offer some relevant and helpful response.

ty//.................................................................   TX SENDER   ..........................................

#include <SPI.h>
#include <LoRa.h>

//................................................................   LORA ADDRESSES   .............SENDER
byte localAddress = 0xAA;
byte destinationAddress = 0xBB;
long lastSendTime = 0;
unsigned int interval = 0;

//................................................................   VARIABLES
int count = 0; unsigned int staT  = 220; //   OUTGOING
int countRec = 0; long int staTRec  = 0; //   INCOMING
int statioN  = 0;  // STATION NUMBER 22 to 33
int onofF    = 0;  // 0 = ON ... 1 = OFF

//________________________________________________________________________________________________________________
//_______________________________________________________________________________________   VOID SETUP  __________SENDER
void setup() {
  Serial.begin(9600);

  //.............................................................   STARTING LORA   ....................
  Serial.println("Start LoRa duplex  TX  Sender");
  if (!LoRa.begin(915E6)) {
    Serial.println("LoRa init failed. Check your connections.");
    while (true) {}
  }
}

//..............................................................   VOID SENDING DATA   ...........................SENDER
void senddatA()
{
  if (millis() - lastSendTime > 2000) {
    String sensorData = String(staT);
    sendMessage(sensorData);
    Serial.println("  SENT                 " + sensorData);
    digitalWrite(5, HIGH); delay(1000); digitalWrite(5, LOW);
    // Serial.print(" from 0x" + String(localAddress, HEX));
    // Serial.println(" to 0x" + String(destinationAddress, HEX));
    lastSendTime = millis();
  }
}
//.............................................................   VOID SEND MESSAGE   .............................SENDER
void sendMessage(String outgoing) {
  LoRa.beginPacket();
  LoRa.write(destinationAddress);
  LoRa.write(localAddress);
  LoRa.write(outgoing.length());
  LoRa.print(outgoing);
  LoRa.endPacket();
  delay(500);
}

//.............................................................   VOID RECEIVING MESSAGE   .........................SENDER
void receiveMessage(int packetSize) {
  if (packetSize == 0) return;
  int recipient = LoRa.read();
  byte sender = LoRa.read();
  byte incomingLength = LoRa.read();
  String incoming = "";
  while (LoRa.available()) {
    incoming += (char)LoRa.read();

  }
  if (incomingLength != incoming.length()) {
    //Serial.println("Error: Message length does not match length");
    return;
  }
  if (recipient != localAddress) {
    //Serial.println("Error: Recipient address does not match local address");
    return;
  }

  staTRec = incoming.toInt();

  Serial.print("                       RECEIVED BACK  "); Serial.println(staTRec);
}

//_________________________________________________________________________________________________________________
//_______________________________________________________________________________________   VOID LOOP   ___________SENDER
void loop() {

  //............................................................   RECEIVING DATA   .....................
  receiveMessage(LoRa.parsePacket());
  //   <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<       DATA TO SEND      >>>>>>>>>>>>>>>>>>>>>>>>>

  if (millis() - lastSendTime > 2000) {//  2000 and above TX both sends and Receives.If Interval is reduced to less than 2000 it does not send data
    staT = 280; senddatA();
    lastSendTime = millis();
  }

  /*
    staT = 280; senddatA();
    delay(4000); //        Using delay  TX sends ok and RX sends back but TX  does NOT RECEIVE
  */
}pe or paste code here
===============================================================================

typ//.................................................................. RX RECEIVER ..........................................
#include <SPI.h>
#include <LoRa.h>

byte localAddress = 0xBB;
byte destinationAddress = 0xAA;
//................................................................. ENERGY MONITOR ......................................

#include "EmonLib.h" // Include Emon Library
#define CURRENT_CAL 250
EnergyMonitor emon1; // Create an instance

//................................................................. VARIABLES ............................................RX RECEIVER
long lastSendTime = 0;
int interval = 2000;

unsigned int reC = 0;
int statioN = 0;
int onofF = 0;
int incom = reC;
int aaa = 0; // Temp Variable
int loopCount = 0; // Energy Monitor Loop
int currentDraw = 0;
int AConoff = 0; // AC either ON = 1 or OFF = 0
int staToNOFF = 0; // Even number is OFF odd number is ON
int relay = 0;
void setup() {
Serial.begin(9600);
//................................................................. ENERGY MONITOR ......................................RX RECEIVER

emon1.current(0, CURRENT_CAL); // Current: input pin, calibration.

//................................................................ STARTING LORA ....................................RX RECEIVER
Serial.println("Start LoRa duplex RX Receiver");
if (!LoRa.begin(915E6)) {
Serial.println("LoRa init failed. Check your connections.");
while (true) {}
}

}
//................................................................. ENERGY MONITOR ......................................RX RECEIVER
void currenT() {

emon1.calcVI(20, 2000);        // Calculate all. No.of half wavelengths (crossings), time-out
float currentDraw            = emon1.Irms;             //extract Irms into Variable

}

//................................................................... OUTGOING DATA .....................................RX RECEIVER
void sendMessage(String outgoing) {

LoRa.beginPacket();
LoRa.write(destinationAddress);
LoRa.write(localAddress);
LoRa.write(outgoing.length());
LoRa.print(outgoing);
LoRa.endPacket();
Serial.print("                           sending back   " ); Serial.println(outgoing);

digitalWrite(7, HIGH); delay(500); digitalWrite(7, LOW);

}

//................................................................... INCOMING DATA ............................................RX RECEIVER
void receiveMessage(int packetSize) {
if (packetSize == 0) return;
int recipient = LoRa.read();
byte sender = LoRa.read();
byte incomingLength = LoRa.read();

String incoming = "";

while (LoRa.available()) {
incoming += (char)LoRa.read();
}

reC = incoming.toInt();
Serial.print(" REC "); Serial.println(reC);

station();

}

//.................................................................... STATIONS .............................................RX RECEIVER
void station() {

statioN = ((reC / 10));
currenT(); //<<<<<<<<<<<<<<<<<< Delete this line is left IN the TX does not receive the sendback.
//<<<<<<<<<<<<<<<<<< with left in TX receives the SENDBACK OK >>>>>>>>>>>>>>>>>>>>>>>>>>
String staToNOFF = String(4287);

Serial.print(" SendBack 25 to 33 "); Serial.println(staToNOFF);
sendMessage(staToNOFF); // SEND BACK TO TX
}

//.................................................................... VOID LOOP .............................................RX RECEIVER
void loop() {

receiveMessage(LoRa.parsePacket()); // RECEIVE MESSAGE

}e or paste code here


4 years here and you aren't posting your code correctly? :slight_smile:
Please consider editing your post and properly putting your code in code tags.
Also, you can probably put all these questions into a single project thread, some might see this as cross-posting, but that's just my opinion. I'd look at your problem but I don't feel like digging through multiple threads.

Tidy up the post so the forum can read the code ?

`Where am I going wrong?

type or paste code here

I cut and paste the code into the above area and it comes out thus

type o#include <SPI.h>
#include <LoRa.h>

byte localAddress = 0xBB;
byte destinationAddress = 0xAA;
//.................................................................    ENERGY MONITOR    ......................................

#include "EmonLib.h"             // Include Emon Library
#define CURRENT_CAL 250
EnergyMonitor emon1;             // Create an instancer paste code here

See this post at the top of the forum;

Is this correct?

//..................................................................   RX  RECEIVER  ..........................................
#include <SPI.h>
#include <LoRa.h>

byte localAddress = 0xBB;
byte destinationAddress = 0xAA;
//.................................................................    ENERGY MONITOR    ......................................

#include "EmonLib.h"             // Include Emon Library
#define CURRENT_CAL 250
EnergyMonitor emon1;             // Create an instance

//.................................................................   VARIABLES   ............................................RX  RECEIVER
long lastSendTime = 0;
int interval = 2000;

unsigned int reC  = 0;
int statioN  = 0;
int onofF    = 0;
int incom = reC;
int aaa = 0;  //  Temp Variable
int loopCount = 0;  //   Energy Monitor Loop
int currentDraw = 0;
int AConoff = 0;  //      AC  either ON = 1 or OFF = 0
int staToNOFF = 0; //  Even number is OFF   odd number is ON
int relay = 0;
void setup() {
  Serial.begin(9600);
  //.................................................................    ENERGY MONITOR    ......................................RX  RECEIVER

  emon1.current(0, CURRENT_CAL);       // Current: input pin, calibration.

 
  //................................................................   STARTING LORA   ....................................RX  RECEIVER
  Serial.println("Start LoRa duplex RX Receiver");
  if (!LoRa.begin(915E6)) {
    Serial.println("LoRa init failed. Check your connections.");
    while (true) {}
  }
 
}
//.................................................................    ENERGY MONITOR    ......................................RX  RECEIVER
void currenT() {
 
    emon1.calcVI(20, 2000);        // Calculate all. No.of half wavelengths (crossings), time-out
    float currentDraw            = emon1.Irms;             //extract Irms into Variable
}

//...................................................................   OUTGOING DATA   .....................................RX  RECEIVER
void sendMessage(String outgoing) {

    LoRa.beginPacket();
    LoRa.write(destinationAddress);
    LoRa.write(localAddress);
    LoRa.write(outgoing.length());
    LoRa.print(outgoing);
    LoRa.endPacket();
    Serial.print("                           sending back   " ); Serial.println(outgoing);

    digitalWrite(7, HIGH); delay(500); digitalWrite(7, LOW);
}

//...................................................................   INCOMING DATA   ............................................RX  RECEIVER
void receiveMessage(int packetSize) {
  if (packetSize == 0) return;
  int recipient = LoRa.read();
  byte sender = LoRa.read();
  byte incomingLength = LoRa.read();

  String incoming = "";

  while (LoRa.available()) {
    incoming += (char)LoRa.read();
  }

  reC = incoming.toInt();
  Serial.print("   REC  "); Serial.println(reC);

  station();

}

//....................................................................   STATIONS   .............................................RX  RECEIVER
void station() {
  
 statioN = ((reC / 10));
  currenT();           //<<<<<<<<<<<<<<<<<<  Delete this line is left IN the TX does not receive the sendback.
                       //<<<<<<<<<<<<<<<<<<  with left in TX receives the SENDBACK OK  >>>>>>>>>>>>>>>>>>>>>>>>>>
    String staToNOFF = String(4287);
    
  Serial.print("  SendBack 25 to 33 "); Serial.println(staToNOFF);
  sendMessage(staToNOFF);                 //   SEND BACK TO TX
   }

//....................................................................   VOID LOOP   .............................................RX  RECEIVER
void loop() {

  receiveMessage(LoRa.parsePacket());     //    RECEIVE MESSAGE

}`
//.................................................................   TX SENDER   ..........................................

#include <SPI.h>
#include <LoRa.h>

//................................................................   LORA ADDRESSES   .............SENDER
byte localAddress = 0xAA;
byte destinationAddress = 0xBB;
long lastSendTime = 0;
unsigned int interval = 0;

//................................................................   VARIABLES
int count = 0; unsigned int staT  = 220; //   OUTGOING
int countRec = 0; long int staTRec  = 0; //   INCOMING
int statioN  = 0;  // STATION NUMBER 22 to 33
int onofF    = 0;  // 0 = ON ... 1 = OFF

//________________________________________________________________________________________________________________
//_______________________________________________________________________________________   VOID SETUP  __________SENDER
void setup() {
  Serial.begin(9600);

  //.............................................................   STARTING LORA   ....................
  Serial.println("Start LoRa duplex  TX  Sender");
  if (!LoRa.begin(915E6)) {
    Serial.println("LoRa init failed. Check your connections.");
    while (true) {}
  }
}

//..............................................................   VOID SENDING DATA   ...........................SENDER
void senddatA()
{
  if (millis() - lastSendTime > 2000) {
    String sensorData = String(staT);
    sendMessage(sensorData);
    Serial.println("  SENT                 " + sensorData);
    digitalWrite(5, HIGH); delay(1000); digitalWrite(5, LOW);
    // Serial.print(" from 0x" + String(localAddress, HEX));
    // Serial.println(" to 0x" + String(destinationAddress, HEX));
    lastSendTime = millis();
  }
}
//.............................................................   VOID SEND MESSAGE   .............................SENDER
void sendMessage(String outgoing) {
  LoRa.beginPacket();
  LoRa.write(destinationAddress);
  LoRa.write(localAddress);
  LoRa.write(outgoing.length());
  LoRa.print(outgoing);
  LoRa.endPacket();
  delay(500);
}

//.............................................................   VOID RECEIVING MESSAGE   .........................SENDER
void receiveMessage(int packetSize) {
  if (packetSize == 0) return;
  int recipient = LoRa.read();
  byte sender = LoRa.read();
  byte incomingLength = LoRa.read();
  String incoming = "";
  while (LoRa.available()) {
    incoming += (char)LoRa.read();

  }
  if (incomingLength != incoming.length()) {
    //Serial.println("Error: Message length does not match length");
    return;
  }
  if (recipient != localAddress) {
    //Serial.println("Error: Recipient address does not match local address");
    return;
  }

  staTRec = incoming.toInt();

  Serial.print("                       RECEIVED BACK  "); Serial.println(staTRec);
}

//_________________________________________________________________________________________________________________
//_______________________________________________________________________________________   VOID LOOP   ___________SENDER
void loop() {

  //............................................................   RECEIVING DATA   .....................
  receiveMessage(LoRa.parsePacket());
  //   <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<       DATA TO SEND      >>>>>>>>>>>>>>>>>>>>>>>>>

  if (millis() - lastSendTime > 2000) {//  2000 and above TX both sends and Receives.If Interval is reduced to less than 2000 it does not send data
    staT = 280; senddatA();
    lastSendTime = millis();
  }

  /*
    staT = 280; senddatA();
    delay(4000); //        Using delay  TX sends ok and RX sends back but TX  does NOT RECEIVE
  */
}

Thats better, but a hint, when you post code, go back and hit the copy button and copy it into an Arduino sketch to check its OK.

I dont use that particular LoRa libray (I have my own) but your post says your trying to use the " callback function " and the API guide for that library says that to use callback you need to define it thus;

LoRa.onReceive(nameoffunction);

Do you have an onReceive() in your code ?

// LoRa.onReceive(LoRa.parsePacket());
  receiveMessage(LoRa.parsePacket());

Tried LoRa.onReceive and the TX received no reply.
Changed to receiveMessage and TX receives the reply OK

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.