Arduino Freeze durch DS3231 Befehle beim 1 Durchlauf

Guten Abend liebes Forum!

Ich habe ein Problem und bin dringend auf eure Hilfe angewiesen, denn ich weiß einfach nicht weiter.

Erklärung der Allgemeinen Funktion:

Durch drücken des Buttons wird eine Led eingeschalten, welche den Vorgang des Speicherns signalisiert.
Ist nun die Leuchtdiode erleuchtet und eine Variable "fertig" auf true wird eine CSV.Datei mit dynamischen Namen (Data00-Data99) erstellt. Ist nun eine solche Datei offen, soll in diese das Aktuelle Datum und andere Details hineingeschrieben werden. Sind diese Details in der Datei wird über den Serial Monitor gemeldet "FERTIG" ,dass die Datei beschrieben worden ist.

Das Problem:

Beim 1.mal beschreiben der Datei mit den Befehlen des DS3231 Moduls (Datum) hängt sich der Arduino für längere Zeit auf, da weil kann man den Vorgang mit dem Button nicht abbrechen. Nach dieser Zeit kommt der Arduino zurück ins Leben und melden dann er sei fertig. Startet man nun diesen Vorgang ein 2 bis 9999 mal funktioniert es ohne Hänger. Dieser trifft immer nur beim Ersten mal auf aber warum ? Wie kann man dieses Problem lösen ?

Ich hoffe ihr könnt mir helfen.
LG

Hier der Code:

#include <Wire.h>
#include <SPI.h>
#include <SD.h>
#include <DS3231.h>
DS3231  rtc(SDA, SCL);
Time  t;

unsigned long temps = millis();
unsigned long end_time;

const int ledPinRt =  2;
const int chipdetection = 3;
const int buttonPin = 4;    
const int ledPinGr = 5;
int ledState = HIGH;       
int buttonState;             
int lastButtonState = LOW;   
long lastDebounceTime = 0;  
long debounceDelay = 50;  

#define FILE_BASE_NAME "Data"
File file;
const uint8_t CS_PIN = 53;
const uint8_t BASE_NAME_SIZE = sizeof(FILE_BASE_NAME) - 1;
char fileName[] = FILE_BASE_NAME "00.csv";

void setup() {
  Serial.begin(9600);
  Wire.begin();
  rtc.begin();

  
  pinMode(buttonPin, INPUT_PULLUP);
  pinMode(ledPinGr, OUTPUT);
  digitalWrite(ledPinGr, ledState);
  
  
  if(!SD.begin(53)) {
      Serial.println("initialization failed!");
      return;
    }
    Serial.println("initialization done.");
  

}
uint32_t old_ts;
void loop() {
  
t = rtc.getTime();
char str[20];
float anz1;
int anz2;
File file;
#define FILE_BASE_NAME "Data"
const uint8_t CS_PIN = 53;
const uint8_t BASE_NAME_SIZE = sizeof(FILE_BASE_NAME) - 1;
char fileName[] = FILE_BASE_NAME "00.csv";
static bool fertig;

  
  int reading = !digitalRead(buttonPin);
  if (reading != lastButtonState) {
    lastDebounceTime = millis();
  }
  if ((millis() - lastDebounceTime) > debounceDelay) {
    if (reading != buttonState) {
      buttonState = reading;
      if (buttonState == HIGH) {
        ledState = !ledState;
      }
    }
  }
  digitalWrite(ledPinGr, !ledState);
  lastButtonState = reading;

  if(((digitalRead(ledPinGr) == HIGH) && fertig))
   {
     if(millis() - temps >= 30)
     {
      fertig = false;
        temps = millis();  
       }
     }
  if (digitalRead(ledPinGr) == LOW) {
       fertig = true;
       temps = millis();
    }
    if((fertig == true)&&(digitalRead(ledPinGr) == HIGH)){ 
      while (SD.exists(fileName)) {
        if (fileName[BASE_NAME_SIZE + 1] != '9') {
        fileName[BASE_NAME_SIZE + 1]++;
    }   else if (fileName[BASE_NAME_SIZE] != '9') {
        fileName[BASE_NAME_SIZE + 1] = '0';
        fileName[BASE_NAME_SIZE]++;
        } else {
        Serial.println(F("Can't create file name"));
        return;
      }
    }
    file = SD.open(fileName, FILE_WRITE);
    if (!file) {
    Serial.println(F("open failed"));
    return;
    }
    Serial.print(F("opened: "));
    Serial.println(fileName);

    if((fertig == false)&&(digitalRead(ledPinGr) == LOW)){
      
    file.close();
    }
   
   file = SD.open(fileName, FILE_WRITE);

  
 }
   if (file)
  {
 
            file.println(); //Zeit LIbary kakt ab
            file.print("Datum:");
            file.print(";");
            file.print(rtc.getDateStr());
            Serial.print(rtc.getDateStr());
            file.print("Wagen-Nr:");
            file.print(";");
            file.println("11");
            file.println();
            file.print("Uhrzeit:");
            file.print(";");
            file.print(";");
            file.print("Kraft:");   
            file.println(); 
            file.println(); 
            Serial.println("FERTIG");
            file.close();
  }
}
File file;

#define FILE_BASE_NAME "Data"
const uint8_t CS_PIN = 53;
const uint8_t BASE_NAME_SIZE = sizeof(FILE_BASE_NAME) - 1;
char fileName[] = FILE_BASE_NAME "00.csv";

ist doppelt vorhanden. wenn es kompiliert, sollte das aber egal sein ?!

          file.println(); //Zeit LIbary kakt ab

Was bedeutet dies?

Du hast mehrere Test-Ausgaben, bevor "FERTIG" geschrieben wird, wann kommen die denn?

Kann es sein, dass in deiner Tasten- und Start-Logik ein Wurm ist, und das ganze gar nichts mit SD zu tun hat ?

Das //Zeit Libary kakt ab bedeutet, wenn ich die Befehle für das Schreiben des Datums, Uhrzeit hinausnehme das dieses Problem nicht da ist.

file.print(rtc.getDateStr()); -> Befehle wie dieser lassen das ganze stoppen

Dann trenne diese beiden Anweisungen doch einfach mal, damit Du weißt, ob die RTC oder die SD klemmt.

Gruß Tommy

Ich habe nun den Code etwas verändert, welche seinen Durchlauf mit einem Button Druck beginnt. Hier ist es ähnlich wenn ich das erste mal den Button betätige hängt der Arduino paar Sekunden und kommt dann wieder, beim Zweiten mal drücken passiert dies nicht.

#include <SPI.h>
#include <SD.h>
#define FILE_BASE_NAME "Data"
#include <DS3231.h>

const uint8_t CS_PIN = 53;

File file;

const uint8_t BASE_NAME_SIZE = sizeof(FILE_BASE_NAME) - 1;
char fileName[] = FILE_BASE_NAME "00.csv";

int button = 0;
int led = 22;

unsigned long temps = millis();
unsigned long end_time;

DS3231  rtc(SDA, SCL);

void setup() {
  Serial.begin(9600);
  
  rtc.begin();
  
  pinMode(button,INPUT_PULLUP);
  pinMode(led,OUTPUT);
  
  if (!SD.begin(CS_PIN)) {
    Serial.println(F("begin failed"));
    return;
  }
 
 }

void loop() {
  
  if((digitalRead(button)== LOW)&&(millis()>=end_time)){
    digitalWrite(led,HIGH);
    end_time=millis()+200;
    while (SD.exists(fileName)) {
    if (fileName[BASE_NAME_SIZE + 1] != '9') {
      fileName[BASE_NAME_SIZE + 1]++;
    } else if (fileName[BASE_NAME_SIZE] != '9') {
      fileName[BASE_NAME_SIZE + 1] = '0';
      fileName[BASE_NAME_SIZE]++;
    } else {
      Serial.println(F("Can't create file name"));
      return;
    }
  }
  file = SD.open(fileName, FILE_WRITE);
  if (!file) {
    Serial.println(F("open failed"));
    return;
  }
  Serial.print(F("opened: "));
  Serial.println(fileName);
  
  if (file)
  {
    file.println();
    file.print("Einwirkende Kraefte auf das Fahrzeug:");
    file.println();
    file.println();
    file.print("Datum:");
    file.print(";");
    file.println(rtc.getDateStr());
    file.print("Startzeit:");
    file.print(";");
    file.println(rtc.getTimeStr());
    file.print("Wagen-Nr:");
    file.print(";");
    file.print("11");
    file.println();
    file.println();
    file.print("Uhrzeit:");
    file.print(";");
    file.print(";");
    file.print("Kraft");
    file.println();
    file.println();
    Serial.println("done.");
    file.close();
  }   
    }
    else
    {
      digitalWrite(led,LOW);
      }
  

    
}