SOLUCIONADO!!! Problemas ecribiendo en SD

Muy buenas a todos y un saludo.
tengo un problema con un sketch de captura de datos. Se trata de capturar datos de un acelerómetro un RTC i una LDR. Estos datos se muestreean i se muestran en el terminal. Pero si activas un interruptor entonces estos datos se guardan en una SD. Todo funciona bien, excepto que si cuando le doy al interruptor de grabar empieza a grabar i crea el archivo correctamente en la SD, pero si desactivo el interruptor (y pasa a solo muestreo), cuando vuelvo a activar el interruptor me da error de "card failure". si quito el power y lo vuelvo a conectar y empiezo de nuevo entonces va todo bien. Yo quiero que al activar el interruptor empiéze a grabar, si desactivo el interruptor deje de grabar y si lo vuelvo a activar cree de nuevo el archivo y vuelva a grabar. (Sobre escribiendo el archivo). Quizás es un error de que no reinicio la sd... Pero no se encontrarlo.. Alguien me puede ayudar por favor. Mis conocimientos en c no son muchos. Muchas gracias de antemano. Os cuelgo el código:

#include <SD.h>
#include <Wire.h>
#include "RTClib.h"
RTC_DS1307 RTC;

int Mov_X = 0; // Accelerometer value(X)
int Mov_Y = 0; // Accelerometer value(Y)
int LDR = 0;
int i = 1; //Incremental per nom de arxiu a guardar al SD
int SD_Last_File = 0; // Nº del ultim arxiu guardat al SD (Per la EEPROM)
int EE_New_Value = 0; // Variable on posar el nou nº de arxiu a guardar a la EEPROM
int EE_Value = 0; // Valor actual de la EEPROM
String File_Name_Day = ""; // Nom del arxiu a crear
String File_Name_Month = ""; // Nom del arxiu a crear
String File_Name_Hour = ""; // Nom del arxiu a crear
String File_Name_Minute = ""; // Nom del arxiu a crear
String File_Name_Second = ""; // Nom del arxiu a crear
String File_Name; // Nom complert del arxiu a crear
const int PWRSD = 2; //Power de la SD
const int CS_PIN = 10; //CS de la SD
const int LED_WR = 6; //Led indicador de grabació
const int START_WR_PIN = 3; //Entrada interruptor per inici de grabació
const int EEPROM_Dir = 1; //Direcio de la EEPROM per guardar ultim nº de arxiu
int LED = 0;
int Delay_Mostra = 500;

void setup() {
  Wire.begin(); // Inicia el puerto I2C per al RTC
  RTC.begin(); // Inicia la comunicación con el RTC
  DateTime now = RTC.now(); // Agafa l´hora del RTC
  Serial.begin(9600);
  pinMode(A0,INPUT); //LDR Pin
  pinMode(A1,INPUT); //Accelerometer Pin, (Mov_X)
  pinMode(A2,INPUT); //Accelerometer Pin, (Mov_Y)
  pinMode(2,OUTPUT); // Power de la SD
  pinMode(6,OUTPUT); // LED de grabació
  pinMode(3,INPUT); // Boto de grabació
  pinMode(CS_PIN,OUTPUT); //Pin 10 (SS de la SD)
 
}
void loop() {
  LED = digitalRead(START_WR_PIN); //Miro si el interruptor de grabacio esta en ON
  if (LED == HIGH)
  {
    digitalWrite(LED_WR,HIGH); //Enciendo el led de escritura en SD
    digitalWrite(PWRSD,HIGH); // Conecto el power de la SD
    delay(1500); // Delay para no crear nombres iguales (Exagerado por si acaso)
    Create_File(); // Cramos archivo y empezamos a grabar
  }
  else {
    digitalWrite(LED_WR,LOW);  //Apago led de grabacion en SD
    digitalWrite(PWRSD,LOW); // Desconecto el power de la SD
    Debug_Data(); // No se graba nada pero muestrea los datos en el terminal
 }
}
void Lectura_Sensors(){
  LDR = analogRead(A0);
  Mov_X = analogRead(A1);
  Mov_Y = analogRead(A2);
}
void Debug_Data() { //Solo para mostrar datos en el terminal cuando no se graba en SD
  DateTime now = RTC.now(); // RTC Time
  Lectura_Sensors();
  Serial.print(now.day(),DEC);
  Serial.print(",");
  Serial.print(now.hour(),DEC);
  Serial.print(":");
  Serial.print(now.minute(),DEC);
  Serial.print(":");
  Serial.print(now.second(),DEC);
  Serial.print(",");
  Serial.print(Mov_X);
  Serial.print(",");
  Serial.print(Mov_Y);
  Serial.print(",");
  Serial.println(LDR);
  delay(Delay_Mostra);
 }
void Create_File() { // Crea un nuevo archivo y empieza a grabar en SD
  DateTime now = RTC.now(); // RTC Time

  if (!SD.begin(CS_PIN))
  {
  Serial.println("Card failure");
  return;
  }
  Serial.println("Card ready!");
  
  File_Name = ("S001.txt"); // Nombre generico del archivo a crear
  File dataFile = SD.open(File_Name,FILE_WRITE); // creo el archivo txt (csv)
  if (dataFile){
  Serial.println("File " + File_Name + " created"); //Debug only
  Serial.println("Escribint...");
 //-------- Empieza bucle de grabación -------------------
  while (LED == HIGH) {
    LED = digitalRead(START_WR_PIN); // Sigo grabando?,interruptor fisico para grabar o no
    DateTime now = RTC.now(); // RTC Time
    dataFile.print(now.day(),DEC);
    dataFile.print(",");
    dataFile.print(now.hour(),DEC);
    dataFile.print(":");
    dataFile.print(now.minute(),DEC);
    dataFile.print(":");
    dataFile.print(now.second(),DEC);
    dataFile.print(",");
    dataFile.print(Mov_X);
    dataFile.print(",");
    dataFile.print(Mov_Y);
    dataFile.print(",");
    dataFile.println(LDR);
    dataFile.flush(); // Vacio el buffer y lo vuelco a la SD 
    delay(Delay_Mostra);
}
  dataFile.close();
  Serial.println("File " + File_Name + " closed");//Debug only...
}
else {
  Serial.println("Error de ecritura");
  delay(1000);
}
}

Lo que me parece que nunca haces es cerrar el archivo cuando el switch se apaga o sea cuando dejas de grabar.
Debes cerrar el File o permanecerá abierto y luego pretendes abrirlo de nuevo.

Pero si que lo cierro, no? Al final del while si no se cumple la condición LED == HIGH salta a la parte que cierra el file, no? (dataFile.close;) Por que en el terminal me aparece el mensaje de confirmación: Serial.println("File " + File_Name + " closed");, es decir: Que por aquí pasa cuando apago el switch, el mensaje me aparece correctamente.

 //-------- Empieza bucle de grabación -------------------
  while (LED == HIGH) {
    LED = digitalRead(START_WR_PIN); // Sigo grabando?,interruptor fisico para grabar o no
    DateTime now = RTC.now(); // RTC Time
    dataFile.print(now.day(),DEC);
    dataFile.print(",");
    dataFile.print(now.hour(),DEC);
    dataFile.print(":");
    dataFile.print(now.minute(),DEC);
    dataFile.print(":");
    dataFile.print(now.second(),DEC);
    dataFile.print(",");
    dataFile.print(Mov_X);
    dataFile.print(",");
    dataFile.print(Mov_Y);
    dataFile.print(",");
    dataFile.println(LDR);
    dataFile.flush(); // Vacio el buffer y lo vuelco a la SD 
    delay(Delay_Mostra);
}
  dataFile.close();
  Serial.println("File " + File_Name + " closed");//Debug only...
}

Imagen del terminal...

Terminal.jpg

Por fin!! Al final encontré el error.. Vaya tela.
el problema residía en que yo usaba el inicio de la SD en el bloque de grabación:

  if (!SD.begin(CS_PIN))
  {
  Serial.println("Card failure");
  return;
  }
  Serial.println("Card ready!");

Y cada vez que quería crear un archivo nuevo, volvía a pasar por este código.
Simplemente solo hay que usar el inicio de la SD una vez!!
En el SETUP!! si no pasa el error.
Ueeeee, me he vuelto loco!