/* RadioLib PhysicalLayer Interface Example This example shows how to use the common PhysicalLayer to interface with different radio modules using the same methods. For full API reference, see the GitHub Pages https://jgromes.github.io/RadioLib/ */ // include the library #include // select which radio to use // this can be any radio supported by RadioLib! #define RADIO_TYPE SX1278 // set the pinout depending on the wiring and module type // SPI NSS pin: 10 // interrupt pin: 2 // reset pin: 9 (unused on some modules) // extra GPIO/interrupt pin: 3 (unused on some modules) RADIO_TYPE radio = new Module(10, 2, 9, 3); // get pointer to the common layer PhysicalLayer* phy = (PhysicalLayer*)&radio; void dummyISR(void) { // nothing here, this example is just a showcase } void setup() { Serial.begin(9600); // now we can use "radio" to access the features // specific to that radio type, such as the begin() method Serial.print(F("[Radio] 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); } // or we can use the "phy" pointer to access the common layer // PhysicalLayer has some common configuration Serial.print(F("[PHY] Changing frequency ... ")); state = phy->setFrequency(433.5); if(state == RADIOLIB_ERR_NONE) { Serial.println(F("success!")); } else { Serial.print(F("failed, code ")); Serial.println(state); while(true); } // PhysicalLayer also contains basic functionality // like transmitting and receiving packets Serial.print(F("[PHY] Sending packet ... ")); state = phy->transmit("Hello World!"); if(state == RADIOLIB_ERR_NONE) { Serial.println(F("success!")); } else { Serial.print(F("failed, code ")); Serial.println(state); while(true); } // try to receive now - this will almost certainly timeout // unless by chance there is a transmitter nearby, // but the point of this example is to showcase the interface String str; Serial.print(F("[PHY] Listening for packets ... ")); state = phy->receive(str); if(state == RADIOLIB_ERR_NONE) { Serial.println(F("success!")); } else if(state == RADIOLIB_ERR_RX_TIMEOUT) { Serial.println(F("timeout!")); } else { Serial.print(F("failed, code ")); Serial.println(state); while(true); } // interrupt-driven versions of Rx/Tx are supported as well // for these to work, you have to configure the interrupt actions phy->setPacketReceivedAction(dummyISR); phy->setPacketSentAction(dummyISR); // now you can use methods like startTransmit(), startReceive(), // readData() etc. // interrupt actions can be cleared as well phy->clearPacketReceivedAction(); phy->clearPacketSentAction(); // PhysicalLayer supports basic mode changes like sleep ... Serial.print(F("[PHY] Going to sleep ... ")); state = phy->sleep(); if(state == RADIOLIB_ERR_NONE) { Serial.println(F("success!")); } else { Serial.print(F("failed, code ")); Serial.println(state); while(true); } // ... or standby Serial.print(F("[PHY] Going to standby ... ")); state = phy->standby(); if(state == RADIOLIB_ERR_NONE) { Serial.println(F("success!")); } else { Serial.print(F("failed, code ")); Serial.println(state); while(true); } // there are also common SNR/RSSI measurement functions Serial.print(F("[PHY] Measured SNR = ")); Serial.print(phy->getSNR()); Serial.println(F(" dB")); Serial.print(F("[PHY] Measured RSSI = ")); Serial.print(phy->getRSSI()); Serial.println(F(" dBm")); // and also a true random number generator Serial.print(F("[PHY] Random number between 0 and 100 = ")); Serial.println(phy->random(100)); } void loop() { // nothing here, the example is just a showcase }