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

About: Pablo


    Leave a Reply

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

    Share via
    Copy link