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
}
}
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.
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 *.
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
}
}
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.
Einfach eine BOOLEAN Variable nehmen. Deren Zustand vor den Speichervorgang abfragen und danach ändern.
Fertig ist.
Ich mache das jedenfalls immer so.
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.