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