TODO: Implement real gps data - Bugfix - working now

This commit is contained in:
Ano-sys
2025-07-18 21:21:54 +02:00
parent 63e701c446
commit 8b40b74366
2 changed files with 141 additions and 47 deletions
+60 -27
View File
@@ -1,5 +1,8 @@
#include <SPI.h> #include <SPI.h>
#include <LoRa.h> #include <LoRa.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SYNC_WORD 0xCE #define SYNC_WORD 0xCE
#define SENDER_ID 0xAA #define SENDER_ID 0xAA
@@ -13,23 +16,29 @@
#define LORA_IRQ 26 #define LORA_IRQ 26
#define LORA_FREQ 868E6 #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) { void sendMessage(const String& msg) {
LoRa.beginPacket(); LoRa.beginPacket();
LoRa.write(SYNC_WORD); LoRa.write(SYNC_WORD);
LoRa.write(SELF_ID); LoRa.write(SENDER_ID);
LoRa.write(msg.length()); LoRa.write(msg.length());
LoRa.print(msg); LoRa.print(msg);
LoRa.endPacket(true); LoRa.endPacket(true);
} }
bool receiveMessage(String& out) { bool receiveMessage(String& out) {
int packetSize = LoRa.parsePacket(); LoRa.parsePacket();
if (!packetSize) return false;
byte sync = LoRa.read(); byte sync = LoRa.read();
byte sender = LoRa.read(); byte sender = LoRa.read();
if (sync != SYNC_WORD || sender != SENDER_ID) { if (sync != SYNC_WORD || sender != SELF_ID) {
LoRa.flush(); LoRa.flush();
// Serial.println("Unidentifiziertes Paket: " + String(sync) + String(sender));
return false; return false;
} }
@@ -39,63 +48,87 @@ bool receiveMessage(String& out) {
if (data.length() != len) { if (data.length() != len) {
out = "ERR: LEN"; out = "ERR: LEN";
return true; } else {
out = data;
sendMessage("ACK");
} }
sendMessage("ACK");
out = data;
return true; 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() { void printHelp() {
Serial.println("g Standort anfragen\nh Hilfe"); Serial.println("g Standort anfragen\nh Hilfe");
showOnOLED("Befehle:", "g Standort / h Hilfe");
} }
void handleCommandG(){ void handleCommandG() {
sendMessage("g"); sendMessage("g");
unsigned long t0 = millis(); unsigned long t0 = millis();
String answer; String answer;
while (millis() - t0 < 1000) { while (millis() - t0 < 1000) {
if (receiveMessage(answer)) { if (receiveMessage(answer)) {
Serial.println(answer); Serial.println(answer);
break; showOnOLED("Antwort von Sender:", answer);
return;
} }
delay(10); delay(10);
} }
if (millis() - t0 >= 1000) Serial.println("Timeout"); Serial.println("Timeout");
showOnOLED("Timeout beim", "Empfangen");
} }
void setup() { void setup() {
Serial.begin(115200); 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); SPI.begin(LORA_SCK, LORA_MISO, LORA_MOSI, LORA_CS);
LoRa.setPins(LORA_CS, LORA_RST, LORA_IRQ); LoRa.setPins(LORA_CS, LORA_RST, LORA_IRQ);
if (!LoRa.begin(LORA_FREQ)) { if (!LoRa.begin(LORA_FREQ)) {
while (true) { Serial.println("Konnte LoRa nicht initialisieren!");
Serial.println("Konnte LoRa nicht initialisieren!\nBitte neustarten!"); showOnOLED("LoRa Init fehl", "Neustart nötig");
delay(1000); while (1) delay(1000);
}
} }
LoRa.enableCrc(); LoRa.enableCrc();
// LoRa.setSyncWord(SYNC_WORD); // this would have been simpler nevermind showOnOLED("LoRa bereit", "Creator:", "Timo Niemann");
} }
void loop() { void loop() {
if (Serial.available()) { if (Serial.available()) {
char cmd = Serial.read(); char cmd = Serial.read();
switch (cmd) { switch (cmd) {
case 'h': case 'h': printHelp(); break;
printHelp(); case 'g': handleCommandG(); break;
break; default: printHelp(); break;
case 'g':
handleCommandG();
break;
default:
printHelp();
break;
} }
} }
// passive listening
String msg; 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);
}
} }
+81 -20
View File
@@ -1,8 +1,11 @@
#include <SPI.h> #include <SPI.h>
#include <LoRa.h> #include <LoRa.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SYNC_WORD 0xCE #define SYNC_WORD 0xCE
#define DEST_ID 0xAB // receiver #define RECEIVER_ID 0xAB // receiver
#define SELF_ID 0xAA // sender #define SELF_ID 0xAA // sender
#define LORA_SCK 5 #define LORA_SCK 5
@@ -13,10 +16,16 @@
#define LORA_IRQ 26 #define LORA_IRQ 26
#define LORA_FREQ 868E6 #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) { void sendMessage(const String& msg) {
LoRa.beginPacket(); LoRa.beginPacket();
LoRa.write(DEST_ID); LoRa.write(SYNC_WORD);
LoRa.write(SELF_ID); LoRa.write(RECEIVER_ID);
LoRa.write(msg.length()); LoRa.write(msg.length());
LoRa.print(msg); LoRa.print(msg);
LoRa.endPacket(true); LoRa.endPacket(true);
@@ -31,59 +40,111 @@ bool waitForPacket(unsigned long timeout_ms) {
return false; // Timeout return false; // Timeout
} }
bool getPacket(String& payload, byte& sender) { bool getPacket(String& payload, byte& id) {
int size = LoRa.parsePacket(); LoRa.parsePacket();
if (!size) return false;
byte dest = LoRa.read(); byte sync = LoRa.read();
sender = LoRa.read(); id = LoRa.read();
byte len = LoRa.read();
if (dest != SELF_ID && dest != 0xFF) { if (sync != SYNC_WORD || id != SELF_ID) {
LoRa.flush(); LoRa.flush();
Serial.println("Unidentifiziertes Paket: " + String(sync) + String(id));
return false; return false;
} }
byte len = LoRa.read();
while (LoRa.available()) payload += (char)LoRa.read(); while (LoRa.available()) payload += (char)LoRa.read();
return (payload.length() == len); return (payload.length() == len);
} }
/*
bool waitForAck(unsigned long timeout_ms = 1000) { bool waitForAck(unsigned long timeout_ms = 1000) {
if (!waitForPacket(timeout_ms)) return false; if (!waitForPacket(timeout_ms)) return false;
String payload; String payload;
byte snd; byte snd;
if (!getPacket(payload, snd)) return false; 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() { String readGpsLine() {
return "48.12345,11.56789"; return "GPS DATEN!";
} }
void setup() { void setup() {
Serial.begin(115200); 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); SPI.begin(LORA_SCK, LORA_MISO, LORA_MOSI, LORA_CS);
LoRa.setPins(LORA_CS, LORA_RST, LORA_IRQ); LoRa.setPins(LORA_CS, LORA_RST, LORA_IRQ);
if (!LoRa.begin(LORA_FREQ)) if (!LoRa.begin(LORA_FREQ)) {
while (true) Serial.println("Konnte LoRa nicht initialisieren!");
; showOnOLED("LoRa Init fehl", "Neustart nötig");
while (1) delay(1000);
LoRa.setSyncWord(SYNC_WORD); }
LoRa.enableCrc(); LoRa.enableCrc();
showOnOLED("LoRa bereit", "Creator:", "Timo Niemann");
} }
void loop() { void loop() {
// showOnOLED("Status:", "Warten");
if (waitForPacket(10)) { if (waitForPacket(10)) {
String cmd; String cmd;
byte snd; byte snd;
if (!getPacket(cmd, snd)) return; if (!getPacket(cmd, snd)) {
showOnOLED("Fehler:", "Packet ungueltig");
return;
}
if (cmd == "g") {
Serial.println("Empfangen: " + cmd);
showOnOLED("Empfangen von:", "ID " + String(snd), "Cmd: " + cmd);
if (snd == DEST_ID && cmd == "g") {
String gps = readGpsLine(); String gps = readGpsLine();
Serial.println("Sende GPS: " + gps);
showOnOLED("Sende GPS Koords:", gps);
sendMessage(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);
} }
} }
} }