Skip to content

Instantly share code, notes, and snippets.

@wybiral
Created August 14, 2020 14:28
Show Gist options
  • Save wybiral/3bc760db35cfe262872b8c96ac92be80 to your computer and use it in GitHub Desktop.
Save wybiral/3bc760db35cfe262872b8c96ac92be80 to your computer and use it in GitHub Desktop.
#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();
}
// 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);
}
#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);
}
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