From 8fbc218aed9e04e432f54c6ff7542dc45a3ff470 Mon Sep 17 00:00:00 2001 From: jgromes Date: Sun, 10 Feb 2019 11:19:50 +0100 Subject: [PATCH] [SX127x] Unified example format --- .../SX127x_Channel_Activity_Detection.ino} | 2 +- .../SX127x_FSK_Modem/SX127x_FSK_Modem.ino | 186 ++++++++++++++++++ .../SX127x_Receive_Interrupt.ino} | 14 +- .../SX127x_Transmit/SX127x_Transmit.ino | 2 +- .../SX127x_Transmit_Interrupt.ino} | 10 +- 5 files changed, 200 insertions(+), 14 deletions(-) rename examples/SX127x/{SX127x_ChannelActivityDetection/SX127x_ChannelActivityDetection.ino => SX127x_Channel_Activity_Detection/SX127x_Channel_Activity_Detection.ino} (95%) create mode 100644 examples/SX127x/SX127x_FSK_Modem/SX127x_FSK_Modem.ino rename examples/SX127x/{SX127x_ReceiveInterrupt/SX127x_ReceiveInterrupt.ino => SX127x_Receive_Interrupt/SX127x_Receive_Interrupt.ino} (91%) rename examples/SX127x/{SX127x_TransmitInterrupt/SX127x_TransmitInterrupt.ino => SX127x_Transmit_Interrupt/SX127x_Transmit_Interrupt.ino} (90%) diff --git a/examples/SX127x/SX127x_ChannelActivityDetection/SX127x_ChannelActivityDetection.ino b/examples/SX127x/SX127x_Channel_Activity_Detection/SX127x_Channel_Activity_Detection.ino similarity index 95% rename from examples/SX127x/SX127x_ChannelActivityDetection/SX127x_ChannelActivityDetection.ino rename to examples/SX127x/SX127x_Channel_Activity_Detection/SX127x_Channel_Activity_Detection.ino index 41ad8c9d..1c1a2613 100644 --- a/examples/SX127x/SX127x_ChannelActivityDetection/SX127x_ChannelActivityDetection.ino +++ b/examples/SX127x/SX127x_Channel_Activity_Detection/SX127x_Channel_Activity_Detection.ino @@ -41,7 +41,7 @@ void setup() { } void loop() { - Serial.print(F("Scanning channel for LoRa preamble ... ")); + Serial.print(F("[SX1278] Scanning channel for LoRa preamble ... ")); // start scanning current channel int state = lora.scanChannel(); diff --git a/examples/SX127x/SX127x_FSK_Modem/SX127x_FSK_Modem.ino b/examples/SX127x/SX127x_FSK_Modem/SX127x_FSK_Modem.ino new file mode 100644 index 00000000..d5e23bf7 --- /dev/null +++ b/examples/SX127x/SX127x_FSK_Modem/SX127x_FSK_Modem.ino @@ -0,0 +1,186 @@ +/* + RadioLib SX127x FSK Modem Example + + This example shows how to use FSK modem in SX127x chips. + + NOTE: The sketch below is just a guide on how to use + FSK modem, so this code should not be run directly! + Instead, modify the other examples to use FSK + modem and use the appropriate configuration + methods. +*/ + +// include the library +#include + +// SX1278 module is in slot A on the shield +SX1278 fsk = RadioShield.ModuleA; + +void setup() { + Serial.begin(9600); + + // initialize SX1278 FSK modem with default settings + Serial.print(F("[SX1278] Initializing ... ")); + // carrier frequency: 434.0 MHz + // bit rate: 48.0 kbps + // frequency deviation: 50.0 kHz + // Rx bandwidth: 125.0 kHz + // output power: 13 dBm + // current limit: 100 mA + // data shaping: Gaussian, BT = 0.3 + // sync word: 0x2D 0x01 + int state = fsk.beginFSK(); + if (state == ERR_NONE) { + Serial.println(F("success!")); + } else { + Serial.print(F("failed, code ")); + Serial.println(state); + while (true); + } + + // if needed, you can switch between LoRa and FSK modes + // + // lora.begin() start LoRa mode (and disable FSK) + // lora.beginFSK() start FSK mode (and disable LoRa) + + // the following settings can also + // be modified at run-time + state = fsk.setFrequency(433.5); + state = fsk.setBitRate(100.0); + state = fsk.setFrequencyDeviation(10.0); + state = fsk.setRxBandwidth(250.0); + state = fsk.setOutputPower(10.0); + state = fsk.setCurrentLimit(100); + state = fsk.setDataShaping(0.5); + uint8_t syncWord[] = {0x01, 0x23, 0x45, 0x67, + 0x89, 0xAB, 0xCD, 0xEF}; + state = fsk.setSyncWord(syncWord, 8); + if (state != ERR_NONE) { + Serial.print(F("Unable to set configuration, code ")); + Serial.println(state); + while (true); + } + + #warning "This sketch is just an API guide! Read the note at line 6." +} + +void loop() { + // FSK modem can use the same transmit/receive methods + // as the LoRa modem, even their interrupt-driven versions + // NOTE: FSK modem maximum packet length is 63 bytes! + + // transmit FSK packet + int state = fsk.transmit("Hello World!"); + /* + byte byteArr[] = {0x01, 0x23, 0x45, 0x56, + 0x78, 0xAB, 0xCD, 0xEF}; + int state = lora.transmit(byteArr, 8); + */ + if (state == ERR_NONE) { + Serial.println(F("[SX1278] Packet transmitted successfully!")); + } else if (state == ERR_PACKET_TOO_LONG) { + Serial.println(F("[SX1278] Packet too long!")); + } else if (state == ERR_TX_TIMEOUT) { + Serial.println(F("[SX1278] Timed out while transmitting!")); + } else { + Serial.println(F("[SX1278] Failed to transmit packet, code ")); + Serial.println(state); + } + + // receive FSK packet + String str; + state = fsk.receive(str); + /* + byte byteArr[8]; + int state = lora.receive(byteArr, 8); + */ + if (state == ERR_NONE) { + Serial.println(F("[SX1278] Received packet!")); + Serial.print(F("[SX1278] Data:\t")); + Serial.println(str); + } else if (state == ERR_RX_TIMEOUT) { + Serial.println(F("[SX1278] Timed out while waiting for packet!")); + } else { + Serial.println(F("[SX1278] Failed to receive packet, code ")); + Serial.println(state); + } + + // FSK modem has built-in address filtering system + // it can be enabled by setting node address, broadcast + // address, or both + // + // to transmit packet to a particular address, + // use the following methods: + // + // fsk.transmit("Hello World!", address); + // fsk.startTransmit("Hello World!", address); + + // set node address to 0x02 + state = fsk.setNodeAddress(0x02); + // set broadcast address to 0xFF + state = fsk.setBroadcastAddress(0xFF); + if (state != ERR_NONE) { + Serial.println(F("[SX1278] Unable to set address filter, code ")); + Serial.println(state); + } + + // address filtering can also be disabled + // NOTE: calling this method will also erase previously set + // node and broadcast address + /* + state = fsk.disableAddressFiltering(); + if (state != ERR_NONE) { + Serial.println(F("Unable to remove address filter, code ")); + } + */ + + // FSK modem supports direct data transmission + // in this mode, SX127x directly transmits any data + // sent to DIO1 (data) and DIO2 (clock) + + // activate direct mode transmitter + state = fsk.transmitDirect(); + if (state != ERR_NONE) { + Serial.println(F("[SX1278] Unable to start direct transmission mode, code ")); + Serial.println(state); + } + + // using the direct mode, it is possible to transmit + // FM notes with Arduino tone() function + + // it is recommended to set data shaping to 0 + // (no shaping) when transmitting audio + state = fsk.setDataShaping(0.0); + if (state != ERR_NONE) { + Serial.println(F("[SX1278] Unable to set data shaping, code ")); + Serial.println(state); + } + + // tone() function is not available on ESP32 and Arduino Due + #if !defined(ESP32) && !defined(_VARIANT_ARDUINO_DUE_X_) + // transmit FM tone at 1000 Hz for 1 second + // (DIO2 is connected to Arduino pin 4) + tone(4, 1000); + delay(1000); + // transmit FM note at 500 Hz for 1 second + tone(4, 500); + delay(1000); + #endif + + // NOTE: after calling transmitDirect(), SX127x will start + // transmitting immediately! This signal can jam other + // devices at the same frequency, it is up to the user + // to disable it with standby() method! + + // direct mode transmissions can also be received + // as bit stream on DIO1 (data) and DIO2 (clock) + state = fsk.receiveDirect(); + if (state != ERR_NONE) { + Serial.println(F("[SX1278] Unable to start direct reception mode, code ")); + Serial.println(state); + } + + // NOTE: you will not be able to send or receive packets + // while direct mode is active! to deactivate it, call method + // fsk.packetMode() +} diff --git a/examples/SX127x/SX127x_ReceiveInterrupt/SX127x_ReceiveInterrupt.ino b/examples/SX127x/SX127x_Receive_Interrupt/SX127x_Receive_Interrupt.ino similarity index 91% rename from examples/SX127x/SX127x_ReceiveInterrupt/SX127x_ReceiveInterrupt.ino rename to examples/SX127x/SX127x_Receive_Interrupt/SX127x_Receive_Interrupt.ino index 7f59f7e7..0e6b2914 100644 --- a/examples/SX127x/SX127x_ReceiveInterrupt/SX127x_ReceiveInterrupt.ino +++ b/examples/SX127x/SX127x_Receive_Interrupt/SX127x_Receive_Interrupt.ino @@ -25,7 +25,7 @@ void setup() { Serial.begin(9600); // initialize SX1278 with default settings - Serial.print(F("Initializing ... ")); + Serial.print(F("[SX1278] Initializing ... ")); // carrier frequency: 434.0 MHz // bandwidth: 125.0 kHz // spreading factor: 9 @@ -49,7 +49,7 @@ void setup() { lora.setDio0Action(setFlag); // start listening for LoRa packets - Serial.print(F("Starting to listen ... ")); + Serial.print(F("[SX1278] Starting to listen ... ")); state = lora.startReceive(); if (state == ERR_NONE) { Serial.println(F("success!")); @@ -111,24 +111,24 @@ void loop() { if (state == ERR_NONE) { // packet was successfully received - Serial.println("Received packet!"); + Serial.println("[SX1278] Received packet!"); // print data of the packet - Serial.print("Data:\t\t"); + Serial.print("[SX1278] Data:\t\t"); Serial.println(str); // print RSSI (Received Signal Strength Indicator) - Serial.print("RSSI:\t\t"); + Serial.print("[SX1278] RSSI:\t\t"); Serial.print(lora.getRSSI()); Serial.println(" dBm"); // print SNR (Signal-to-Noise Ratio) - Serial.print("SNR:\t\t"); + Serial.print("[SX1278] SNR:\t\t"); Serial.print(lora.getSNR()); Serial.println(" dBm"); // print frequency error - Serial.print("Frequency error:\t"); + Serial.print("[SX1278] Frequency error:\t"); Serial.print(lora.getFrequencyError()); Serial.println(" Hz"); diff --git a/examples/SX127x/SX127x_Transmit/SX127x_Transmit.ino b/examples/SX127x/SX127x_Transmit/SX127x_Transmit.ino index 6e93f4fb..008e9156 100644 --- a/examples/SX127x/SX127x_Transmit/SX127x_Transmit.ino +++ b/examples/SX127x/SX127x_Transmit/SX127x_Transmit.ino @@ -58,7 +58,7 @@ void loop() { Serial.println(" success!"); // print measured data rate - Serial.print("Datarate:\t"); + Serial.print("[SX1278] Datarate:\t"); Serial.print(lora.getDataRate()); Serial.println(" bps"); diff --git a/examples/SX127x/SX127x_TransmitInterrupt/SX127x_TransmitInterrupt.ino b/examples/SX127x/SX127x_Transmit_Interrupt/SX127x_Transmit_Interrupt.ino similarity index 90% rename from examples/SX127x/SX127x_TransmitInterrupt/SX127x_TransmitInterrupt.ino rename to examples/SX127x/SX127x_Transmit_Interrupt/SX127x_Transmit_Interrupt.ino index bd882561..4b7756d8 100644 --- a/examples/SX127x/SX127x_TransmitInterrupt/SX127x_TransmitInterrupt.ino +++ b/examples/SX127x/SX127x_Transmit_Interrupt/SX127x_Transmit_Interrupt.ino @@ -1,5 +1,5 @@ /* - RadioLib Transmit with Inerrupts Example + RadioLib SX127x Transmit with Inerrupts Example This example transmits LoRa packets with one second delays between them. Each packet contains up to 256 bytes @@ -21,7 +21,7 @@ void setup() { Serial.begin(9600); // initialize SX1278 with default settings - Serial.print(F("Initializing ... ")); + Serial.print(F("[SX1278] Initializing ... ")); // carrier frequency: 434.0 MHz // bandwidth: 125.0 kHz // spreading factor: 9 @@ -45,7 +45,7 @@ void setup() { lora.setDio0Action(setFlag); // start transmitting the first packet - Serial.print(F("Sending first packet ... ")); + Serial.print(F("[SX1278] Sending first packet ... ")); // you can transmit C-string or Arduino string up to // 256 characters long @@ -75,13 +75,13 @@ void setFlag(void) { void loop() { // check if the previous transmission finished if(transmittedFlag) { - Serial.println(F("Packet transmission finished!")); + Serial.println(F("[SX1278] Packet transmission finished!")); // wait one second before next transmission delay(1000); // send another packet - Serial.print(F("Sending another packet ... ")); + Serial.print(F("[SX1278] Sending another packet ... ")); // you can transmit C-string or Arduino string up to // 256 characters long