Muy buenas a tod@s
no se si esto tiene que venir aqui o en tutoriales pero bueno, ruego que si no está en el lugar adecuado sea movido.
El asunto es simple cuando implementamos un datalogger nos enfrentamos a un pequeño problema cuando necesitamos sacar la tarjeta sd para pasar los datos a un pc por ejemplo. En este caso a parte de perder los datos que se reciben mientras la sd no esta en arduino, necesitamos reiniciar el mismo para volver a inicializar la sd. En la inmensa mayoria de los casos esto no es critico pero la verdad que investigando un poco parece que tiene una solucion simple.
el bus SPI admite numerosos esclavos que se seleccionan mediante el CS (Chip Select). Asi pues he realizado un programita que nos permite seleccionar una tarjeta u otra para guardar los datos dejando la otra disponible para cambiarla.
#include<SPI.h>
#include<SD.h>
const int slot_1=4;//indicamos que la tarjeta 1 tendra su SD en el pin 4
const int slot_2=5;//indicamos que la tarjeta 2 tendra su SD en el pin 5
const int selector=6;//interruptor para indicar en que tarjeta queremos guardar datos
const int led_1=7;//led que indica que la tarjeta 1 esta activa
const int led_2=8;//led que indica que la tarjeta 2 esta activa
float TEMP=25.35;//variable a guardar el la sd
void setup(){
Serial.begin(9600);//para depuración
pinMode(10,OUTPUT);//se debe configurar asi en la mayoria de las placas para que funcione (53 en el MEGA)
pinMode(selector,INPUT);//se define como entrada
pinMode(slot_1,OUTPUT);
pinMode(slot_2,OUTPUT);//creo que esto no haria falta pero asi queda algo mas claro
}
void loop(){
//Para escribir en la tarjeta 1
if(digitalRead(selector)==HIGH){//si el interruptor esta activo
if(!SD_1.begin(slot_1)){//inicializamos la tarjeta 1
Serial.println("fallo tarjeta 1");
return;//intentamos reinicializarla hasta que lo logremos
}
Serial.println("tarjeta 1 inicializada2);
digitalWrite(led_1,HIGH);//activamos el led que la tarjeta 1 esta inicializada
digitalWrite(led_2,LOW);//indicamos que la tarjeta 2 esta desconectada
file dataFile = SD_1.open("valores.txt",FILE_WRITE);//abrimos el fichero para guardar los datos (si no existe se crea)
if(dataFile){//si el fichero es correcto escribimos en el
dataFile.print("Temperatura: ");
dataFile.println(TEMP);
dataFile.close();//una vez escrito cerramos el fichero
Serial.print("guardado correcto");//avisamos que se ha guardado ok
}
else{
Serial.print("error al guardar en fichero");//avisamos que se ha producido un error
}
delay(5000);//esperamos para tomar otro valor
}//hasta aqui para la tarjeta 1
else if(digitalRead(selector)==LOW){//si el interruptor esta desactivado
if(!SD_2.begin(slot_2)){//inicializamos la tarjeta 2
Serial.println("fallo tarjeta 1");
return;//intentamos reinicializarla hasta que lo logremos
}
Serial.println("tarjeta 2 inicializada2);
digitalWrite(led_2,HIGH);//activamos el led que la tarjeta 2 esta inicializada
digitalWrite(led_1,LOW);//indicamos que la tarjeta 1 esta desconectada
file dataFile = SD_2.open("valores.txt",FILE_WRITE);//abrimos el fichero para guardar los datos (si no existe se crea)
if(dataFile){//si el fichero es correcto escribimos en el
dataFile.print("Temperatura: ");
dataFile.println(TEMP);
dataFile.close();//una vez escrito cerramos el fichero
Serial.print("guardado correcto");//avisamos que se ha guardado ok
}
else{
Serial.print("error al guardar en fichero");//avisamos que se ha producido un error
}
delay(5000);//esperamos para tomar otro valor
}
}