#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!"); } } }