From 63e701c446bfa90dc2d505f2fa36222781cfeba0 Mon Sep 17 00:00:00 2001 From: Ano-sys Date: Tue, 15 Jul 2025 16:29:24 +0200 Subject: [PATCH] Initial push - gps needs to be implemented in sender --- LoRaReceiver/LoRaReceiver.ino | 101 ++++++++++++++++++++++++++++++++++ LoRaSender/LoRaSender.ino | 89 ++++++++++++++++++++++++++++++ 2 files changed, 190 insertions(+) create mode 100644 LoRaReceiver/LoRaReceiver.ino create mode 100644 LoRaSender/LoRaSender.ino diff --git a/LoRaReceiver/LoRaReceiver.ino b/LoRaReceiver/LoRaReceiver.ino new file mode 100644 index 0000000..8c4557a --- /dev/null +++ b/LoRaReceiver/LoRaReceiver.ino @@ -0,0 +1,101 @@ +#include +#include + +#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()); +} diff --git a/LoRaSender/LoRaSender.ino b/LoRaSender/LoRaSender.ino new file mode 100644 index 0000000..72e5afe --- /dev/null +++ b/LoRaSender/LoRaSender.ino @@ -0,0 +1,89 @@ +#include +#include + +#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!"); + } + } +}