
SPIFFS : sistema de archivos (Sistema de archivos flash de interfaz periférica en serie) para memoria flash conectada a través de una interfaz periférica en serie. En palabras simples: hay un microcontrolador ESP32 (Figura 1), tiene una memoria NOR no volátil regrabable incorporada, que almacena: Preferencias, gestor de arranque, firmware (boceto compilado), sistema de archivos (SPIFFS) y algo más algo así como una actualización por aire (OTA).

Figura 1. Diagrama de bloques funcional del microcontrolador ESP32
La memoria NOR es un tipo de memoria regrabable no volátil que tiene una velocidad de lectura bastante alta, una velocidad de escritura y borrado relativamente baja, en comparación con el tipo de memoria NAND . Es casi imposible cumplir con la memoria NOR de gran capacidad, generalmente limitada a 128 MB. En el caso de ESP32 - cuatro .
Hoy SPIFFS tiene algunas desventajas. fallas , incluyendo: falta de soporte de carpetas; no es una pila en tiempo real, por lo que la misma operación puede llevar tiempos diferentes; falta de capacidad para encontrar y reparar bloques rotos. Si las deficiencias enumeradas no son críticas para usted, entonces continuamos leyendo el siguiente párrafo.
Hablemos de usar
Desafortunadamente, fuera de la caja, la memoria del microcontrolador no está marcada como SPIFFS, para marcarla, debe usar el complemento ESP32FS para el entorno de desarrollo Arduino IDE.
Después de descargar el complemento, debe instalarse:
- Asegúrese de tener instalada la última versión del entorno de desarrollo Arduino IDE y el controlador para su dispositivo en el ESP32 . Tengo el controlador M5Stack CP210X que descargo de este enlace;
- Copie la carpeta de herramientas descargada con el complemento incrustado en la carpeta / Arduino / tools / ESP32FS / ;
- En macOS, la carpeta se encuentra en ~ / Documents / Arduino / ;
- Reinicie la computadora y compruebe en el entorno de desarrollo en el menú Herramientas que aparece el elemento de carga de datos de boceto ESP32 (Figura 2), eso significa que hizo todo correctamente;

Figura 2. Menú de herramientas
- Presta atención a la carpeta de datos ubicada al lado del boceto. Todos los archivos ubicados en esta carpeta se cargarán en la memoria del dispositivo durante el formateo;
- Siéntase libre de seleccionar el elemento indicado y espere hasta el final del formateo del área de memoria. Tenga en cuenta que otras secciones de la memoria NO se verán afectadas, lo que significa que el firmware permanecerá en la memoria del dispositivo y funcionará. De manera similar con el boceto, cuando se compila en el firmware y se descarga al dispositivo, el sistema de archivos no se verá afectado.
Si quieres comodidad
Si desea tocar archivos y ver información sobre el espacio libre, descargue el boceto BRIDGE y muestre su dispositivo.
Descargue también y compilar Administrador de archivos multiplataforma A-Explorer (Figura 3). En GitHub, los binarios pronto estarán en la carpeta bin .

Figura 3 a. Administrador de archivos A-Explorer para macOS

Figura 3, b. Administrador de archivos A-Explorer para Windows
Este administrador de archivos le permitirá encontrar información sobre espacio libre, cargar / descargar / eliminar archivos. Hay una indicación del progreso de la operación.
Como puede ver en la Figura 3, el complemento asignó aproximadamente 1.38 MB de memoria bajo SPIFFS.
¿Quién es este PUENTE?
BRIDGE es un boceto y, en primer lugar, una función del mismo nombre que funciona con el sistema de archivos SPIFFS y A-Explorer es un shell gráfico para él. Este último envía un comando u otro, y esta función lo procesa en el dispositivo usando las bibliotecas FS y SPIFFS . Veamos qué es interesante en estas bibliotecas.
Comencemos mirando los métodos públicos de la clase SPIFFS :
Método de inicio de bool (bool formatOnFail = false, const char * basePath = "/ spiffs", uint8_t maxOpenFiles = 10). Este método intenta inicializar una instancia de la clase. El primer argumento es verdadero o falso en caso de que el sistema de archivos deba formatearse si el sistema de archivos no está formateado. El segundo argumento toma la ruta donde se ubicará la raíz del sistema de archivos. El tercer argumento determinará la cantidad de archivos abiertos simultáneamente. Es mejor dejar los dos últimos parámetros predeterminados y no cambiarlos. Si falta el sistema de archivos (no se utilizó el complemento anterior). entonces la función devolverá falso.
El método bool format () verificará si el sistema de archivos está formateado, devuelve verdadero, de lo contrario, falso.
Método size_t totalBytes (). Este método devuelve el número size_t del número total de bytes asignados para el sistema de archivos.
Método size_t usedBytes (). Este método devuelve el número size_t de bytes utilizados en el sistema de archivos.
Método de fin vacío (). Este método desinicializa esta clase. Después de llamar a este método, no tiene sentido llamar a otros métodos.
Todo en esta clase, no hay nada particularmente interesante. Pasemos a la clase FS y veamos qué puede ser útil desde allí.
Lo primero que llama la atención es el método de inicialización de la clase bool begin (). Este método no requiere argumentos y no hay necesidad de llamarlo, porque usaremos el siguiente método de inmediato.
El método de abrir archivo (const char path, const char mode) y su hermano File open (const String & path, const char * mode). Estos métodos toman dos argumentos, el primero de los cuales es un puntero simbólico y de cadena a la ruta del archivo, y el segundo es el modo de apertura, que puede ser la siguiente constante:
FILE_READ : abierto solo para lectura;
FILE_WRITE : abierto solo para escritura;
FILE_APPEND : abierto para sobrescribir.
Después de abrir el archivo, ahora podemos realizar cualquier operación en él.
- El método size_t write (uint8_t) le permite escribir un entero sin signo de 8 bits al final del archivo.
- El método de escritura size_t (const uint8_t * buf, size_t size) le permite escribir una serie de enteros sin signo de la longitud especificada en el segundo argumento.
- El método int available () cuenta el número de caracteres desde el final hasta el puntero.
- El método int read () lee un carácter del archivo y lo devuelve como un entero, mientras el cursor desplaza una unidad hacia la derecha.
- El método size_t readBytes (char * buffer, size_t length) lee los caracteres en el búfer señalado por el primer argumento y el número de caracteres pasados por el segundo argumento. Devuelve el número de caracteres leídos.
- El método String readString () lee una línea de un archivo.
- El método int peek () funciona de manera similar al método int read (), solo el cursor permanece en su lugar.
- El método bool seek (uint32_t pos, modo SeekMode) y bool seek (uint32_t pos, modo SeekMode) establece el cursor en la ubicación especificada. La posición se pasa como el primer argumento y la segunda regla ( SeekSet - establece el cursor). Si tiene éxito, devuelve verdadero, de lo contrario, falso.
- El método size_t position () devuelve la posición del cursor.
- El método size_t size () devuelve el tamaño del archivo en Bytes.
- El método const char * name () devuelve el nombre del archivo.
- El método const char * fullName (), teniendo en cuenta la ruta completa.
- El método bool isFile () devuelve verdadero si el objeto abierto es un archivo. De lo contrario, una mentira.
- El método bool isDirectory () devuelve verdadero si el objeto abierto es una carpeta. De lo contrario, una mentira.
- El método File openNextFile () devuelve un puntero al siguiente archivo en la raíz; de lo contrario, NULL.
- Los métodos bool existe (const char * path) y bool exist (const String & path) toman el nombre completo del archivo como argumento, y si tal archivo existe, devuelve verdadero, de lo contrario devuelve falso.
- Los métodos bool remove (const char * path) y bool remove (const String & path) intentan eliminar el archivo cuyo nombre se pasa por argumento. Si tiene éxito, devuelve verdadero, de lo contrario, falso.
- Método bool rename (const char pathFrom, const char pathTo) y bool rename (const String & pathFrom, const String & pathTo); toma el nombre completo del archivo como primer argumento, y el segundo como el nombre completo del nuevo archivo y le cambia el nombre.
Sí, sí, puede tomar esta función y ejecutarla en un hilo separado en cualquier otro boceto
Muchas gracias por tu tiempo! Me alegraría si este artículo te beneficia.
Referencias y (o) fuentes:
- Sistema de archivos SPIFFS aquí
- Trabaje con el sistema de archivos en el complemento ESP8266 en el IDE de Arduino aquí
- Cargador de sistema de archivos Arduino ESP32 aquí