From 47b8df68740e933dfa050326dff3daec4bc64d30 Mon Sep 17 00:00:00 2001 From: jgromes Date: Tue, 10 Sep 2024 19:23:30 +0200 Subject: [PATCH] [LR11x0] Added ping-pong example --- .../LR11x0_PingPong/LR11x0_PingPong.ino | 166 ++++++++++++++++++ 1 file changed, 166 insertions(+) create mode 100644 examples/LR11x0/LR11x0_PingPong/LR11x0_PingPong.ino diff --git a/examples/LR11x0/LR11x0_PingPong/LR11x0_PingPong.ino b/examples/LR11x0/LR11x0_PingPong/LR11x0_PingPong.ino new file mode 100644 index 00000000..b494a3c2 --- /dev/null +++ b/examples/LR11x0/LR11x0_PingPong/LR11x0_PingPong.ino @@ -0,0 +1,166 @@ +/* + RadioLib LR11x0 Ping-Pong Example + + For default module settings, see the wiki page + https://github.com/jgromes/RadioLib/wiki/Default-configuration#lr11x0---lora-modem + + For full API reference, see the GitHub Pages + https://jgromes.github.io/RadioLib/ +*/ + +// include the library +#include + +// uncomment the following only on one +// of the nodes to initiate the pings +//#define INITIATING_NODE + +// LR1110 has the following connections: +// NSS pin: 10 +// IRQ pin: 2 +// NRST pin: 3 +// BUSY pin: 9 +LR1110 radio = new Module(10, 2, 3, 9); + +// set RF switch configuration for Wio WM1110 +// Wio WM1110 uses DIO5 and DIO6 for RF switching +// NOTE: other boards may be different! +static const uint32_t rfswitch_dio_pins[] = { + RADIOLIB_LR11X0_DIO5, RADIOLIB_LR11X0_DIO6, + RADIOLIB_NC, RADIOLIB_NC, RADIOLIB_NC +}; + +static const Module::RfSwitchMode_t rfswitch_table[] = { + // mode DIO5 DIO6 + { LR11x0::MODE_STBY, { LOW, LOW } }, + { LR11x0::MODE_RX, { HIGH, LOW } }, + { LR11x0::MODE_TX, { HIGH, HIGH } }, + { LR11x0::MODE_TX_HP, { LOW, HIGH } }, + { LR11x0::MODE_TX_HF, { LOW, LOW } }, + { LR11x0::MODE_GNSS, { LOW, LOW } }, + { LR11x0::MODE_WIFI, { LOW, LOW } }, + END_OF_MODE_TABLE, +}; + +// save transmission states between loops +int transmissionState = RADIOLIB_ERR_NONE; + +// flag to indicate transmission or reception state +bool transmitFlag = false; + +// flag to indicate that a packet was sent or received +volatile bool operationDone = false; + +// this function is called when a complete packet +// is transmitted or received by the module +// IMPORTANT: this function MUST be 'void' type +// and MUST NOT have any arguments! +#if defined(ESP8266) || defined(ESP32) + ICACHE_RAM_ATTR +#endif +void setFlag(void) { + // we sent or received a packet, set the flag + operationDone = true; +} + +void setup() { + Serial.begin(9600); + + // set RF switch control configuration + // this has to be done prior to calling begin() + radio.setRfSwitchTable(rfswitch_dio_pins, rfswitch_table); + + // initialize LR1110 with default settings + Serial.print(F("[LR1110] Initializing ... ")); + int state = radio.begin(); + if (state == RADIOLIB_ERR_NONE) { + Serial.println(F("success!")); + } else { + Serial.print(F("failed, code ")); + Serial.println(state); + while (true) { delay(10); } + } + + // set the function that will be called + // when new packet is received + radio.setIrqAction(setFlag); + + #if defined(INITIATING_NODE) + // send the first packet on this node + Serial.print(F("[LR1110] Sending first packet ... ")); + transmissionState = radio.startTransmit("Hello World!"); + transmitFlag = true; + #else + // start listening for LoRa packets on this node + Serial.print(F("[LR1110] Starting to listen ... ")); + state = radio.startReceive(); + if (state == RADIOLIB_ERR_NONE) { + Serial.println(F("success!")); + } else { + Serial.print(F("failed, code ")); + Serial.println(state); + while (true) { delay(10); } + } + #endif +} + +void loop() { + // check if the previous operation finished + if(operationDone) { + // reset flag + operationDone = false; + + if(transmitFlag) { + // the previous operation was transmission, listen for response + // print the result + if (transmissionState == RADIOLIB_ERR_NONE) { + // packet was successfully sent + Serial.println(F("transmission finished!")); + + } else { + Serial.print(F("failed, code ")); + Serial.println(transmissionState); + + } + + // listen for response + radio.startReceive(); + transmitFlag = false; + + } else { + // the previous operation was reception + // print data and send another packet + String str; + int state = radio.readData(str); + + if (state == RADIOLIB_ERR_NONE) { + // packet was successfully received + Serial.println(F("[LR1110] Received packet!")); + + // print data of the packet + Serial.print(F("[LR1110] Data:\t\t")); + Serial.println(str); + + // print RSSI (Received Signal Strength Indicator) + Serial.print(F("[LR1110] RSSI:\t\t")); + Serial.print(radio.getRSSI()); + Serial.println(F(" dBm")); + + // print SNR (Signal-to-Noise Ratio) + Serial.print(F("[LR1110] SNR:\t\t")); + Serial.print(radio.getSNR()); + Serial.println(F(" dB")); + + } + + // wait a second before transmitting again + delay(1000); + + // send another one + Serial.print(F("[LR1110] Sending another packet ... ")); + transmissionState = radio.startTransmit("Hello World!"); + transmitFlag = true; + } + + } +}