diff --git a/.travis.yml b/.travis.yml index b574b4e..43f50ee 100644 --- a/.travis.yml +++ b/.travis.yml @@ -37,3 +37,4 @@ script: - buildExampleSketch LoRaSenderNonBlocking - buildExampleSketch LoRaSetSpread - buildExampleSketch LoRaSetSyncWord + - buildExampleSketch LoRandom diff --git a/API.md b/API.md index 2d86815..fc712b3 100644 --- a/API.md +++ b/API.md @@ -366,6 +366,14 @@ LoRa.disableInvertIQ(); ## Other functions +### beginRandom + +Initializes the random number generator. + +``` +LoRa.beginRandom(); +``` + ### Random Generate a random byte, based on the Wideband RSSI measurement. diff --git a/examples/LoRandom/LoRandom.ino b/examples/LoRandom/LoRandom.ino new file mode 100644 index 0000000..2ffd8d8 --- /dev/null +++ b/examples/LoRandom/LoRandom.ino @@ -0,0 +1,66 @@ +/******************************************************************** + LoRandomSeed + + Example demonstrating how to generate random numbers using LoRa. + + created 7 Sep 2020 + by Kongduino + adapted by Andres Sabas +***********************************************************************/ + +#include <SPI.h> +#include <LoRa.h> + +void setup() { + Serial.begin(9600); + while(!Serial); + Serial.print(F("\n\n\n[SX1276] Initializing ... ")); + if (!LoRa.begin(868E6)) { + Serial.println("Starting LoRa failed!"); + while (1); + } + Serial.print("Setting up LoRa "); + + LoRa.setTxPower(20, PA_OUTPUT_PA_BOOST_PIN); + LoRa.setPreambleLength(8); + LoRa.beginRandom(); + Serial.println("End of setup\n\n"); +} + +void loop() { + byte randomBytes[256]; + // We'll build a stock of random bytes for use in code + int randomIndex = 0; + unsigned int i; + for (i = 0; i < 256; i++) { + int x = LoRa.random(); + randomBytes[i] = x; + } + randomIndex = 0; + hexDump(randomBytes, 256); + delay(2000); +} + +void hexDump(unsigned char *buf, unsigned int len) { + String s = "|", t = "| |"; + Serial.println(F(" |.0 .1 .2 .3 .4 .5 .6 .7 .8 .9 .a .b .c .d .e .f |")); + Serial.println(F(" +------------------------------------------------+ +----------------+")); + for ( unsigned int i = 0; i < len; i += 16) { + for (int j = 0; j < 16; j++) { + if (i + j >= len) { + s = s + " "; t = t + " "; + } else { + char c = buf[i + j]; + if (c < 16) s = s + "0"; + s = s + String(c, HEX) + " "; + if (c < 32 || c > 127) t = t + "."; + else t = t + (String(c)); + } + } + int index = i / 16; + Serial.print(index, HEX); Serial.write('.'); + Serial.println(s + t + "|"); + s = "|"; t = "| |"; + } + Serial.println(F(" +------------------------------------------------+ +----------------+")); +} \ No newline at end of file diff --git a/keywords.txt b/keywords.txt index 63e0e9a..5d3bde3 100644 --- a/keywords.txt +++ b/keywords.txt @@ -48,6 +48,7 @@ disableCrc KEYWORD2 enableInvertIQ KEYWORD2 disableInvertIQ KEYWORD2 +beginRandom KEYWORD2 random KEYWORD2 setPins KEYWORD2 setSPIFrequency KEYWORD2 diff --git a/src/LoRa.cpp b/src/LoRa.cpp index 4396518..e69e089 100644 --- a/src/LoRa.cpp +++ b/src/LoRa.cpp @@ -412,6 +412,11 @@ void LoRaClass::sleep() writeRegister(REG_OP_MODE, MODE_LONG_RANGE_MODE | MODE_SLEEP); } +void LoRaClass::continuousRxMode() +{ + writeRegister(REG_OP_MODE, 0x72); +} + void LoRaClass::setTxPower(int level, int outputPin) { if (PA_OUTPUT_RFO_PIN == outputPin) { @@ -607,9 +612,21 @@ void LoRaClass::setOCP(uint8_t mA) writeRegister(REG_OCP, 0x20 | (0x1F & ocpTrim)); } +void LoRaClass::beginRandom() { + continuousRxMode(); + setSignalBandwidth(125E3); + setCodingRate4(5); + setSpreadingFactor(7); +} + byte LoRaClass::random() { - return readRegister(REG_RSSI_WIDEBAND); + uint8_t x = 0; + for (uint8_t j = 0; j < 8; j++) { + x += (readRegister(REG_RSSI_WIDEBAND) & 0x01); + x = x << 1; + } + return x; } void LoRaClass::setPins(int ss, int reset, int dio0) diff --git a/src/LoRa.h b/src/LoRa.h index c1671c1..8860256 100644 --- a/src/LoRa.h +++ b/src/LoRa.h @@ -81,7 +81,8 @@ class LoRaClass : public Stream { // deprecated void crc() { enableCrc(); } void noCrc() { disableCrc(); } - + + void beginRandom(); byte random(); void setPins(int ss = LORA_DEFAULT_SS_PIN, int reset = LORA_DEFAULT_RESET_PIN, int dio0 = LORA_DEFAULT_DIO0_PIN); @@ -108,6 +109,8 @@ class LoRaClass : public Stream { static void onDio0Rise(); + void continuousRxMode(); + private: SPISettings _spiSettings; SPIClass* _spi;