-
-
Save AndrewLaganaro/bd2c83fe3d4d3dbbcdf0d630ce3a6343 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <RH_RF95.h> | |
#define RF95_CS 10 | |
#define RF95_INT 2 | |
#define RF95_RST 9 | |
#define RF95_FREQ 915.0 | |
RH_RF95 rf95(RF95_CS, RF95_INT); | |
// Message buffer | |
uint8_t data[RH_RF95_MAX_MESSAGE_LEN]; | |
RH_RF95::ModemConfig modem = {0x72, 0x74, 0x00}; | |
// Set the bandwidth for LoRa modem | |
void setBandwidth(uint32_t bw) { | |
uint8_t index; | |
uint32_t bandwidths[] = { | |
7800, | |
10400, | |
15600, | |
20800, | |
31250, | |
41700, | |
62500, | |
125000, | |
250000, | |
500000 | |
}; | |
for (index = 0x00; index < 9; index++) { | |
if (bw <= bandwidths[index]) { | |
break; | |
} | |
} | |
modem.reg_1d = (modem.reg_1d & 0x0f) | (index << 4); | |
} | |
// Set the coding rate for LoRa modem | |
void setCodingRate(uint8_t d) { | |
if (d == 5) { | |
modem.reg_1d = (modem.reg_1d & 0xf1) | 0x02; | |
} else if (d == 6) { | |
modem.reg_1d = (modem.reg_1d & 0xf1) | 0x04; | |
} else if (d == 7) { | |
modem.reg_1d = (modem.reg_1d & 0xf1) | 0x06; | |
} else if (d == 8) { | |
modem.reg_1d = (modem.reg_1d & 0xf1) | 0x08; | |
} | |
} | |
// Set the spreading factor for LoRa modem | |
void setSpreadingFactor(uint8_t sf) { | |
if (sf < 6 || sf > 12) { | |
return; | |
} | |
modem.reg_1e = (modem.reg_1e & 0x0f) | (sf << 4); | |
} | |
void setup() { | |
// Reset RF module | |
pinMode(RF95_RST, OUTPUT); | |
digitalWrite(RF95_RST, HIGH); | |
delay(10); | |
digitalWrite(RF95_RST, LOW); | |
delay(10); | |
digitalWrite(RF95_RST, HIGH); | |
delay(10); | |
// Init RF module | |
rf95.init(); | |
rf95.setFrequency(RF95_FREQ); | |
rf95.setTxPower(23, false); | |
setBandwidth(250000); | |
setCodingRate(8); | |
setSpreadingFactor(10); | |
rf95.setModemRegisters(&modem); | |
} | |
void loop() { | |
if (!rf95.available()) { | |
return; | |
} | |
uint8_t len = sizeof(data); | |
if (!rf95.recv(data, &len)) { | |
return; | |
} | |
if (len == 0) { | |
return; | |
} | |
data[0] = 0x00; | |
rf95.send(data, len); | |
rf95.waitPacketSent(); | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Required base64 library: | |
// https://www.arduino.cc/reference/en/libraries/base64/ | |
#include <Base64.h> | |
#include <RH_RF95.h> | |
#define RF95_CS 10 | |
#define RF95_INT 2 | |
#define RF95_RST 9 | |
#define RF95_FREQ 915.0 | |
RH_RF95 rf95(RF95_CS, RF95_INT); | |
// Message buffer | |
uint8_t data[RH_RF95_MAX_MESSAGE_LEN]; | |
RH_RF95::ModemConfig modem = {0x72, 0x74, 0x00}; | |
// Set the bandwidth for LoRa modem | |
void setBandwidth(uint32_t bw) { | |
uint8_t index; | |
uint32_t bandwidths[] = { | |
7800, | |
10400, | |
15600, | |
20800, | |
31250, | |
41700, | |
62500, | |
125000, | |
250000, | |
500000 | |
}; | |
for (index = 0x00; index < 9; index++) { | |
if (bw <= bandwidths[index]) { | |
break; | |
} | |
} | |
modem.reg_1d = (modem.reg_1d & 0x0f) | (index << 4); | |
} | |
// Set the coding rate for LoRa modem | |
void setCodingRate(uint8_t d) { | |
if (d == 5) { | |
modem.reg_1d = (modem.reg_1d & 0xf1) | 0x02; | |
} else if (d == 6) { | |
modem.reg_1d = (modem.reg_1d & 0xf1) | 0x04; | |
} else if (d == 7) { | |
modem.reg_1d = (modem.reg_1d & 0xf1) | 0x06; | |
} else if (d == 8) { | |
modem.reg_1d = (modem.reg_1d & 0xf1) | 0x08; | |
} | |
} | |
// Set the spreading factor for LoRa modem | |
void setSpreadingFactor(uint8_t sf) { | |
if (sf < 6 || sf > 12) { | |
return; | |
} | |
modem.reg_1e = (modem.reg_1e & 0x0f) | (sf << 4); | |
} | |
void setup() { | |
Serial.begin(9600); | |
// Reset RF module | |
pinMode(RF95_RST, OUTPUT); | |
digitalWrite(RF95_RST, HIGH); | |
delay(10); | |
digitalWrite(RF95_RST, LOW); | |
delay(10); | |
digitalWrite(RF95_RST, HIGH); | |
delay(10); | |
// Init RF module | |
rf95.init(); | |
rf95.setFrequency(RF95_FREQ); | |
rf95.setTxPower(23, false); | |
setBandwidth(250000); | |
setCodingRate(8); | |
setSpreadingFactor(10); | |
rf95.setModemRegisters(&modem); | |
} | |
void loop() { | |
if (!rf95.available()) { | |
return; | |
} | |
uint8_t len = sizeof(data); | |
if (!rf95.recv(data, &len)) { | |
return; | |
} | |
// Messages are base64 encoded so that they can be | |
// newline delimited over serial text | |
int n = Base64.encodedLength(len); | |
char data64[n]; | |
Base64.encode(data64, data, len); | |
Serial.println(data64); | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <RH_RF95.h> | |
#define RF95_CS 10 | |
#define RF95_INT 2 | |
#define RF95_RST 9 | |
#define RF95_FREQ 915.0 | |
RH_RF95 rf95(RF95_CS, RF95_INT); | |
// Message buffer | |
uint8_t data[RH_RF95_MAX_MESSAGE_LEN]; | |
RH_RF95::ModemConfig modem = {0x72, 0x74, 0x00}; | |
// Set the bandwidth for LoRa modem | |
void setBandwidth(uint32_t bw) { | |
uint8_t index; | |
uint32_t bandwidths[] = { | |
7800, | |
10400, | |
15600, | |
20800, | |
31250, | |
41700, | |
62500, | |
125000, | |
250000, | |
500000 | |
}; | |
for (index = 0x00; index < 9; index++) { | |
if (bw <= bandwidths[index]) { | |
break; | |
} | |
} | |
modem.reg_1d = (modem.reg_1d & 0x0f) | (index << 4); | |
} | |
// Set the coding rate for LoRa modem | |
void setCodingRate(uint8_t d) { | |
if (d == 5) { | |
modem.reg_1d = (modem.reg_1d & 0xf1) | 0x02; | |
} else if (d == 6) { | |
modem.reg_1d = (modem.reg_1d & 0xf1) | 0x04; | |
} else if (d == 7) { | |
modem.reg_1d = (modem.reg_1d & 0xf1) | 0x06; | |
} else if (d == 8) { | |
modem.reg_1d = (modem.reg_1d & 0xf1) | 0x08; | |
} | |
} | |
// Set the spreading factor for LoRa modem | |
void setSpreadingFactor(uint8_t sf) { | |
if (sf < 6 || sf > 12) { | |
return; | |
} | |
modem.reg_1e = (modem.reg_1e & 0x0f) | (sf << 4); | |
} | |
void setup() { | |
// Reset RF module | |
pinMode(RF95_RST, OUTPUT); | |
digitalWrite(RF95_RST, HIGH); | |
delay(10); | |
digitalWrite(RF95_RST, LOW); | |
delay(10); | |
digitalWrite(RF95_RST, HIGH); | |
delay(10); | |
// Init RF module | |
rf95.init(); | |
rf95.setFrequency(RF95_FREQ); | |
rf95.setTxPower(23, false); | |
setBandwidth(250000); | |
setCodingRate(8); | |
setSpreadingFactor(10); | |
rf95.setModemRegisters(&modem); | |
} | |
// Sends "Hello world!" with id=0x01 every 5 seconds | |
void loop() { | |
// Set ID | |
data[0] = 0x01; | |
sprintf(data + 1, "Hello world!"); | |
rf95.send(data, 1 + strlen(data + 1)); | |
rf95.waitPacketSent(); | |
Serial.println("Done!"); | |
delay(5000); | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import datetime | |
from base64 import b64decode | |
try: | |
from serial import Serial | |
from serial.tools.list_ports import comports | |
except ImportError: | |
print('pyserial not installed, try: pip install pyserial') | |
exit(1) | |
device = None | |
for x in comports(): | |
device = x.device | |
if device is None: | |
print('No device found') | |
exit(1) | |
s = Serial(device) | |
while True: | |
line = s.readline() | |
data = b64decode(line) | |
sender, data = data[0], data[1:] | |
if sender != 0x00: | |
# skip non-repeater messages | |
continue | |
now = datetime.datetime.now() | |
print(now.strftime('%Y-%m-%d %H:%M:%S'), sender, data) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment