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);
}
}