Kontinuierliches Schreiben von Daten in eine Datei auf der SD

Hallo,
ich habe folgendes Problem.
Ich schreibe mit dem ESP32 eine Datei auf die SD Karte. Diese Datei soll dann als Data Logger zyklisch Daten eines DHT22 speichern.
Dafür initialisiere ich einmalig im SETUP zuerst die Karte bzw. lege die Datei mit einem Header an, um später in Excel saubere Spaltenüberschriften zu haben.
Im LOOP rufe ich dann den Schreibbefehl auf, um Uhrzeit/Datum bzw. Sensordaten zyklisch auf die Karte zu schreiben. Diese sollen dann pro Schreibvorgang Zeile für Zeile in der Datei landen. Ich habe aber den Eindruck, das mir der ESP32 mit jedem Schreibvorgang ein komplett neue Datei mit demselben Namen anlegt und die vorherige überschreibt. Somit habe ich zwar eine Datei auf der SD Karte, aber immer nur mir einer Zeile an Daten. Auch der vormals im SETUP geschriebene Header ist weg. Woran kann das liegen - bitte um Hilfe.
Hier der relevante Ausschnitt vom Sketch:

void Initialize_SDcard() {

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

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

    dataFile.println("Date,Time,Temperature,Humidity"); //Schreibe diese Zeile als Header in die Datei
    dataFile.close(); //Schließe die Datei
  }
}

void WriteFile() {

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

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

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

    dataFile.print(now.toString(buf2));  //Schreibe Datum/Uhrzeit vom RTC in die Datei
    dataFile.print(",");                 //Gehe in die nächste Spalte, setze ein ","

    dataFile.print(rtc.getTemperature());  //Schreibe die Temperatur vom RTC in die Datei
    dataFile.print(",");                   //Gehe in die nächste Spalte, setze ein ","

    dataFile.print(rtc.getTemperature());  //Schreibe die Temperatur vom RTC in die Datei
    dataFile.print(",");                   //Gehe in die nächste Spalte, setze ein ","

    dataFile.print(rtc.getTemperature());  //Schreibe die Temperatur vom RTC in die Datei
    dataFile.print(",");                   //Gehe in die nächste Spalte, setze ein ","

    dataFile.println();  //Ende der Zeile, springe in die nächste
    dataFile.close();    //Schließe die Datei

  } else {

    digitalWrite(ledPinR, HIGH);  // Schalten der LED rot auf HIGH
    delay(50);
    digitalWrite(ledPinR, LOW);  // Schalten der LED rot auf LOW

    Serial.println("Achtung! Schreibfehler!");
  }
}

Probiere mal FILE_APPEND in WriteFile
Gruß Tommy

1 Like

Eigenheiten des ESP32

Für den ESP32 gibt es zu beachten:
Den Namen von Dateien und Verzeichnissen ist ein Slash („/“) voranzustellen.
Wird „FILE_WRITE“ auf eine vorhandene Datei angewendet, dann wird ihr Inhalt überschrieben.
Mithilfe des Parameters „FILE_APPEND“ könnt ihr Inhalt anhängen. Die SD-Bibliothek für Arduino Boards kennt den Parameter „FILE_APPEND“ nicht und hängt den Inhalt automatisch an.

SD.begin() kann ohne CS Pin aufgerufen werden. In dem Fall greift die Voreinstellung GPIO5

Quelle: https://wolles-elektronikkiste.de/sd-karten-und-sd-kartenmodule#write_and_read

1 Like

Nein, der ESP32 macht das nicht, sondern dein Code.
Du musst die Daten mit "Anfügen" dranhängen, dann überschreibt er auch nicht.
Schau mal in die Beispiele der Library, da gibt es auch die Lösung.

1 Like

Nö, eigentlich so üblich. Die manchmal anzutreffende Variante, das FILE_WRITE das APPEND stillschweigend mit drin hat, ist eigentlich daneben.

Gruß Tommy

Vielen Dank - das isses gewesen! :hugs:

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