90 lines
1.8 KiB
Arduino
90 lines
1.8 KiB
Arduino
#include <SPI.h>
|
||
#include <LoRa.h>
|
||
|
||
#define SYNC_WORD 0xCE
|
||
#define DEST_ID 0xAB // receiver
|
||
#define SELF_ID 0xAA // sender
|
||
|
||
#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(DEST_ID);
|
||
LoRa.write(SELF_ID);
|
||
LoRa.write(msg.length());
|
||
LoRa.print(msg);
|
||
LoRa.endPacket(true);
|
||
}
|
||
|
||
bool waitForPacket(unsigned long timeout_ms) {
|
||
unsigned long t0 = millis();
|
||
while (millis() - t0 < timeout_ms) {
|
||
if (LoRa.parsePacket()) return true;
|
||
delay(5);
|
||
}
|
||
return false; // Timeout
|
||
}
|
||
|
||
bool getPacket(String& payload, byte& sender) {
|
||
int size = LoRa.parsePacket();
|
||
if (!size) return false;
|
||
|
||
byte dest = LoRa.read();
|
||
sender = LoRa.read();
|
||
byte len = LoRa.read();
|
||
|
||
if (dest != SELF_ID && dest != 0xFF) {
|
||
LoRa.flush();
|
||
return false;
|
||
}
|
||
|
||
while (LoRa.available()) payload += (char)LoRa.read();
|
||
return (payload.length() == len);
|
||
}
|
||
|
||
bool waitForAck(unsigned long timeout_ms = 1000) {
|
||
if (!waitForPacket(timeout_ms)) return false;
|
||
String payload;
|
||
byte snd;
|
||
if (!getPacket(payload, snd)) return false;
|
||
return (snd == DEST_ID && payload == "ACK");
|
||
}
|
||
|
||
String readGpsLine() {
|
||
return "48.12345,11.56789";
|
||
}
|
||
|
||
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)
|
||
;
|
||
|
||
LoRa.setSyncWord(SYNC_WORD);
|
||
LoRa.enableCrc();
|
||
}
|
||
|
||
void loop() {
|
||
if (waitForPacket(10)) {
|
||
String cmd;
|
||
byte snd;
|
||
if (!getPacket(cmd, snd)) return;
|
||
|
||
if (snd == DEST_ID && cmd == "g") {
|
||
String gps = readGpsLine();
|
||
sendMessage(gps);
|
||
|
||
if (!waitForAck()) Serial.println("ACK fehlte!");
|
||
}
|
||
}
|
||
}
|