SD-Karte: Speichern in neues File nach Neustart

Guten Tag,

Für meine Kraftmesszellen Datalogger (Uno, Wireless SD Shield, KD40s) benötige ich ein wenig Hilfe:

Das Setup speichert zwar die Sensordaten in ein File (T.txt), aber nach dem entziehen der Spannungsversorgung und erneutem Start werden die Sensordaten einfach in das bereits gespeicherte File geschrieben. Für mein setup benötige ich aber für jeden Neustart ein neues File.

Die Lösung sollte so schlicht wie möglich sein, da das SD-Karten speichern generell schon etwas langsam ist und ich keine weiteren Verzug in der Messdatenerfassung/Speicherung haben sollte.

Das Speichern sieht wie folgt aus:

#include <SPI.h>  
#include <SD.h>  


int chipSelect=4; //Set chipSelect = 4 for the SD card
File LoadCellData; //Variable for working with the file object

void setup() {
   Serial.begin(9600);
   
        
  pinMode(10, OUTPUT); // reserve Pin10 as an output, library doesnt wanna have it for something else
  SD.begin(chipSelect); // initialize the SD card
  
  }


void loop() {
 
 LoadCellData= SD.open("T.txt",FILE_WRITE); // opens the T.txt on the SD card as a file and write on it
 if (LoadCellData) {

                         Serial.print(scale.get_units(),3);
                         Serial.println(","+String(millis()/1000.0,3));
                         delay(1);
                         LoadCellData.println(scale.get_units(),3);
                         LoadCellData.close(); 
                        
                     }

Mir ist es bereits einmal gelungen, dass einfach immer wieder ein neues File gespeichert unter dem gleichen Namen gespeichert wird, aber immer jeweils mit dem Anhang (1),(2),…,(n). Jedoch weiß ich nicht mehr, wie ich das gelöst habe.

Suche eine simple Lösung für mein Problem.

Vielen Dank im Voraus, cheers

Mal etwas genauer: Willst Du ein neues File ohne das alte zu behalten oder ein neues File unter anderem Namen, bei dem das alte File erhalten bleibt?

Wie sieht Dein Sketch aus? Setzen ihn bitte in Codetags (</> oben links im Editor)

Gruß Tommy

Ich möchte alle Sensordaten behalten, aber nach jedem Neustart ein neues File. Damit ich die Sensordaten nach jeweiligen Testruns gliedern kann.

Der gesamte Sketch für mein Setup sieht wie folgt aus:

#include <SPI.h>  
#include <SD.h>  


#include <SoftwareSerial.h>
#include "HX711.h"
#include "bluetooth.h"

Bluetooth BT(2, 3);

// HX711.DOUT	- pin #A1
// HX711.PD_SCK	- pin #A0

HX711 scale(A1, A0);		// parameter "gain" is ommited; the default value 128 is used by the library

int chipSelect=4; //Set chipSelect = 4 for the SD card
File LoadCellData; //Variable for working with the file object

void setup() {
   Serial.begin(9600);
   
        BT.Reset();
        BT.setDeviceName("SchluechProduction");
        BT.setDevicePin("5464");
    
  pinMode(10, OUTPUT); // reserve Pin10 as an output, library doesnt wanna have it for something else
  SD.begin(chipSelect); // initialize the SD card
  
  


          
  //Serial.println("Before setting up the scale:");
  //Serial.print("read: \t\t");
  //Serial.println(scale.read());			// print a raw reading from the ADC

 // Serial.print("read average: \t\t");
  //Serial.println(scale.read_average(20));  	// print the average of 20 readings from the ADC

  //Serial.print("get value: \t\t");
  //Serial.println(scale.get_value(5));		// print the average of 5 readings from the ADC minus the tare weight (not set yet)

 // Serial.print("get units: \t\t");
 // Serial.println(scale.get_units(5), 1);	// print the average of 5 readings from the ADC minus tare weight (not set) divided 
						// by the SCALE parameter (not set yet)  

  scale.set_scale(2280.f);                      // this value is obtained by calibrating the scale with known weights; see the README for details
  scale.tare();				        // reset the scale to 0

  //Serial.println("After setting up the scale:");

  //Serial.print("read: \t\t");
  //Serial.println(scale.read());                 // print a raw reading from the ADC

  //Serial.print("read average: \t\t");
 // Serial.println(scale.read_average(20));       // print the average of 20 readings from the ADC

 // Serial.print("get value: \t\t");
 // Serial.println(scale.get_value(5));		// print the average of 5 readings from the ADC minus the tare weight, set with tare()

  //Serial.print("get units: \t\t");
  //Serial.println(scale.get_units(5), 1);        // print the average of 5 readings from the ADC minus tare weight, divided 
						// by the SCALE parameter set with set_scale

 // Serial.println("Readings:");
}

void loop() {
 
 LoadCellData= SD.open("T.txt",FILE_WRITE); // opens the T.txt on the SD card as a file and write on it
 if (LoadCellData) {
                        // Serial.print("one reading:\t");
                         Serial.print(scale.get_units(),3);
                         Serial.println(","+String(millis()/1000.0,3));
                        //Serial.print("\t| average:\t");
                         //Serial.println(scale.get_units(10), 1);
                         delay(1);
                        LoadCellData.println(scale.get_units(),2);
                        LoadCellData.close(); 
                        
                     
                        
                        
 }

}

Einen Sketch, bei dem die Hälfte auskommentiert ist, schaue ich mir nicht an.

Du könntest eine Nummer im EEPROM speichern, die Du beim Booten einliest, erhöhst und wieder speichert.
Damit wäre tnummer.txt Dein Dateinamen.
Wenn 100 000 Nummern ausreichen (garantierte Schreibzyklen des EEPROM) ist das ok, sonst musst Du mehr Aufwand treiben.

Diese Nummer (links mit 0 aufgefüllt) hängst Du an den Dateinemen ran.
Prüfe vorher, ob Deine SD-Lib lange Dateinamen kann.

Gruß Tommy

In SdFat gibt es die Möglichkeit, nach bereits existierenden Dateien zu suchen und diese zu überspringen. Beispiel aus AnalogLogger.ino:

 // create a new file in root, the current working directory
  char name[] = "logger00.csv";

  for (uint8_t i = 0; i < 100; i++) {
    name[6] = i/10 + '0';
    name[7] = i%10 + '0';
    if (sd.exists(name)) {
      continue;
    }
    logfile.open(name);
    break;
  }
  if (!logfile.is_open()) {
    error("file.open");
  }