Guardar y leer texto en microSD con Arduino
En ejercicios anteriores vimos cómo leer información de una microSD,así como también vimos guardar texto en un archivo de texto y por ultimo vimos como leer el archivo de texto. En esta ocasión vamos a combinar los tres ejercicios y junto con una función básica vamos a hacer lo siguiente:
- Crear una función que nos muestre en el puerto serial la información y contenido de la memoria microSD
- Crear una función que genere un archivo de texto (si no existe) y guarde un texto específico (aquí se podrá almacenar la lectura de algún censor, en un siguiente ejercicio pondremos un GPS o algo así)
- Crear una función que nos muestre en el puerto serial el contenido del archivo de texto creado anteriormente
- Crear una función que borre el archivo creado anteriormente
- Y cada función se va a mandar llamar mediante una respuesta a una tecla. (1, 2, 3 y 4 para cada función sucesivamente)
Lo que vamos a utilizar:
- Arduino (yo voy a utilizar un Arduino UNO)
- Lector de tarjeta microSD (Catalex)
- Tarjeta microSD (cualquier capacidad)
- Cables
Para la función de mostrar la información de la microSD tenemos el siguiente código:
void SDinfo() {
Serial.print("\nIniciando tarjeta SD... ");
if (!card.init(SPI_HALF_SPEED, chipSelect)) {
Serial.println("inicialización fallida. revisar:");
while (1);
} else {
Serial.println("Cableado y tarjeta correctos.");
}
// Se comienza a imprimir
Serial.print("\nTipo de tarjeta: ");
switch (card.type()) {
case SD_CARD_TYPE_SD1:
Serial.println("SD1");
break;
case SD_CARD_TYPE_SD2:
Serial.println("SD2");
break;
case SD_CARD_TYPE_SDHC:
Serial.println("SDHC");
break;
default:
Serial.println("Desconocida");
}
// Se lee el 'volumen/particiones' en FAT16 o FAT32
if (!volume.init(card)) {
Serial.println("No se encuentra partición FAT16/FAT32.");
while (1);
}
Serial.print("Clusters: ");
Serial.println(volume.clusterCount());
Serial.print("Bloques x Cluster: ");
Serial.println(volume.blocksPerCluster());
Serial.print("Total de Bloques: ");
Serial.println(volume.blocksPerCluster() * volume.clusterCount());
Serial.println();
// Se imprime el tipo y tamaño de volumen
uint32_t volumesize;
Serial.print("Volume type is: FAT");
Serial.println(volume.fatType(), DEC);
volumesize = volume.blocksPerCluster();
volumesize *= volume.clusterCount();
volumesize /= 2;
Serial.print("Volume size (Kb): ");
Serial.println(volumesize);
Serial.print("Volume size (Mb): ");
volumesize /= 1024;
Serial.println(volumesize);
Serial.print("Volume size (Gb): ");
Serial.println((float)volumesize / 1024.0);
Serial.println("\nArchivos encontrados (nombre, fecha y tamaño en bytes):");
Serial.println(""); // Para brincar un renglón
root.openRoot(volume);
// Se muestra la lista de archivios
root.ls(LS_R | LS_DATE | LS_SIZE);
}
Ahora la función que genera el archivo y guarda el texto:
void SDguarda() {
archivo = SD.open(nombrearchivo, FILE_WRITE);
if (archivo) {
Serial.print("\nEscribiendo en archivo...");
archivo.println("Texto a guardar en archivo txt");
archivo.close();
Serial.println(" texto guardado");
} else {
Serial.println("\nError guardando texto");
}
}
Ahora la función para leer el archivo:
void SDlee() {
archivo = SD.open(nombrearchivo);
if (archivo) {
Serial.print("\nEl contenido de: ");
Serial.println(nombrearchivo);
while (archivo.available()) {
Serial.write(archivo.read());
}
archivo.close();
} else {
Serial.print("\nError abriendo "); Serial.println(nombrearchivo);
archivo.close();
}
}
El código para borrar:
void SDborra() {
if (SD.exists(nombrearchivo)) {
SD.remove(nombrearchivo);
Serial.print("\nSe ha eliminado "); Serial.print(nombrearchivo); Serial.println(" exitosamente.");
} else {
Serial.println("\nNo existe archivo");
}
}
Ahora para que todo esto funcione tenemos que poner en el loop el siguiente código:
void loop() {
if (Serial.available() > 0) {
lecturaserial = Serial.read();
if (lecturaserial == 49) { // tecla 1 INFORMACIÓN DE LA TARJETA
SDinfo();
}
if (lecturaserial == 50) { // tecla 2 GUARDA TEXTO
SDguarda();
}
if (lecturaserial == 51) { // tecla 3 MUESTRA EL TEXTO
SDlee();
}
if (lecturaserial == 52) { // tecla 4 BORRA ARCHIVO
SDborra();
}
}
}
Ahora el código completo aquí: Codigo