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