From 8b40b74366879f286f15e7520dee51d84589f396 Mon Sep 17 00:00:00 2001 From: Ano-sys Date: Fri, 18 Jul 2025 21:21:54 +0200 Subject: [PATCH] TODO: Implement real gps data - Bugfix - working now --- LoRaReceiver/LoRaReceiver.ino | 87 ++++++++++++++++++++--------- LoRaSender/LoRaSender.ino | 101 +++++++++++++++++++++++++++------- 2 files changed, 141 insertions(+), 47 deletions(-) diff --git a/LoRaReceiver/LoRaReceiver.ino b/LoRaReceiver/LoRaReceiver.ino index 8c4557a..3b155c3 100644 --- a/LoRaReceiver/LoRaReceiver.ino +++ b/LoRaReceiver/LoRaReceiver.ino @@ -1,5 +1,8 @@ #include #include +#include +#include +#include #define SYNC_WORD 0xCE #define SENDER_ID 0xAA @@ -13,23 +16,29 @@ #define LORA_IRQ 26 #define LORA_FREQ 868E6 +// OLED Settings +#define SCREEN_WIDTH 128 +#define SCREEN_HEIGHT 64 +#define OLED_RESET -1 +Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); + void sendMessage(const String& msg) { LoRa.beginPacket(); LoRa.write(SYNC_WORD); - LoRa.write(SELF_ID); + LoRa.write(SENDER_ID); LoRa.write(msg.length()); LoRa.print(msg); LoRa.endPacket(true); } bool receiveMessage(String& out) { - int packetSize = LoRa.parsePacket(); - if (!packetSize) return false; + LoRa.parsePacket(); byte sync = LoRa.read(); byte sender = LoRa.read(); - if (sync != SYNC_WORD || sender != SENDER_ID) { + if (sync != SYNC_WORD || sender != SELF_ID) { LoRa.flush(); + // Serial.println("Unidentifiziertes Paket: " + String(sync) + String(sender)); return false; } @@ -39,63 +48,87 @@ bool receiveMessage(String& out) { if (data.length() != len) { out = "ERR: LEN"; - return true; + } else { + out = data; + sendMessage("ACK"); } - - sendMessage("ACK"); - out = data; return true; } +void showOnOLED(const String& line1, const String& line2 = "", const String& line3 = "") { + display.clearDisplay(); + display.setTextSize(1); + display.setTextColor(SSD1306_WHITE); + display.setCursor(0, 0); + display.println(line1); + if (line2.length()) { + display.setCursor(0, 16); + display.println(line2); + } + if (line3.length()) { + display.setCursor(0, 32); + display.println(line3); + } + display.display(); +} + void printHelp() { Serial.println("g – Standort anfragen\nh – Hilfe"); + showOnOLED("Befehle:", "g Standort / h Hilfe"); } -void handleCommandG(){ +void handleCommandG() { sendMessage("g"); unsigned long t0 = millis(); String answer; while (millis() - t0 < 1000) { if (receiveMessage(answer)) { Serial.println(answer); - break; + showOnOLED("Antwort von Sender:", answer); + return; } delay(10); } - if (millis() - t0 >= 1000) Serial.println("Timeout"); + Serial.println("Timeout"); + showOnOLED("Timeout beim", "Empfangen"); } void setup() { Serial.begin(115200); + + // OLED init + Wire.begin(); // SDA/SCL Default + if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { + Serial.println("OLED init fehlgeschlagen"); + while (1) delay(1000); + } + showOnOLED("LoRa OLED Init", "Bitte warten..."); + + // LoRa init 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); - } + Serial.println("Konnte LoRa nicht initialisieren!"); + showOnOLED("LoRa Init fehl", "Neustart nötig"); + while (1) delay(1000); } LoRa.enableCrc(); - // LoRa.setSyncWord(SYNC_WORD); // this would have been simpler nevermind + showOnOLED("LoRa bereit", "Creator:", "Timo Niemann"); } void loop() { if (Serial.available()) { char cmd = Serial.read(); switch (cmd) { - case 'h': - printHelp(); - break; - case 'g': - handleCommandG(); - break; - default: - printHelp(); - break; + 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()); + if (receiveMessage(msg)) { + Serial.printf("RX: %s\n", msg.c_str()); + showOnOLED("Empfangen:", msg); + } } diff --git a/LoRaSender/LoRaSender.ino b/LoRaSender/LoRaSender.ino index 72e5afe..172c606 100644 --- a/LoRaSender/LoRaSender.ino +++ b/LoRaSender/LoRaSender.ino @@ -1,8 +1,11 @@ #include #include +#include +#include +#include #define SYNC_WORD 0xCE -#define DEST_ID 0xAB // receiver +#define RECEIVER_ID 0xAB // receiver #define SELF_ID 0xAA // sender #define LORA_SCK 5 @@ -13,10 +16,16 @@ #define LORA_IRQ 26 #define LORA_FREQ 868E6 +// OLED Settings +#define SCREEN_WIDTH 128 +#define SCREEN_HEIGHT 64 +#define OLED_RESET -1 +Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); + void sendMessage(const String& msg) { LoRa.beginPacket(); - LoRa.write(DEST_ID); - LoRa.write(SELF_ID); + LoRa.write(SYNC_WORD); + LoRa.write(RECEIVER_ID); LoRa.write(msg.length()); LoRa.print(msg); LoRa.endPacket(true); @@ -31,59 +40,111 @@ bool waitForPacket(unsigned long timeout_ms) { return false; // Timeout } -bool getPacket(String& payload, byte& sender) { - int size = LoRa.parsePacket(); - if (!size) return false; +bool getPacket(String& payload, byte& id) { + LoRa.parsePacket(); - byte dest = LoRa.read(); - sender = LoRa.read(); - byte len = LoRa.read(); + byte sync = LoRa.read(); + id = LoRa.read(); - if (dest != SELF_ID && dest != 0xFF) { + if (sync != SYNC_WORD || id != SELF_ID) { LoRa.flush(); + Serial.println("Unidentifiziertes Paket: " + String(sync) + String(id)); return false; } + byte len = LoRa.read(); + 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"); + return (snd == RECEIVER_ID && payload == "ACK"); +} +*/ + +void showOnOLED(const String& line1, const String& line2 = "", const String& line3 = "") { + display.clearDisplay(); + display.setTextSize(1); + display.setTextColor(SSD1306_WHITE); + display.setCursor(0, 0); + display.println(line1); + if (line2.length()) { + display.setCursor(0, 16); + display.println(line2); + } + if (line3.length()) { + display.setCursor(0, 32); + display.println(line3); + } + display.display(); } String readGpsLine() { - return "48.12345,11.56789"; + return "GPS DATEN!"; } void setup() { Serial.begin(115200); + // OLED init + Wire.begin(); // SDA/SCL Default + if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { + Serial.println("OLED init fehlgeschlagen"); + while (1) delay(1000); + } + showOnOLED("LoRa OLED Init", "Bitte warten..."); + + // LoRa init 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); + if (!LoRa.begin(LORA_FREQ)) { + Serial.println("Konnte LoRa nicht initialisieren!"); + showOnOLED("LoRa Init fehl", "Neustart nötig"); + while (1) delay(1000); + } LoRa.enableCrc(); + showOnOLED("LoRa bereit", "Creator:", "Timo Niemann"); } void loop() { + // showOnOLED("Status:", "Warten"); + if (waitForPacket(10)) { String cmd; byte snd; - if (!getPacket(cmd, snd)) return; + if (!getPacket(cmd, snd)) { + showOnOLED("Fehler:", "Packet ungueltig"); + return; + } - if (snd == DEST_ID && cmd == "g") { + if (cmd == "g") { + Serial.println("Empfangen: " + cmd); + showOnOLED("Empfangen von:", "ID " + String(snd), "Cmd: " + cmd); + String gps = readGpsLine(); + Serial.println("Sende GPS: " + gps); + showOnOLED("Sende GPS Koords:", gps); + sendMessage(gps); - if (!waitForAck()) Serial.println("ACK fehlte!"); + /* + // Auf ACK warten + if (waitForAck()) { + Serial.println("ACK empfangen"); + showOnOLED("ACK empfangen", ""); + } else { + Serial.println("ACK fehlte!"); + showOnOLED("WARNUNG:", "Kein ACK erhalten"); + } + */ + + delay(1000); } } }