From cd30c259566a1b79b098e2ab165523aedf13fdad Mon Sep 17 00:00:00 2001 From: Ano-sys Date: Sun, 10 Aug 2025 15:35:09 +0200 Subject: [PATCH] [!C] New Class for sd writer --- LoRaSender/LoRaSender.ino | 21 +++++++------- LoRaSender/SDCardHelper.ino | 58 +++++++++++++++++++++++++++++++++++++ 2 files changed, 69 insertions(+), 10 deletions(-) create mode 100644 LoRaSender/SDCardHelper.ino diff --git a/LoRaSender/LoRaSender.ino b/LoRaSender/LoRaSender.ino index 7868eef..b27c3b2 100644 --- a/LoRaSender/LoRaSender.ino +++ b/LoRaSender/LoRaSender.ino @@ -5,6 +5,7 @@ #include #include +#include "SDCardHelper.ino" // LORA Settings #define SYNC_WORD 0xCE @@ -29,9 +30,13 @@ #define SCREEN_HEIGHT 64 #define OLED_RESET -1 +#define SD_CS 13 + Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); TinyGPSPlus gps; +SDHelper logger(SD_CS, FAM_W); + void sendMessage(const String& msg) { LoRa.beginPacket(); LoRa.write(SYNC_WORD); @@ -68,16 +73,6 @@ bool getPacket(String& payload, byte& id) { 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 == RECEIVER_ID && payload == "ACK"); -} -*/ - void showOnOLED(const String& line1, const String& line2 = "", const String& line3 = "", const String& line4 = "") { display.clearDisplay(); display.setTextSize(1); @@ -119,6 +114,11 @@ void SerialPrintGPS(){ Serial.println(""); } +void storeToSD(const String& lat, const String& lng){ + static int i = 1; + logger.Log(String(i++) + ": " + lat + " " + lng); +} + void setup() { Serial.begin(115200); Serial2.begin(_BAUDRATE_GPS, SERIAL_8N1, _RX_GPS, _TX_GPS); @@ -178,6 +178,7 @@ void loop() { Serial.println("Sende GPS:\n" + lat_str + "\n" + lng_str); showOnOLED("Sende GPS Koords:", lat_str, lng_str, satellites); + storeToSD(lat_str, lng_str); sendMessage(lat_str + "\n\n" + lng_str + "\n\n" + satellites); } } diff --git a/LoRaSender/SDCardHelper.ino b/LoRaSender/SDCardHelper.ino new file mode 100644 index 0000000..cc6eec3 --- /dev/null +++ b/LoRaSender/SDCardHelper.ino @@ -0,0 +1,58 @@ +#include +#include + +typedef enum{ + FAM_R, + FAM_W +} FileAccessMode; + +class SDHelper { +private: + uint8_t _cs; + FileAccessMode _fam; + File _stream; + String _filename; + bool _available = false; + SPIClass _spi(HSPI); + + String getNewFilename() { + static unsigned long i = 0; + String name; + do { + name = "coords" + String(i++) + ".txt"; + } while (SD.exists(name.c_str())); + return name; + } + +public: + SDHelper(uint8_t csPin, FileAccessMode fam, String filename = "") : _cs(csPin), _fam(fam) { + _spi.begin(14, 2, 15, 13); + if(!SD.begin(_cs, _spi)){ + _available = false; + return; + } + + if(_fam == FAM_W){ + _filename = filename.length() ? filename : getNewFilename(); + _stream = SD.open(_filename.c_str(), FILE_WRITE); + } + else { + _filename = filename; + _stream = SD.open(_filename.c_str(), FILE_READ); + } + _available = (bool)_stream; + } + + ~SDHelper(){ + if(_stream) _stream.close(); + } + + bool Available() const { return _available; } + const String& filename() const { return _filename; } + + void Log(const String& msg) { + if(_fam != FAM_W || !_stream) return; + _stream.println(msg); + _stream.flush(); + } +};