kopia lustrzana https://github.com/jgromes/RadioLib
				
				
				
			
		
			
				
	
	
		
			165 wiersze
		
	
	
		
			4.1 KiB
		
	
	
	
		
			C++
		
	
	
			
		
		
	
	
			165 wiersze
		
	
	
		
			4.1 KiB
		
	
	
	
		
			C++
		
	
	
| /*
 | |
|    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.
 | |
| 
 | |
|    For default module settings, see the wiki page
 | |
|    https://github.com/jgromes/RadioLib/wiki/Default-configuration#sx128x---lora-modem
 | |
| 
 | |
|    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
 | |
| SX1280 radio = new Module(10, 2, 3, 9);
 | |
| 
 | |
| // or using RadioShield
 | |
| // https://github.com/jgromes/RadioShield
 | |
| //SX1280 radio = RadioShield.ModuleA;
 | |
| 
 | |
| void setup() {
 | |
|   Serial.begin(9600);
 | |
| 
 | |
|   // initialize SX1280 with default settings
 | |
|   Serial.print(F("[SX1280] 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.setDio1Action(setFlag);
 | |
| 
 | |
|   // start listening for LoRa packets
 | |
|   Serial.print(F("[SX1280] 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.readData();
 | |
|   // radio.scanChannel();
 | |
| }
 | |
| 
 | |
| // 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!
 | |
| #if defined(ESP8266) || defined(ESP32)
 | |
|   ICACHE_RAM_ATTR
 | |
| #endif
 | |
| 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;
 | |
|     int state = radio.readData(str);
 | |
| 
 | |
|     // you can also read received data as byte array
 | |
|     /*
 | |
|       byte byteArr[8];
 | |
|       int state = radio.readData(byteArr, 8);
 | |
|     */
 | |
| 
 | |
|     if (state == RADIOLIB_ERR_NONE) {
 | |
|       // 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"));
 | |
|       Serial.print(radio.getRSSI());
 | |
|       Serial.println(F(" dBm"));
 | |
| 
 | |
|       // print SNR (Signal-to-Noise Ratio)
 | |
|       Serial.print(F("[SX1280] SNR:\t\t"));
 | |
|       Serial.print(radio.getSNR());
 | |
|       Serial.println(F(" dB"));
 | |
| 
 | |
|       // print the Frequency Error
 | |
|       // of the last received packet
 | |
|       Serial.print(F("[SX1280] Frequency Error:\t"));
 | |
|       Serial.print(radio.getFrequencyError());
 | |
|       Serial.println(F(" Hz"));
 | |
| 
 | |
|     } 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);
 | |
| 
 | |
|     }
 | |
| 
 | |
|     // put module back to listen mode
 | |
|     radio.startReceive();
 | |
| 
 | |
|     // we're ready to receive more packets,
 | |
|     // enable interrupt service routine
 | |
|     enableInterrupt = true;
 | |
|   }
 | |
| 
 | |
| }
 |