/* RadioLib SX127x Channel Activity Detection with Interrupts Example This example scans the current LoRa channel and detects valid LoRa preambles. Preamble is the first part of LoRa transmission, so this can be used to check if the LoRa channel is free, or if you should start receiving a message. Other modules from SX127x/RFM9x family can also be used. For default module settings, see the wiki page https://github.com/jgromes/RadioLib/wiki/Default-configuration#sx127xrfm9x---lora-modem For full API reference, see the GitHub Pages https://jgromes.github.io/RadioLib/ */ // include the library #include // SX1278 has the following connections: // NSS pin: 10 // DIO0 pin: 2 // RESET pin: 9 // DIO1 pin: 3 SX1278 radio = new Module(10, 2, 9, 3); // or using RadioShield // https://github.com/jgromes/RadioShield //SX1278 radio = RadioShield.ModuleA; // save state between loops int scanState = ERR_NONE; void setup() { Serial.begin(9600); // initialize SX1278 with default settings Serial.print(F("[SX1278] Initializing ... ")); int state = radio.begin(); if (state == 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 LoRa preamble is not detected within CAD timeout period radio.setDio0Action(setFlagTimeout); // set the function that will be called // when LoRa preamble is detected radio.setDio1Action(setFlagDetected); // start scanning the channel Serial.print(F("[SX1278] Starting scan for LoRa preamble ... ")); state = radio.startChannelScan(); if (state == ERR_NONE) { Serial.println(F("success!")); } else { Serial.print(F("failed, code ")); Serial.println(state); } } // flag to indicate that a preamble was not detected volatile bool timeoutFlag = false; // flag to indicate that a preamble was detected volatile bool detectedFlag = false; // disable interrupt when it's not needed volatile bool enableInterrupt = true; // this function is called when no preamble // is detected within timeout period // IMPORTANT: this function MUST be 'void' type // and MUST NOT have any arguments! void setFlagTimeout(void) { // check if the interrupt is enabled if(!enableInterrupt) { return; } // we timed out, set the flag timeoutFlag = true; } // this function is called when LoRa preamble // is detected within timeout period // IMPORTANT: this function MUST be 'void' type // and MUST NOT have any arguments! void setFlagDetected(void) { // check if the interrupt is enabled if(!enableInterrupt) { return; } // we got a preamble, set the flag detectedFlag = true; } void loop() { // check if we got a preamble if(detectedFlag) { // disable the interrupt service routine while // processing the data enableInterrupt = false; // reset flag detectedFlag = false; // LoRa preamble was detected Serial.print(F("[SX1278] Preamble detected!")); } // check if we need to restart channel activity detection if(detectedFlag || timeoutFlag) { // start scanning the channel Serial.print(F("[SX1278] Starting scan for LoRa preamble ... ")); // start scanning current channel int state = radio.startChannelScan(); if (state == ERR_NONE) { Serial.println(F("success!")); } else { Serial.print(F("failed, code ")); Serial.println(state); } } }