Guardar texto en microSD con Arduino

En un ejercicio anterior vimos como obtener información de una tarjeta microSD con Arduino ahora vamos a crear un archivo y agregar texto en ese archivo para guardarlo dentro de una microSD.

Esto nos puede servir para guardar información de un censor dentro de una memoria microSD.
Es importante mencionar que en este ejercicio vamos a ver todo de manera superficial, ya que existen varios puntos que debemos tomar en cuenta, por ejemplo ¿Que pasa cuando la memoria se llena? ¿Que pasa cuando el archivo de texto llega a tener un tamaño muy grande?. Estos puntos los vamos a analizar en otro ejercicio.

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:

  1. VCC a 5V de Arduino.
  2. GND a GND de Arduino.
  3. CS a PIN digital 4 de Arduino.
  4. MOSI a PIN digital 11 de Arduino.
  5. MISO a PIN digital 12 de Arduino.
  6. SCK a PIN digital 13 de Arduino.
Conexion
Conexión modulo SD y Arduino UNO

Primero vamos a explicar cómo crear el archivo y guardar información en él, en otro articulo les voy a explicar cómo agregar la fecha correcta (actual) al momento de crear el archivo, es decir, si generamos el archivo así de simple como lo vamos a hacer en este articulo, se va a guardar con una fecha incorrecta, en el siguiente post les voy a enseñar que con una función y un modulo real time se puede obtener la fecha y hora correcta y guardar el archivo con la fecha y hora correcta.

Si quieren comprender un poco de Funciones les recomiendo visitar ESTE POST.
A lo que vamos, el siguiente script va a mostrarnos la información de la microSD, que es exactamente lo mismo del post anterior (microSD con Arduino) , pero ahora vamos a agregar mas lineas de código para guardar información en un TXT:


// 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
  }
}

void loop(void) {
  //Nada pasa aqui
}

Texto-Guardado
Texto guardado en micro SD

Después de ejecutar la rutina, cerramos y abrimos el Serial Monitor, para correr la rutina de lectura de archivos y vemos que se generó un archivo con el nombre LOGO.TXT pero con la fecha incorrecta. En un próximo ejercicio vamos a agregar una Real Timer y agregar la fecha y hora correcta a cada archivo creado.

About: Pablo


    Leave a Reply

    Your email address will not be published. Required fields are marked *

    Share via
    Copy link