Hola,
como es un tema bastante recurrente, ahí va un ejemplo de cómo guardar y recuperar datos complejos en una SD, porque casi siempre los ejemplos se suelen reducir a datos en forma de texto.
La mejor opción para ello, a mi modo de ver, es utilizar una estructura de datos, donde se pueden incluir toda clase de variables (no punteros).
Por ejemplo, si se define una estructura como esta
struct datos
{
int id;
char nombre[11];
float temperatura;
float humedad;
} datos, datos2;
Se puede escribir y leer la estructura como un todo en la SD. Para probar, poner primero contenido en la estructura,
datos.id = 33;
datos.temperatura = 25.3;
datos.humedad = 77.7;
strcpy(datos.nombre, "lugar_A");
Para escibir, como la función write pide un buffer del tipo const uint8_t hay que hacer una conversión explícita
myFile = SD.open("test.txt", FILE_WRITE);
if(myFile)
{
Serial.println("abierto para escribir 'test.txt'");
myFile.write((const uint8_t*)(&datos), sizeof(datos));
myFile.close();
}
Y para leer, en el ejemplo se utiliza datos2 para comprobar que los datos se cargan desde el fichero, aunque se podría haber usado datos
myFile = SD.open("test.txt");
if(myFile)
{
Serial.println("abierto para leer 'test.txt'");
myFile.read(&datos2, sizeof(datos2));
// y para mostrar por la consola
Serial.print("id: ");
Serial.println(datos2.id, DEC);
Serial.print("nombre: ");
Serial.println(datos2.nombre);
Serial.print("temperatura: ");
Serial.println(datos2.temperatura, DEC);
Serial.print("humedad: ");
Serial.println(datos2.humedad, DEC);
myFile.close();
}
Tan solo queda un detalle por arreglar: la salida por consola me da
temperatura: 25.2999992370
humedad: 77.6999969482
Ahí va el sketch entero por si alguien lo quiere probar
/*
Conexiones para un Arduino Uno:
uint8_t const SS_PIN = 10;
uint8_t const MOSI_PIN = 11;
uint8_t const MISO_PIN = 12;
uint8_t const SCK_PIN = 13;
*/
#include <SD.h>
File myFile;
int kont;
struct datos
{
int id;
float temperatura;
float humedad;
char nombre[11];
} datos, datos2;
void setup()
{
kont = 0;
Serial.begin(9600);
Serial.print("Initializing SD card...");
pinMode(10, OUTPUT);
if (!SD.begin(10))
{
Serial.println("initialization failed!");
return;
}
Serial.println("initialization done.");
datos.id = 33;
datos.temperatura = 25.3;
datos.humedad = 77.7;
strcpy(datos.nombre, "lugar_A");
myFile = SD.open("test.txt", FILE_WRITE);
if(myFile)
{
Serial.println("abierto para escribir 'test.txt'");
myFile.write((const uint8_t*)(&datos), sizeof(datos));
myFile.close();
myFile = SD.open("test.txt");
if(myFile)
{
Serial.println("abierto para leer 'test.txt'");
myFile.read(&datos2, sizeof(datos2));
Serial.print("id: ");
Serial.println(datos2.id, DEC);
Serial.print("nombre: ");
Serial.println(datos2.nombre);
Serial.print("temperatura: ");
Serial.println(datos2.temperatura, DEC);
Serial.print("humedad: ");
Serial.println(datos2.humedad, DEC);
myFile.close();
}
else
{
Serial.println("error read test.txt");
}
}
else
{
// if the file didn't open, print an error:
Serial.println("error FILE_WRITE test.txt");
}
}
void loop()
{
}