Abrir archivo en microSD con Arduino
En ejercicios anteriores vimos cómo leer la información de una tarjeta microSD, en otro ejercicio vimos cómo crear un archivo y guardar texto en una tarjeta microSD, ahora vamos a ver cómo abrir el archivo y mostrar el contenido en el Monitor Serial.
Lo que vamos a utilizar:
- Arduino (yo voy a utilizar un Arduino UNO)
- Lector de tarjeta microSD (Catalex)
- Tarjeta microSD (cualquier capacidad)
- Cables
El esquemático de conexión entre el lector y Arduino es el siguiente:
- VCC a 5V de Arduino.
- GND a GND de Arduino.
- CS a PIN digital 4 de Arduino.
- MOSI a PIN digital 11 de Arduino.
- MISO a PIN digital 12 de Arduino.
- SCK a PIN digital 13 de Arduino.

// Incluimos librerias
#include <SPI.h>
#include <SD.h>
File archivo;
// Variables utilizadas por la libreria SD
Sd2Card card;
SdVolume volume;
SdFile root;
const int chipSelect = 4; // Aquí le decimos en que PIN digital se va a conectar el lector SD
void setup() {
// Abrimos la comunicación por puerto Serial, y esperamos a que esté disponible:
Serial.begin(9600);
while (!Serial) {
; // Esperamos a que el puerto serial esté disponible
}
Serial.print("\nInicializando microSD...");
// El siguiente fragmento de código verifica que la tarjeta funcione correctamente
if (!card.init(SPI_HALF_SPEED, chipSelect)) {
Serial.println("inicialización fallida. Verifique lo siguiente:");
Serial.println("* la tarjeta ha sido incertada correctamente?");
Serial.println("* el cableado es correcto?");
Serial.println("* seleccionaste el PIN correcto de tu chipSelect?");
while (1);
} else {
Serial.println("El cableado es correcto y la tarjeta funciona");
}
// Se imprime la información de la tarjeta
Serial.println();
Serial.print("Tipo 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");
}
// Ahora se va intentar abrir el tipo de 'voluimen o partición, solamente se muestra FAT16 o FAT32
if (!volume.init(card)) {
Serial.println("No se reconoce partición FAT16/FAT32. \nAsegurece de que el formato sea correcto");
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 del primer FAT que se encuentre
uint32_t volumesize;
Serial.print("El tipo de volumen es: FAT");
Serial.println(volume.fatType(), DEC);
volumesize = volume.blocksPerCluster(); // Los clusters son colecciones de bloques
volumesize *= volume.clusterCount(); // hay muchos grupos
volumesize /= 2; // Los bloques de las SD son siempre 512 bytes (2 bloques son 1KB)
Serial.print("Volume en (Kb): ");
Serial.println(volumesize);
Serial.print("Volume en (Mb): ");
volumesize /= 1024;
Serial.println(volumesize);
Serial.print("Volume en (Gb): ");
Serial.println((float)volumesize / 1024.0);
Serial.println("\nLos archivos que se encontraron en la tarjeta (nombre, fecha y tamaño en bytes): ");
root.openRoot(volume);
// Se muestra la lista de archivos en la tarjeta con fecha y tamaño
root.ls(LS_R | LS_DATE | LS_SIZE);
if (!SD.begin(4)) { // Se inicia el servicio de SD
Serial.println("Falló inicio de SD");
while (1);
}
archivo = SD.open("LOGO.txt", FILE_WRITE); // Abrimos el archivo
if (archivo) {
Serial.print("Escribiendo en LOGO.txt... "); // Enviamos confirmación en Terminal
archivo.println("Esto es una linea de Texto"); // Guardamos una linea de texto
archivo.close(); // Es importante siempre cerrar el archivo
Serial.println("se guardó el texto en archivo"); // Confirmamos en Terminal que se guardó
} else {
Serial.println("Error abriendo LOGO.txt"); // Si no se abre el archivo aventamos error en Terminal
}
archivo = SD.open("LOGO.txt"); // Volvemos a abrir el archivo
if (archivo) {
Serial.println("LOGO.txt:");
while (archivo.available()) { // Se imprime todo el archivo
Serial.write(archivo.read());
}
archivo.close(); // No se olvide cerrar el archivo
} else {
Serial.println("Erro abriendo LOGO.txt"); // Si no se abre mandamos error
}
}
void loop(void) {
//Nada pasa aqui
}

Vemos como este ejercicio, lee la información de la microSD, crea un archivo de texto (si no existe), agrega una linea de texto, guarda y muestra el contenido el archivo TXT