Schreiben einer neuen Datei auf SD bei Reboot

Hallo,
ich programmiere einen Data Logger für Temperatur/Feuchte und schreibe die Daten auf eine SD.
Das Anlegen einer Datei auf die SD Karte mit festen Dateinamen funktioniert, wenn die Datei nicht vorhanden ist.
Wenn die Datei aber vorhanden ist, dann wird die bei Reboot des ESP32 überschrieben und ist verloren.
Erste Idee wäre, die bestehende Datei nach Reboot umzubenennen, z.B. mit dem Zeitstempel vom RTC. Dann bräuchte ich den geänderten Dateinamen nicht weiter zu kommunizieren.
Zweite Idee wäre, nach Reboot eine neue Datei mit xxx_01.txt, xxx_02.txt, xxx_03.txt usw. anzulegen. Das macht es dann aber notwendig, den aktuellen Dateinamen an die Funktion zu übergeben, wo die Daten in die aktuelle Datei geschrieben werden.
Leider habe ich bisher nix passendes im Netz gefunden, das mich auf die richtige Spur bringt.

Hier der Code Ausschnitt, der bei Reboot erstmalig aufgerufen wird und wo ich die Aktion gerne einfügen würde.

void Initialize_SDcard() {

  dataFile = SD.open("/MM_Data.txt", FILE_WRITE);

  if (dataFile) {  // schreibe in die Datei, wenn verfügbar

    dataFile.println("Datum,Uhrzeit,Umgebung,Feuchte1,Temperatur1,Feuchte2,Temperatur2,Feuchte3,Temperatur3,Feuchte4,Temperatur4");  //Schreibe diese Zeile als Header in die Datei
    dataFile.close();                                                                                                                //Schließe die Datei
  }
}

Und warum machst du es nicht, wie in deinem anderen Thread schon vorgeschlagen, mit Append ?
Oder du fügst an den Dateinamen das aktulle Datum an.

Danke für Deine Zeit! :slight_smile:

FILE_APPEND funktioniert tadellos. Möchte ich aber von der SD Karte Daten auswerten, z.B. in Excel, dann müsste ich aus der großen Datei zuerst den passenden Zeitstempel suchen und die dazugehörigen Daten rauskopieren und in Excel einfügen. Eleganter wäre es natürlich, wenn mit jedem Reboot eine neue Datei angelegt würde.
Das Datum an den Dateinamen anzufügen würde mir auch gefallen. Leider finde ich nicht die korrekte Schreibweise und weiß dann auch nicht, wie ich den aktuellen Dateinamen mit dem aktuellen Zeitstempel im Sketch weitergebe, um dort Daten reinzuschreiben.

Oder du prüfst, ob der Dateiname schon existiert?
Oder du zählst, wieviele Dateien es im Verzeichnis gibt und bildest daraus den neuen Namen?
Oder...

1 Like

Genauso würde ich es gerne machen. Da komme ich aber leider schon an meine Grenzen und weiß nicht genau, wie ich das ausdrücken muss.

Da Du eine RTC hast, hast Du das Datum. Dateiname z.B. 20241025.cvs
Wenn eine Datei mit dem Tagesdatum existiert, dann diese mit FILE_APPEND öffnen, sonst mit FILE_WRITE.
Vor jedem Schreiben prüfst Du, ob es ein neuer Tag ist. Wenn ja, neue Datei anlegen.
Das Datum übergibst Du an die Funktion als char *.

Gruß Tommy

Edit: @michael_x sorry, sollte an den TO gehen.

2 Likes

Ich habe mich für "bestehende Datei umbenennen" entschieden.
Was ich jetzt noch nicht verstehe ist, wie ich den Zeitstempel "Datum/Uhrzeit" mit in den Dateinamen bekomme.

So sieht mein Sketch dafür aus:

void Initialize_SDcard() {

  DateTime now = rtc.now();
  char buf2[] = "DD.MM.YY,hh:mm:ss";  // Formatierung der RTC Zeit

File dataFile = SD.open("/MM_Data.txt");  // öffne die Datei zum lesen
  if (dataFile) {

    while (dataFile.available()) {    // Lese die Datei wenn verfügbar

      SD.rename("/MM_Data.txt", "/MM_Data_Neu.txt");
    }

  } else {

  }

  dataFile = SD.open("/MM_Data.txt", FILE_WRITE);

  if (dataFile) {  // schreibe in die Datei, wenn verfügbar

    dataFile.println("Datum,Uhrzeit,Umgebung,Feuchte1,Temperatur1,Feuchte2,Temperatur2,Feuchte3,Temperatur3,Feuchte4,Temperatur4");  //Schreibe diese Zeile als Header in die Datei
    dataFile.close();                                                                                                                //Schließe die Datei
  }
}


Anstelle von "/MM_Data_Neu.txt" soll dann "/MM_Data_Zeitstempel.txt stehen.
Bis dahin funktioniert es schon.

Probiere erst mal, ob Dein System mit so langen dateinamen zurecht kommt oder Du auf 8.3 beschränkt bist. Ansonsten sollten Dir strcpy und strcat helfen können.

Gruß Tommy

Ich gehe davon aus, das ich nicht mehr wie 8 Zeichen verwenden kann, so hab ich es zumindest bei Verwendung der SD Lib gelesen.

Wenn lange Namen gehen, geht evtl. auch sprintf, um variable Werte in einen Text zu wandeln.

ich würde einfach probieren,
wenn schon da, dann +1
wieder probieren, wenn schon da, +1
...

code-Schnippsel hab ich vor ein paar Tagen hier gepostet:
File- and file-name editing with Arduino - Using Arduino / Storage - Arduino Forum

ansonsten, wennst eine RTC (oder andere Zeitquelle) hast, kannst auch einen Zeitstempel in HEX nehmen, dann geht sich das mit 8.3 normalerweise aus ... das mach ich z.B. in diesem Sketch:
Arduino Webclient with Backup to SD Card - Store and Forward (SAF) (rothschopf.net)

1 Like

Ich würde es mir einfach machen.

Einfach eine BOOLEAN Variable nehmen. Deren Zustand vor den Speichervorgang abfragen und danach ändern.

Fertig ist.

Ich mache das jedenfalls immer so. :wink:

Was denn Dateinamen angeht würde ich nach den Ändern der Boolean-Variable ein Zähler im EEProm-Speicher ein hoch setzen und dann den neuen Dateinamen errechnen. Falls ich neugierig bin und eine RT-Uhr im System habe, kann ich ja in die erste Zeile das aktuellen Datei dann das Datum + Uhrzeit reinschreiben.

Das wären (ohne Uhr) ca. 4-5 Zeilen extra.

Gruß

Pucki

1 Like

Vielen Dank dafür - werd ich definitiv mal schauen, wie ich das umsetzen könnte.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.