TODO: Implement real gps data - Bugfix - working now
This commit is contained in:
@@ -1,5 +1,8 @@
|
||||
#include <SPI.h>
|
||||
#include <LoRa.h>
|
||||
#include <Wire.h>
|
||||
#include <Adafruit_GFX.h>
|
||||
#include <Adafruit_SSD1306.h>
|
||||
|
||||
#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);
|
||||
}
|
||||
}
|
||||
|
||||
+81
-20
@@ -1,8 +1,11 @@
|
||||
#include <SPI.h>
|
||||
#include <LoRa.h>
|
||||
#include <Wire.h>
|
||||
#include <Adafruit_GFX.h>
|
||||
#include <Adafruit_SSD1306.h>
|
||||
|
||||
#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 (cmd == "g") {
|
||||
Serial.println("Empfangen: " + cmd);
|
||||
showOnOLED("Empfangen von:", "ID " + String(snd), "Cmd: " + cmd);
|
||||
|
||||
if (snd == DEST_ID && cmd == "g") {
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user