| 
									
										
										
										
											2020-04-07 11:30:05 +00:00
										 |  |  | /*
 | 
					
						
							|  |  |  |    RadioLib SX128x 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 SX128x family can also be used. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-04 09:47:24 +00:00
										 |  |  |    For default module settings, see the wiki page | 
					
						
							|  |  |  |    https://github.com/jgromes/RadioLib/wiki/Default-configuration#sx128x---lora-modem
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-04-07 11:30:05 +00:00
										 |  |  |    For full API reference, see the GitHub Pages | 
					
						
							|  |  |  |    https://jgromes.github.io/RadioLib/
 | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // include the library
 | 
					
						
							|  |  |  | #include <RadioLib.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // SX1280 has the following connections:
 | 
					
						
							|  |  |  | // NSS pin:   10
 | 
					
						
							|  |  |  | // DIO1 pin:  2
 | 
					
						
							|  |  |  | // NRST pin:  3
 | 
					
						
							|  |  |  | // BUSY pin:  9
 | 
					
						
							| 
									
										
										
										
											2020-07-04 09:47:24 +00:00
										 |  |  | SX1280 radio = new Module(10, 2, 3, 9); | 
					
						
							| 
									
										
										
										
											2020-04-07 11:30:05 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | // or using RadioShield
 | 
					
						
							|  |  |  | // https://github.com/jgromes/RadioShield
 | 
					
						
							| 
									
										
										
										
											2020-07-04 09:47:24 +00:00
										 |  |  | //SX1280 radio = RadioShield.ModuleA;
 | 
					
						
							| 
									
										
										
										
											2020-04-07 11:30:05 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | void setup() { | 
					
						
							|  |  |  |   Serial.begin(9600); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   // initialize SX1280 with default settings
 | 
					
						
							|  |  |  |   Serial.print(F("[SX1280] Initializing ... ")); | 
					
						
							| 
									
										
										
										
											2020-07-04 09:47:24 +00:00
										 |  |  |   int state = radio.begin(); | 
					
						
							| 
									
										
										
										
											2021-11-14 10:42:36 +00:00
										 |  |  |   if (state == RADIOLIB_ERR_NONE) { | 
					
						
							| 
									
										
										
										
											2020-04-07 11:30:05 +00:00
										 |  |  |     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
 | 
					
						
							| 
									
										
										
										
											2020-07-04 09:47:24 +00:00
										 |  |  |   radio.setDio1Action(setFlag); | 
					
						
							| 
									
										
										
										
											2020-04-07 11:30:05 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |   // start listening for LoRa packets
 | 
					
						
							|  |  |  |   Serial.print(F("[SX1280] Starting to listen ... ")); | 
					
						
							| 
									
										
										
										
											2020-07-04 09:47:24 +00:00
										 |  |  |   state = radio.startReceive(); | 
					
						
							| 
									
										
										
										
											2021-11-14 10:42:36 +00:00
										 |  |  |   if (state == RADIOLIB_ERR_NONE) { | 
					
						
							| 
									
										
										
										
											2020-04-07 11:30:05 +00:00
										 |  |  |     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:
 | 
					
						
							|  |  |  |   //
 | 
					
						
							| 
									
										
										
										
											2020-07-04 09:47:24 +00:00
										 |  |  |   // radio.standby()
 | 
					
						
							|  |  |  |   // radio.sleep()
 | 
					
						
							|  |  |  |   // radio.transmit();
 | 
					
						
							|  |  |  |   // radio.receive();
 | 
					
						
							|  |  |  |   // radio.readData();
 | 
					
						
							|  |  |  |   // radio.scanChannel();
 | 
					
						
							| 
									
										
										
										
											2020-04-07 11:30:05 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // flag to indicate that a packet was received
 | 
					
						
							|  |  |  | volatile bool receivedFlag = false; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // disable interrupt when it's not needed
 | 
					
						
							|  |  |  | volatile bool enableInterrupt = true; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // 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!
 | 
					
						
							| 
									
										
										
										
											2021-12-29 07:49:22 +00:00
										 |  |  | #if defined(ESP8266) || defined(ESP32)
 | 
					
						
							|  |  |  |   ICACHE_RAM_ATTR | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2020-04-07 11:30:05 +00:00
										 |  |  | void setFlag(void) { | 
					
						
							|  |  |  |   // check if the interrupt is enabled
 | 
					
						
							|  |  |  |   if(!enableInterrupt) { | 
					
						
							|  |  |  |     return; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   // we got a packet, set the flag
 | 
					
						
							|  |  |  |   receivedFlag = true; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void loop() { | 
					
						
							|  |  |  |   // check if the flag is set
 | 
					
						
							|  |  |  |   if(receivedFlag) { | 
					
						
							|  |  |  |     // disable the interrupt service routine while
 | 
					
						
							|  |  |  |     // processing the data
 | 
					
						
							|  |  |  |     enableInterrupt = false; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // reset flag
 | 
					
						
							|  |  |  |     receivedFlag = false; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // you can read received data as an Arduino String
 | 
					
						
							|  |  |  |     String str; | 
					
						
							| 
									
										
										
										
											2020-07-04 09:47:24 +00:00
										 |  |  |     int state = radio.readData(str); | 
					
						
							| 
									
										
										
										
											2020-04-07 11:30:05 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     // you can also read received data as byte array
 | 
					
						
							|  |  |  |     /*
 | 
					
						
							|  |  |  |       byte byteArr[8]; | 
					
						
							| 
									
										
										
										
											2020-07-04 09:47:24 +00:00
										 |  |  |       int state = radio.readData(byteArr, 8); | 
					
						
							| 
									
										
										
										
											2020-04-07 11:30:05 +00:00
										 |  |  |     */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-14 10:42:36 +00:00
										 |  |  |     if (state == RADIOLIB_ERR_NONE) { | 
					
						
							| 
									
										
										
										
											2020-04-07 11:30:05 +00:00
										 |  |  |       // packet was successfully received
 | 
					
						
							|  |  |  |       Serial.println(F("[SX1280] Received packet!")); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       // print data of the packet
 | 
					
						
							|  |  |  |       Serial.print(F("[SX1280] Data:\t\t")); | 
					
						
							|  |  |  |       Serial.println(str); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       // print RSSI (Received Signal Strength Indicator)
 | 
					
						
							|  |  |  |       Serial.print(F("[SX1280] RSSI:\t\t")); | 
					
						
							| 
									
										
										
										
											2020-07-04 09:47:24 +00:00
										 |  |  |       Serial.print(radio.getRSSI()); | 
					
						
							| 
									
										
										
										
											2020-04-07 11:30:05 +00:00
										 |  |  |       Serial.println(F(" dBm")); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       // print SNR (Signal-to-Noise Ratio)
 | 
					
						
							|  |  |  |       Serial.print(F("[SX1280] SNR:\t\t")); | 
					
						
							| 
									
										
										
										
											2020-07-04 09:47:24 +00:00
										 |  |  |       Serial.print(radio.getSNR()); | 
					
						
							| 
									
										
										
										
											2020-04-07 11:30:05 +00:00
										 |  |  |       Serial.println(F(" dB")); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-02-23 16:41:29 +00:00
										 |  |  |       // print the Frequency Error
 | 
					
						
							|  |  |  |       // of the last received packet
 | 
					
						
							|  |  |  |       Serial.print(F("[SX1280] Frequency Error:\t")); | 
					
						
							|  |  |  |       Serial.print(radio.getFrequencyError()); | 
					
						
							|  |  |  |       Serial.println(F(" Hz")); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-14 10:42:36 +00:00
										 |  |  |     } else if (state == RADIOLIB_ERR_CRC_MISMATCH) { | 
					
						
							| 
									
										
										
										
											2020-04-07 11:30:05 +00:00
										 |  |  |       // packet was received, but is malformed
 | 
					
						
							|  |  |  |       Serial.println(F("CRC error!")); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     } else { | 
					
						
							|  |  |  |       // some other error occurred
 | 
					
						
							|  |  |  |       Serial.print(F("failed, code ")); | 
					
						
							|  |  |  |       Serial.println(state); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // put module back to listen mode
 | 
					
						
							| 
									
										
										
										
											2020-07-04 09:47:24 +00:00
										 |  |  |     radio.startReceive(); | 
					
						
							| 
									
										
										
										
											2020-04-07 11:30:05 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     // we're ready to receive more packets,
 | 
					
						
							|  |  |  |     // enable interrupt service routine
 | 
					
						
							|  |  |  |     enableInterrupt = true; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } |