102 lines
2.0 KiB
Arduino
102 lines
2.0 KiB
Arduino
#include <SPI.h>
|
||
#include <LoRa.h>
|
||
|
||
#define SYNC_WORD 0xCE
|
||
#define SENDER_ID 0xAA
|
||
#define SELF_ID 0xAB
|
||
|
||
#define LORA_SCK 5
|
||
#define LORA_MISO 19
|
||
#define LORA_MOSI 27
|
||
#define LORA_CS 18
|
||
#define LORA_RST 23
|
||
#define LORA_IRQ 26
|
||
#define LORA_FREQ 868E6
|
||
|
||
void sendMessage(const String& msg) {
|
||
LoRa.beginPacket();
|
||
LoRa.write(SYNC_WORD);
|
||
LoRa.write(SELF_ID);
|
||
LoRa.write(msg.length());
|
||
LoRa.print(msg);
|
||
LoRa.endPacket(true);
|
||
}
|
||
|
||
bool receiveMessage(String& out) {
|
||
int packetSize = LoRa.parsePacket();
|
||
if (!packetSize) return false;
|
||
|
||
byte sync = LoRa.read();
|
||
byte sender = LoRa.read();
|
||
if (sync != SYNC_WORD || sender != SENDER_ID) {
|
||
LoRa.flush();
|
||
return false;
|
||
}
|
||
|
||
byte len = LoRa.read();
|
||
String data;
|
||
while (LoRa.available()) data += (char)LoRa.read();
|
||
|
||
if (data.length() != len) {
|
||
out = "ERR: LEN";
|
||
return true;
|
||
}
|
||
|
||
sendMessage("ACK");
|
||
out = data;
|
||
return true;
|
||
}
|
||
|
||
void printHelp() {
|
||
Serial.println("g – Standort anfragen\nh – Hilfe");
|
||
}
|
||
|
||
void handleCommandG(){
|
||
sendMessage("g");
|
||
unsigned long t0 = millis();
|
||
String answer;
|
||
while (millis() - t0 < 1000) {
|
||
if (receiveMessage(answer)) {
|
||
Serial.println(answer);
|
||
break;
|
||
}
|
||
delay(10);
|
||
}
|
||
if (millis() - t0 >= 1000) Serial.println("Timeout");
|
||
}
|
||
|
||
void setup() {
|
||
Serial.begin(115200);
|
||
SPI.begin(LORA_SCK, LORA_MISO, LORA_MOSI, LORA_CS);
|
||
LoRa.setPins(LORA_CS, LORA_RST, LORA_IRQ);
|
||
if (!LoRa.begin(LORA_FREQ)) {
|
||
while (true) {
|
||
Serial.println("Konnte LoRa nicht initialisieren!\nBitte neustarten!");
|
||
delay(1000);
|
||
}
|
||
}
|
||
LoRa.enableCrc();
|
||
// LoRa.setSyncWord(SYNC_WORD); // this would have been simpler nevermind
|
||
}
|
||
|
||
void loop() {
|
||
if (Serial.available()) {
|
||
char cmd = Serial.read();
|
||
switch (cmd) {
|
||
case 'h':
|
||
printHelp();
|
||
break;
|
||
case 'g':
|
||
handleCommandG();
|
||
break;
|
||
default:
|
||
printHelp();
|
||
break;
|
||
}
|
||
}
|
||
|
||
// passive listening
|
||
String msg;
|
||
if (receiveMessage(msg)) Serial.printf("RX: %s\n", msg.c_str());
|
||
}
|