Sube archivos al ESP32 usando SPIFFS con el Arduino IDE

¿Sabías que puedes subir archivos a tu ESP32? Ahora que lo sabes quizás te preguntes ¿y para de qué me sirve subir archivos a mi ESP32? Ambas preguntas tendrán una respuesta en esta publicación.

¿Qué es SPIFFS?

SPIFFS es un sistema de archivos para las memorias SPI Flash NOR que utiliza el ESP32. Este sistema de archivos no tiene una organización de directorios (carpetas) como uno suele estar acostumbrado, sino que usa una estructura plana. Por ejemplo, si ves esta dirección /spiffs/tmp/ejemplo.txt podrías asumir que dentro de la carpeta spiffs, hay una llamada tmp, que a su vez contiene el archivo ejemplo.txt.

Con el sistema SPIFFS tendríamos un archivo llamado /tmp/ejemplo.txt en SPIFFS. Una sutil diferencia.

Hay otras características a tomar en cuenta al usar este sistema.

  • No acepta boques defectuosos.
  • La escritura puede tomar más tiempo.
  • Puede utilizar le 75% de espacio.
  • Cuando se esté quedando sin espacio el sistema de archivos escaneará múltiples veces en busca de más espacio, lo que puede demorar el proceso de escritura.
  • Al eliminar un archivo no siempre se borra por completo, por lo que habrán espacios que no se puedan usar.
  • El nombre del archivo no debe superar los 31 caracteres. El sistema no te avisará si sobrepasaste el límite.

Aplicaciones de SPIFFS

El espacio que tendrás para subir tus archivos puede parecer limitado, pero es muy útil. Una de las ventajas es que podrás usar directamente un archivo con la información que necesites para tu proyecto en lugar de añadirla en el código. Puedes subir documentos de texto, configuraciones de una red, credenciales, archivos que conforman una web como html y css.

¿Cómo usar SPIFFS con el ESP32 y Arduino IDE?

Anteriormente se enseñó cómo programar el ESP32 con el Arduino IDE por si aún no tienes esa parte cubierta.

Añadiendo SPIFFS a Arduino IDE

Para instalar la herramienta sigue estos pasos.

Ve al repositorio y descarga el archivo ESP32FS-1.0.zip.

Repositorio de Github de SPIFFS.

Después de descargarlo descomprímelo en la dirección C:\Program Files (x86)\Arduino\tools.

Carpeta descomprimida de SPIFFS.

Si tenías Arduino IDE abierto ciérralo y vuélvelo a abrir. Ve al menú herramientas y busca ESP32 Sketch Data Upload para verificar que cuentas con la herramienta.

SPIFFS en menú de herramientas de Arduino IDE.

Subir archivos

Hay que considerar cómo organizarás los archivos antes de subirlos. En la carpeta que tenga el documento *.ino que estés editando crea una carpeta y llámala data. Dentro de esa nueva carpeta colocarás lo que quieras subir al ESP32.

Cuando tengas el ESP32 conectado a tu ordenador selecciona el puerto que le corresponde. Luego presiona la opción ESP32 Sketch Data Upload. De esta forma estarás subiendo los archivos de la carpeta data al ESP32.

Carpeta data para subir archivos por SPIFFS.
Archivo subido mediante SPIFFS

En algunos modelos de tarjetas es necesario mantener presionado el botón BOOT de la placa mientras se sube el programa y este caso el archivo.

Ver contenido de archivo

Con este código imprimiremos el contenido del archivo que se subió al ESP32.

/*
   SPIFFS - Ver contenido de archivos
   Henry Mera - TodoMaker
   https://todomaker.com
*/

//Añadir librería
#include "SPIFFS.h"

void setup() {
  //Iniciar puerto serial
  Serial.begin(115200);

  //Iprimir mensaje de error al iniciar SPIFFS
  if (!SPIFFS.begin(true)) {
    Serial.println("Ocurrió un error al ejecutar SPIFFS.");
    return;
  }

  //Abre el archivo que se subió desde la carpeta "data"
  File file = SPIFFS.open("/ejemplo.txt");

  //Mensaje de fallo al leer el contenido
  if (!file) {
    Serial.println("Error al abrir el archivo.");
    return;
  }

  //Imprimir contenido del archivo en el monitor serial
  Serial.println("Contenido:");
  while (file.available()) {
  Serial.write(file.read());
  }
  //Detiene el proceso
  file.close();
}

void loop() {

}

Explicación del código

El código inicia añadiendo la librería “SPIFFS.h” para usar las funciones del sistema de archivos.

Entrando a setup() se da inicio al monitor serial con una velocidad 115200 baudios.

!SPIFFS.begin(true) hace referencia a que si la ejecución de SPIFFS es falsa se imprimirá un mensaje alertado del error al iniciar el sistema.

if (!SPIFFS.begin(true)) {
   Serial.println("Ocurrió un error al ejecutar SPIFFS.");
   return;
}

Continuando, se crea un valor llamado file. En este caso se le asigna lo que se obtiene al abrir el archivo “/ejemplo.txt“. Después se crea una condición para alertar de si hubo un error al abrir el archivo.

File file = SPIFFS.open("/ejemplo.txt");

if (!file) {
  Serial.println("Error al abrir el archivo.");
  return;
}

Ahora se muestra este ciclo en el que imprimirá el contenido del archivo que hemos seleccionado. En concreto se comprueba la disponibilidad del archivo y se muestra su contenido en el monitor serial con la función file.read(). Luego se cierra el archivo con file.close().

while (file.available()) {
  Serial.write(file.read());
}

file.close();

Finalmente se muestra el contenido en el monitor serial.

Contenido de archivo por monitor serial.

Listar archivos

Con este código podrás ver los archivos almacenados en la memoria del ESP32.

/*
 * SPIFFS - Listar archivos
 * Henry Mera - TodoMaker
 * https://todomaker.com
 */

//Añadir librería
#include "SPIFFS.h"

//Función para listar archivos
void listarArchivos() {
  
  File root = SPIFFS.open("/"); //Se declara "/" como ubicación root

  //file será el archivo que le sigue en jerarquía a root
  File file = root.openNextFile(); 

  while (file) {
    Serial.print("Archivo: ");
    Serial.println(file.name()); //Imprime nombre de archivo 

    file = root.openNextFile();  //Pasa al siguiente archivo
  }
}

void setup() {

  Serial.begin(115200); //Inicia puerto serial

  //Iprimir mensaje de error al iniciar SPIFFS
  if (!SPIFFS.begin(true)) {
    Serial.println("Ocurrió un error al ejecutar SPIFFS.");
    return;
  }

  //Llama a la función para listar los archivos
  Serial.println("Listado de archivos:");
  listarArchivos();

}

void loop() {}

Explicación del código

Se creó una función para realizar la tarea de listar los archivos y facilitar su uso en otras partes de código.

void listarArchivos() {
  
  File root = SPIFFS.open("/");

  File file = root.openNextFile(); 

  while (file) {
    Serial.print("Archivo: ");
    Serial.println(file.name()); 

    file = root.openNextFile(); 
  }
}

En primer lugar se abre el directorio raíz (/) y se le atribuye esa dirección al valor root. Se continua creando otra variable llamada file que tendrá lo que se obtenga de la instrucción para abrir el siguiente archivo que haya disponible.

  File root = SPIFFS.open("/");
  File file = root.openNextFile(); 

Se procede a hacer un ciclo en el que mientras se tenga el archivo se imprimirá su nombre con file.name(). Después, file volverá a cambiar a su valor por el siguiente archivo que haya, el ciclo se repite y se muestra el nombre de ese nuevo archivo. El ciclo se repite hasta que ya no hayan más archivos.

while (file) {
  Serial.print("Archivo: ");
  Serial.println(file.name()); 

  file = root.openNextFile(); 
}

Dentro de setup(), también podría ser en loop(), se puede llamar a la función explicada anteriormente.

  Serial.println("Listado de archivos:");
  listarArchivos();

En esta ocasión detecta el archivo que se subió en el ejemplo anterior.

Listado de archivos por SPIFFS en monitor serial.

Eliminar archivos

Con este código podrás eliminar el archivo que tú indiques.

/*
   SPIFFS - Eliminar archivos
   Henry Mera - TodoMaker
   https://todomaker.com
*/

//Añadir librería
#include "SPIFFS.h"

void listarArchivos() {

  File root = SPIFFS.open("/"); //Se declara "/" como ubicación root

  //file será el archivo que le sigue en jerarquía a root
  File file = root.openNextFile();

  while (file) {

    Serial.print("Archivo: ");
    Serial.println(file.name()); //Imprime nombre de archivo

    file = root.openNextFile(); //Pasa al siguiente archivo
  }

}

void setup() {

  Serial.begin(115200); //Inicia puerto serial

  //Iprimir mensaje de error al iniciar SPIFFS
  if (!SPIFFS.begin(true)) {
    Serial.println("Ocurrió un error al ejecutar SPIFFS.");
    return;
  }

  //Crea un archivo llamado "/ejemplo.txt"
  File file = SPIFFS.open("/ejemplo-2.txt", FILE_WRITE);

  if (!file) {
    Serial.println("Hubo un error creando el archivo.");
    return;
  }

  //Termina proceso
  file.close();

  //Muestra los archivos almacenados
  Serial.println("\n\n**Antes de eliminar**");
  listarArchivos();

  //Borra el archivo que se creó y el que estaba guardado
  SPIFFS.remove("/ejemplo.txt");
  SPIFFS.remove("/ejemplo-2.txt");

  //Vuelve a mostrar los archivos para verificar
  //que se hallan eliminado
  Serial.println("\n\n**Después de eliminar**");
  listarArchivos();
}

void loop() {}

Explicación del código

En esta parte usaremos la función de listado de archivos para mostrar los archivos que estén guardados en la memoria antes y después borrar.

Adicionalmente se creará otro archivo.

El archivo se crea con la función SPIFFS.open(). Debes poner como argumentos el nombre del nuevo archivo y FILE_WRITE.

File file = SPIFFS.open("/ejemplo-2.txt", FILE_WRITE);

A continuación, para eliminar los archivos se usa el comando SPIFFS.remove(). Se debe poner como argumento el nombre del archivo que se quiera eliminar.

  SPIFFS.remove("/ejemplo.txt");
  SPIFFS.remove("/ejemplo-2.txt");

Como se ve en el monitor serial, al hacer un listado de los archivos está el ejemplo que subimos en primer lugar y el archivo que se acaba de crear. Después de ejecutar los comandos para eliminar se vuelve a hacer el listado.

Creando y eliminando archivo con SPIFFS.

Conclusiones

SPIFFS te permite guardar tus archivos en la memoria del ESP32 trayendo ventajas en tus proyectos. En lugar de añadir datos sensibles como credenciales o archivos de configuración en el código se pueden subir a la memoria y usarlos desde allí.

Otro uso es cuando se usa el ESP32 como webserver. Comúnmente se añade las líneas de html y css con el código de Arduino, esto hace un código muy extenso y complejo de leer. En su lugar puedes subir los archivos html y css con SPIFFS.

Dentro de lo que puedes hacer es ver el contenido de los archivos, listar los archivos guardados en la memoria y eliminarlos.

Mantente al pendiente de nuestras publicaciones en este blog y síguenos en nuestras redes sociales.

Te invitamos a tomar el curso de Introducción al ESP32: Introducción al ESP32 | TodoMaker’s School

Previous Post
Next Post