/* RadioLib LR11x0 Receive with Interrupts Example This example listens for LoRa transmissions and tries to receive them. Once a packet is received, an interrupt is triggered. To successfully receive data, the following settings have to be the same on both transmitter and receiver: - carrier frequency - bandwidth - spreading factor - coding rate - sync word Other modules from LR11x0 family can also be used. This example assumes Seeed Studio Wio WM1110 is used. For other LR11x0 modules, some configuration such as RF switch control may have to be adjusted. 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 // 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, }; 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); } // set the function that will be called // when new packet is received radio.setPacketReceivedAction(setFlag); // start listening for LoRa packets 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); } // if needed, 'listen' mode can be disabled by calling // any of the following methods: // // radio.standby() // radio.sleep() // radio.transmit(); // radio.receive(); // radio.scanChannel(); } // flag to indicate that a packet was received volatile bool receivedFlag = false; // this function is called when a complete packet // is 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 got a packet, set the flag receivedFlag = true; } void loop() { // check if the flag is set if(receivedFlag) { // reset flag receivedFlag = false; // you can read received data as an Arduino String String str; int state = radio.readData(str); // you can also read received data as byte array /* byte byteArr[8]; int numBytes = radio.getPacketLength(); int state = radio.readData(byteArr, numBytes); */ 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")); } else if (state == RADIOLIB_ERR_CRC_MISMATCH) { // packet was received, but is malformed Serial.println(F("CRC error!")); } else { // some other error occurred Serial.print(F("failed, code ")); Serial.println(state); } } }