{"id":4764,"date":"2019-06-05T22:16:20","date_gmt":"2019-06-05T20:16:20","guid":{"rendered":"https:\/\/www.diarioelectronicohoy.com\/blog\/?p=4764"},"modified":"2021-05-03T20:26:31","modified_gmt":"2021-05-03T18:26:31","slug":"funcionalidad-de-spiffs","status":"publish","type":"post","link":"https:\/\/www.diarioelectronicohoy.com\/blog\/funcionalidad-de-spiffs","title":{"rendered":"Funcionalidad de SPIFFS."},"content":{"rendered":"\r\n<h2 class=\"wp-block-heading\" style=\"text-align: center;\">Funcionalidad de SPIFFS.<\/h2>\r\n\r\n\r\n\r\n<h3 class=\"wp-block-heading\">QU\u00c9 ES SPIFFS.<\/h3>\r\n\r\n\r\n\r\n<p>Podemos decir que SPIFFS es un sistema de archivos destinado a dispositivos flash SPI NOR embebidos. Vamos a aprender en detalle c\u00f3mo utilizar el SPIFFS (del ingl\u00e9s Serial Peripheral Interface Flash Fail System), como configurar nuestro IDE de Arduino y as\u00ed, poder cargar archivos en el ESP8266, aunque el sistema de archivos flash SPIFFS se almacena en el mismo chip que el boceto, la programaci\u00f3n de un nuevo boceto no modificar\u00e1 el contenido del sistema de archivos SPIFFS. Esto permite utilizar el sistema de archivos para almacenar datos del boceto, archivos de configuraci\u00f3n o contenido para el servidor web.<\/p>\r\n\r\n\r\n\r\n<div class=\"wp-block-image\" style=\"text-align: center;\">\r\n<figure class=\"aligncenter is-resized\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-4765\" src=\"https:\/\/www.diarioelectronicohoy.com\/blog\/imagenes\/2019\/06\/esp8266-12e--e1559752860557.gif\" alt=\"\" width=\"323\" height=\"251\" \/>\r\n<figcaption>Fig. 1<\/figcaption>\r\n<\/figure>\r\n<\/div>\r\n\r\n\r\n\r\n<p>Lo que viene a decir es que el sistema flash SPI dispone como de un disco duro interno, y como tal se puede particionar el sistema, de modo que vamos a explicar como acceder a este disco interno, para leer\/guardar, particionar y borrar datos en \u00e9l. No iremos m\u00e1s all\u00e1 del almacenamiento SPIFFS en este art\u00edculo.<\/p>\r\n\r\n\r\n\r\n<p>Por supuesto, usted puede escribir un c\u00f3digo para leer y escribir los datos de una manera m\u00e1s accesible, aunque es inc\u00f3modo y propenso a errores. Especialmente si los datos almacenados tienen formatos diferentes, digamos que una parte es un objeto JSON y la siguiente es HTML, deber\u00e1 crear una tabla de contenido (TOC) y realizar un seguimiento de los tama\u00f1os y puntos de inicio de estos bloques.<\/p>\r\n\r\n\r\n\r\n<div class=\"wp-block-image\" style=\"text-align: center;\">\r\n<figure class=\"aligncenter is-resized\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-4766 aligncenter\" src=\"https:\/\/www.diarioelectronicohoy.com\/blog\/imagenes\/2019\/06\/mapa_spiffs.gif\" alt=\"\" width=\"204\" height=\"262\" \/>\r\n<figcaption>Fig. 2<\/figcaption>\r\n<\/figure>\r\n<\/div>\r\n\r\n\r\n\r\n<p>De manera que los ESP8266 nos permiten actuar sobre dicho disco, cuyo tama\u00f1o var\u00eda de un modelo a otro (los modelos m\u00e1s antiguos, no ofrecen), se trata de un banco de memoria flash del sistema que podemos particionar y as\u00ed usarlo para almacenar nuestro c\u00f3digo como un sistema de archivos. El sistema, archiva datos que no cambian con frecuencia, como configuraci\u00f3n de sensores, p\u00e1ginas web, configuraci\u00f3n del boceto, etc.<\/p>\r\n\r\n\r\n\r\n<p>Bueno, en alg\u00fan sitio o\u00ed decir con cierta raz\u00f3n: \u00ab<em>tampoco es bueno morder m\u00e1s de lo que puedas masticar<\/em>\u00ab. Quiero decir que, estamos empezando y lo propio ser\u00eda realizar una presentaci\u00f3n y alg\u00fan ejemplo que nos de un resultado y nos aliente a seguir entrando en el tema del SPIFFS. As\u00ed que, brevemente veremos c\u00f3mo usar el SPIFFS, cuanto flash tiene un dispositivo y configuraremos el IDE de Arduino para cargar nuestros archivos en el ESP8266.<\/p>\r\n\r\n\r\n\r\n<p>Necesitaremos un IDE Arduino 1.6.9 o mayor, ya vimos\u00a0<a href=\"https:\/\/www.hispavila.com\/category\/micros\/esp8266\/esp8266-como-arduino\/\" target=\"_blank\" rel=\"noreferrer noopener\">como configurar el IDE de Arduino<\/a> tambi\u00e9n deber\u00eda tener instalado en su sistema el python2.7 no otro. Escoja un ESP8266-01 y prep\u00e1rese para realizar con un poco de paciencia, una pr\u00e1ctica con la que reforzar los conocimientos que adquiera en este art\u00edculo.<\/p>\r\n\r\n\r\n\r\n<p>En primer lugar, es conveniente y necesario saber cu\u00e1nta memoria tiene nuestro flash SPI. Esto puede ser deducido en la hoja de datos del ESP8266-01. Conociendo esto, primero debemos decidir aproximadamente la cantidad del flash que deseamos darle a los SPIFFS.<\/p>\r\n\r\n\r\n\r\n<p>Para cargar sus bocetos en el SPIFFS del ESP8266, es aconsejable seguir estos pasos:<\/p>\r\n\r\n\r\n\r\n<ul class=\"wp-block-list\">\r\n<li>Aseg\u00farese de tener un subdirectorio dentro de su directorio de boceto llamado \u2018data\u2019,<\/li>\r\n<li>Coloque los archivos que desea cargar en el directorio \u2018data\u2019<\/li>\r\n<li>Vaya al men\u00fa \u2018Herramientas\u2019, seleccione el dispositivo ESP8266 correcto y elija el \u2018Tama\u00f1o de Flash\u2019 que necesita en el SPIFFS, es decir \u20182Mb (1Mb SPIFFS\u2019). Vea la tabla 1.<\/li>\r\n<li>Aseg\u00farese de que el cuadro de di\u00e1logo del monitor serie est\u00e9 cerrado.<\/li>\r\n<li>Prepare el dispositivo ESP8266 (ESP8266-01) para cargar.<\/li>\r\n<li>Mantenga pulsado \u2018Flash\u2019,<\/li>\r\n<li>Pulso \u2018Reset\u2019<\/li>\r\n<li>Lanzamiento \u2018Flash\u2019<\/li>\r\n<li>Desde el men\u00fa Herramientas, seleccione \u2018ESP8266 Sketch Data Upload\u2019 Vea la foto 3 arriba de la imagen<\/li>\r\n<li>Una vez finalizada la carga. La ventana del mensaje IDE de Arduino mostrar\u00e1 100% de carga. Ver foto 3 abajo de la imagen.<\/li>\r\n<\/ul>\r\n\r\n\r\n\r\n<p>Si usted utiliza las versiones ESP8266-01, ESP 05, ESP 07, etc. para su comodidad, puede utilizar la herramienta que se describe en\u00a0<a href=\"https:\/\/www.hispavila.com\/category\/micros\/esp8266\/como-programar-facil-los-esp\/\" target=\"_blank\" rel=\"noreferrer noopener\">este art\u00edculo<\/a>.<\/p>\r\n\r\n\r\n\r\n<h3 class=\"wp-block-heading\">LIBRER\u00cdAS.<\/h3>\r\n\r\n\r\n\r\n<p>La librer\u00eda ESP8266FS es una herramienta que se debe integrar en el IDE de Arduino, con lo que se a\u00f1adir\u00e1 una opci\u00f3n en el men\u00fa Herramientas, con el que podremos cargar los archivos de la carpeta \u2018data\u2019 de nuestro boceto, en la partici\u00f3n SPIFFS del ESP8266.<\/p>\r\n\r\n\r\n\r\n<p>Ahora tenemos que descargar la librer\u00eda ESP8266FS desde:<br \/><a href=\"https:\/\/github.com\/esp8266\/arduino-esp8266fs-plugin\/releases\/download\/0.2.0\/ESP8266FS-0.2.0.zip\">https:\/\/github.com\/esp8266\/arduino-esp8266fs-plugin\/releases\/\u2026<\/a>\u00a0 o desde<br \/><a href=\"https:\/\/github.com\/esp8266\/arduino-esp8266fs-plugin\/releases\/tag\/0.3.0\">https:\/\/github.com\/esp8266\/arduino-esp8266fs-plugin\/releases\/\u2026<\/a><\/p>\r\n\r\n\r\n\r\n<p>Sigamos, descomprima el ZIP, vaya a\u00a0<em>C:\\Program Files\\Arduino\\tools<\/em>\u00a0(en mi caso), y descargue la carpeta\u00a0<strong>ESP8266FS<\/strong>\u00a0o si lo prefiere, cree en la librer\u00eda una carpeta con el nombre\u00a0<strong>ESP8266FS<\/strong>\u00a0y dentro otra carpeta con el nombre tool y dentro, descargue el archivo\u00a0<strong>esp8266fs.jar<\/strong>, debe quedar algo as\u00ed,\u00a0<strong>C:\\Program Files\\Arduino\\tools\\ESP8266FS\\tool\\esp8266fs.jar<\/strong>.<\/p>\r\n\r\n\r\n\r\n<div class=\"wp-block-image\" style=\"text-align: center;\">\r\n<figure class=\"aligncenter is-resized\"><a href=\"https:\/\/www.diarioelectronicohoy.com\/blog\/imagenes\/2019\/06\/esp8266fs-jar.jpg\" target=\"_blank\" rel=\"noreferrer noopener\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-4767\" src=\"https:\/\/www.diarioelectronicohoy.com\/blog\/imagenes\/2019\/06\/esp8266fs-jar.jpg\" alt=\"\" width=\"304\" height=\"148\" srcset=\"https:\/\/www.diarioelectronicohoy.com\/blog\/imagenes\/2019\/06\/esp8266fs-jar.jpg 645w, https:\/\/www.diarioelectronicohoy.com\/blog\/imagenes\/2019\/06\/esp8266fs-jar-300x147.jpg 300w\" sizes=\"auto, (max-width: 304px) 100vw, 304px\" \/><\/a>\r\n<figcaption>Fig. 3<\/figcaption>\r\n<\/figure>\r\n<\/div>\r\n\r\n\r\n\r\n<p>Hago hincapi\u00e9, el software que debemos utilizar es el IDE Arduino 1.6.9 o superior. Ahora s\u00f3lo tenemos que reiniciar el ID de Arduino e iremos al men\u00fa\u00a0<strong>Herramientas<\/strong>\u00a0y nos mostrar\u00e1 una ventana similar a esta:<\/p>\r\n\r\n\r\n\r\n<div class=\"wp-block-image\" style=\"text-align: center;\">\r\n<figure class=\"aligncenter is-resized\"><a href=\"https:\/\/www.diarioelectronicohoy.com\/blog\/imagenes\/2019\/06\/data_loader.jpg\" target=\"_blank\" rel=\"noopener\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-4768\" src=\"https:\/\/www.diarioelectronicohoy.com\/blog\/imagenes\/2019\/06\/data_loader.jpg\" alt=\"\" width=\"388\" height=\"330\" srcset=\"https:\/\/www.diarioelectronicohoy.com\/blog\/imagenes\/2019\/06\/data_loader.jpg 735w, https:\/\/www.diarioelectronicohoy.com\/blog\/imagenes\/2019\/06\/data_loader-300x255.jpg 300w\" sizes=\"auto, (max-width: 388px) 100vw, 388px\" \/><\/a>\r\n<figcaption>Fig. 4<\/figcaption>\r\n<\/figure>\r\n<\/div>\r\n\r\n\r\n\r\n<p>Los archivos que queremos transferir en el \u00e1rea SPIFFS desde el IDE de Arduino, los depositamos en la carpeta \u2018data\u2019 de nuestro proyecto es decir, por ej.:<\/p>\r\n\r\n\r\n\r\n<pre class=\"wp-block-preformatted\">\/SPIFFsUsage\/\r\n\tdata\/\r\n\t   filename.txt<\/pre>\r\n\r\n\r\n\r\n<p>Esta\u00a0<a href=\"https:\/\/github.com\/esp8266\/arduino-esp8266fs-plugin\" target=\"_blank\" rel=\"noreferrer noopener\">herramienta carga cualquier archivo<\/a>\u00a0que se encuentre dentro de una carpeta denominada \u00ab<strong>data<\/strong>\u00ab. La carpeta\u00a0<strong>data<\/strong>\u00a0debe estar dentro de la carpeta de su boceto, dentro de la cual estar\u00e1 el archivo\u00a0<em>filename.txt<\/em>, si no existe dicho archivo, se crear\u00e1.<\/p>\r\n\r\n\r\n\r\n<p><strong>Atenci\u00f3n:<\/strong>\u00a0La acci\u00f3n que vamos a realizar,\u00a0<strong>borrar\u00e1 todo el contenido<\/strong>\u00a0de SPIFFS del ESP8266 y cargar\u00e1 los datos contenidos en la carpeta data.\u00a0<strong>No se conservan los archivos que hubiera originales \/ anteriores<\/strong>, por lo que si necesita dichos datos, deber\u00eda hacer una copia antes de cargar los nuevos datos de la carpeta data, sin embargo no afectar\u00e1 al boceto.<\/p>\r\n\r\n\r\n\r\n<h3 class=\"wp-block-heading\">FUNCIONES DE LA LIBRER\u00cdA SPIFFS<\/h3>\r\n\r\n\r\n\r\n<p>Veamos c\u00f3mo usar SPIFFS en nuestro programa con Arduino para ESP8266. Aqu\u00ed, s\u00f3lo veremos alguna de las funciones que se pueden utilizar con esta librer\u00eda:<\/p>\r\n\r\n\r\n\r\n<ul class=\"wp-block-list\">\r\n<li>Nuestro boceto, debe\u00a0incluir\u00a0entre otras la librer\u00eda \u00ab<strong>FS.h<\/strong>\u00ab. \u00c9sta librer\u00eda \u00abFS.h\u00bb no se puede utilizar junto a la librer\u00eda SD ya que actualmente son incompatibles.<\/li>\r\n<li>Para\u00a0iniciar\u00a0el uso de\u00a0<em>SPIFFS<\/em>\u00a0deberemos incluir:\u00a0<strong><em>SPIFFS.begin();<\/em><\/strong>\u00a0si funciona correctamente devolver\u00e1\u00a0<strong>true<\/strong>.<\/li>\r\n<li>De igual manera cuando queramos dejar de utilizarlo usaremos la funci\u00f3n\u00a0<strong><em>SPIFFS.end();<\/em><\/strong>.<\/li>\r\n<li>Podemos\u00a0formatear\u00a0la unidad con:\u00a0<strong><em>SPIFFS.format();<\/em><\/strong>\u00a0Si queremos guardar\/borrar datos del programa. Esta funci\u00f3n puede ser llamada antes o incluso despu\u00e9s de\u00a0<em>begin()<\/em>.<\/li>\r\n<li>Tambi\u00e9n podemos hacer particiones. Para saber m\u00e1s sobre las particiones, lea<\/li>\r\n<li>Para asegurarnos que existe un archivo usaremos:\u00a0<strong><em>SPIFFS.exists(path);<\/em><\/strong>. Devolver\u00e1 true si el archivo existe. Recordar que el path es el nombre completo, no un archivo dentro de una carpeta.<\/li>\r\n<li>Tambi\u00e9n hay un filtro que utiliza algo parecido a carpetas:\u00a0<strong><em>SPIFFS.openDir(path, mode);<\/em><\/strong>. Abre un fichero, path debe ser un camino absoluto comenzando con un slash (p.ej. \/dir\/filename.txt),\u00a0<strong>mode<\/strong>\u00a0es una letra que especifica el modo de acceso. Puede ser una de las siguientes:\u00a0<strong>r<\/strong>,\u00a0<strong>w<\/strong>,\u00a0<strong>a<\/strong>,\u00a0<strong>r+<\/strong>,\u00a0<strong>w+<\/strong>,\u00a0<strong>a+<\/strong>, que se puede usar as\u00ed:<\/li>\r\n<li>La secuencia se coloca en el comienzo del archivo.<\/li>\r\n<\/ul>\r\n\r\n\r\n\r\n<p><em>r -Abre un fichero de texto para leerlo.<\/em><br \/><em>r+ -Abre un fichero para lectura y escritura.<\/em><br \/><em>w Trunca en fichero con una longitud cero o crea un fichero<\/em><br \/><em>de texto para escritura.<\/em><br \/><em>w+ -Abre para lectura y escritura. El fichero si no existe, se<\/em><br \/><em>crea de lo contrario se trunca.<\/em><br \/><em>a -Abre el fichero para a\u00f1adir (escribiendo al final del<\/em><br \/><em>fichero). El fichero si no existe, se crea.<\/em><\/p>\r\n\r\n\r\n\r\n<p><em>a+ -Abre el fichero para a\u00f1adir (escribiendo al final del<\/em><br \/><em>fichero). El fichero si no existe se crea.<\/em><br \/><em>La posici\u00f3n inicial para lectura es al comienzo del fichero,<\/em><br \/><em>pero la salida siempre se a\u00f1ade al final del fichero.<\/em><\/p>\r\n\r\n\r\n\r\n<p>.<\/p>\r\n\r\n\r\n\r\n<ul class=\"wp-block-list\">\r\n<li>El objeto directorio\u00a0<em>Dir<\/em><br \/>El prop\u00f3sito del objeto Dir es iterar sobre los ficheros dentro del directorio. Provee los m\u00e9todos:<\/li>\r\n<\/ul>\r\n\r\n\r\n\r\n<p><strong><em>Dir dir = SPIFFS.openDir(\u00ab\/data\u00bb);<\/em><\/strong><br \/><strong><em>while (dir.next()) {<\/em><\/strong><br \/><em>\u00a0\u00a0<strong>Serial.print(dir.fileName());<\/strong>\u00a0\/\/ Nombre del archivo<\/em><br \/><em>\u00a0\u00a0<strong>File f = dir.openFile(\u00abr\u00bb);<\/strong>\u00a0\/\/ Abrir archivo<\/em><br \/><em>\u00a0\u00a0<strong>Serial.println(f.size());<\/strong>\u00a0\/\/ Tama\u00f1o, se vera m\u00e1s tarde.<\/em><br \/><em>\u00a0<strong>\u00a0if (dir.fileSize()) {<\/strong><\/em><br \/><em>\u00a0<strong>\u00a0File f=dir.openFile(\u2018r\u2019);<\/strong><\/em><br \/><em>\u00a0\u00a0<strong>Serial.println(f.size());<\/strong><\/em><br \/><em>\u00a0}<\/em><br \/><em>}<\/em><\/p>\r\n\r\n\r\n\r\n<ul class=\"wp-block-list\">\r\n<li>Muestra informaci\u00f3n del sistema de archivos:<\/li>\r\n<\/ul>\r\n\r\n\r\n\r\n<p class=\"is-layout-flow wp-block-quote-is-layout-flow\"><strong><em>FSInfo fs_info;<\/em><\/strong><br \/><strong><em>SPIFFS.info(fs_info);<\/em><\/strong><\/p>\r\n\r\n\r\n\r\n<ul class=\"wp-block-list\">\r\n<li>Si necesitamos eliminar un s\u00f3lo fichero usaremos:<\/li>\r\n<\/ul>\r\n\r\n\r\n\r\n<p class=\"is-layout-flow wp-block-quote-is-layout-flow\"><strong><em>SPIFFS.remove(path);\u00a0 \u00a0\u00a0<\/em><\/strong><em>Devuelve\u00a0<\/em><em>true\u00a0si ha sido correctamente eliminado<\/em><\/p>\r\n\r\n\r\n\r\n<ul class=\"wp-block-list\">\r\n<li>Si queremos renombrar un fichero usaremos:<\/li>\r\n<\/ul>\r\n\r\n\r\n\r\n<p class=\"is-layout-flow wp-block-quote-is-layout-flow\"><strong><em>SPIFFS.rename(pathFrom, pathTo);\u00a0<\/em><\/strong><em>Devuelve true si ha sido correctamente cambiado de nombre.<br \/><strong>SPIFFS_rename<\/strong>\u00a0 \u00a0 \u00a0 \u00a0 \u2013\u00a0Para renombrar archivos.<br \/><strong>SPIFFS_clearerr<\/strong>\u00a0 \u00a0 \u00a0 \u00a0\u2013 Para borra el \u00faltimo error.<br \/><strong>SPIFFS_info<\/strong>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u2013 Devuelve informaci\u00f3n sobre bytes usados \u200b\u200by totales en fs.<br \/><strong>SPIFFS_format<\/strong>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u2013 Para formatear el sistema de archivos.<br \/><strong>SPIFFS_mounted<\/strong>\u00a0 \u00a0 \u00a0 \u2013 Comprueba si el sistema de archivos est\u00e1 montado.<br \/><\/em><\/p>\r\n\r\n\r\n\r\n<ul class=\"wp-block-list\">\r\n<li>Para obtener informaci\u00f3n del sistema de archivos usaremos:<\/li>\r\n<\/ul>\r\n\r\n\r\n\r\n<p class=\"is-layout-flow wp-block-quote-is-layout-flow\"><em><strong>FSInfo fs_info;<\/strong><\/em><br \/><strong><em>SPIFFS.info(fs_info);<\/em><\/strong><\/p>\r\n\r\n\r\n\r\n<p>Donde la estructura FSInfo es:<\/p>\r\n\r\n\r\n\r\n<p class=\"is-layout-flow wp-block-quote-is-layout-flow\"><em><strong>struct FSInfo {<\/strong><\/em><br \/><em><strong>size_t totalBytes;\u00a0<\/strong>\/\/ Tama\u00f1o total utilizable en el sistema de archivos en bytes<\/em><br \/><em><strong>size_t usedBytes;\u00a0<\/strong>\/\/ Bytes usados en el sistema de archivos<\/em><br \/><em><strong>size_t blockSize;\u00a0<\/strong>\/\/ Tama\u00f1o del bloque, en bytes<\/em><br \/><em><strong>size_t pageSize;\u00a0<\/strong>\/\/ Tama\u00f1o de la p\u00e1gina, en bytes<\/em><br \/><em><strong>size_t maxOpenFiles;\u00a0<\/strong>\/\/ Num. m\u00e1ximo de archivos simult\u00e1neamente abiertos.<\/em><br \/><em><strong>size_t maxPathLength;\u00a0<\/strong>\/\/ Tama\u00f1o m\u00e1ximo del path, incluyendo el \u2018\\0\u2019 final. Normalmente deber\u00eda ser 32<strong>.<\/strong><\/em><br \/><em><strong>};<\/strong><\/em><\/p>\r\n<p>&nbsp;<\/p>\r\n\r\n\r\n\r\n<p>Otra cualidad del flash ESP8266 es que tambi\u00e9n admite actualizaciones\u00a0<strong>OTA<\/strong>, no obstante, en este art\u00edculo nos limitaremos a la funcionalidad de SPIFFS.<\/p>\r\n\r\n\r\n\r\n<h3 class=\"wp-block-heading\">ESTRUCTURA DEL SISTEMA DE ARCHIVOS<\/h3>\r\n\r\n\r\n\r\n<p>S\u00f3lo a titulo de ejemplo: \u00ab<em>En primer lugar, necesitamos saber cu\u00e1nta memoria tiene el flash SPI, su tama\u00f1o de p\u00e1gina o tama\u00f1o de p\u00e1gina f\u00edsico y su\/s sector\/es de bloque (es decir, tama\u00f1o de bloque f\u00edsico). Esto puede ser deducido en la hoja de datos. Teniendo esto, primero se debe decidir aproximadamente la cantidad del flash SPI que deseamos darle a los SPIFFS.<\/em><\/p>\r\n\r\n\r\n\r\n<p><em>Digamos que su flash tiene tama\u00f1os de bloque f\u00edsico de 4kB, 16kB y 64kB. Entonces puede tener tama\u00f1os de bloque l\u00f3gicos de n * 4kB, o n * 16kB, o n * 64kB, donde n es un n\u00famero entero. La opci\u00f3n m\u00e1s com\u00fan es establecer el tama\u00f1o del bloque l\u00f3gico en la misma cantidad que un tama\u00f1o de bloque f\u00edsico. El tama\u00f1o del sistema de archivos debe ser un m\u00faltiplo entero del tama\u00f1o de bloque l\u00f3gico<\/em>\u00ab<em>.<\/em><\/p>\r\n\r\n\r\n\r\n<div class=\"wp-block-image\" style=\"text-align: center;\">\r\n<figure class=\"aligncenter is-resized\"><a href=\"https:\/\/www.diarioelectronicohoy.com\/blog\/imagenes\/2019\/06\/tabla_flash.gif\" target=\"_blank\" rel=\"noopener\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-4770\" src=\"https:\/\/www.diarioelectronicohoy.com\/blog\/imagenes\/2019\/06\/tabla_flash.gif\" alt=\"\" width=\"398\" height=\"335\" \/><\/a>\r\n<figcaption>Tabla 1<\/figcaption>\r\n<\/figure>\r\n<\/div>\r\n\r\n\r\n\r\n<p>Como se puede apreciar hay materia que estudiar, por lo que si est\u00e1 interesado usted puede adquirir los conocimientos que estime siguiendo las referencias que se muestran m\u00e1s abajo.<\/p>\r\n\r\n\r\n\r\n<div class=\"wp-block-image\" style=\"text-align: center;\">\r\n<figure class=\"aligncenter is-resized\"><a href=\"https:\/\/www.diarioelectronicohoy.com\/blog\/imagenes\/2019\/06\/tabla_flash.gif\" target=\"_blank\" rel=\"noopener\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-4771\" src=\"https:\/\/www.diarioelectronicohoy.com\/blog\/imagenes\/2019\/06\/tabla_spiffs2.jpg\" alt=\"\" width=\"412\" height=\"134\" srcset=\"https:\/\/www.diarioelectronicohoy.com\/blog\/imagenes\/2019\/06\/tabla_spiffs2.jpg 823w, https:\/\/www.diarioelectronicohoy.com\/blog\/imagenes\/2019\/06\/tabla_spiffs2-300x97.jpg 300w, https:\/\/www.diarioelectronicohoy.com\/blog\/imagenes\/2019\/06\/tabla_spiffs2-768x249.jpg 768w, https:\/\/www.diarioelectronicohoy.com\/blog\/imagenes\/2019\/06\/tabla_spiffs2-820x266.jpg 820w\" sizes=\"auto, (max-width: 412px) 100vw, 412px\" \/><\/a>\r\n<figcaption>Tabla 2<\/figcaption>\r\n<\/figure>\r\n<\/div>\r\n\r\n\r\n\r\n<p>Para m\u00e1s informaci\u00f3n, consulte la\u00a0<a href=\"https:\/\/github.com\/pellepl\/spiffs\/wiki\">wiki<\/a>\u00a0para\u00a0<a href=\"https:\/\/github.com\/pellepl\/spiffs\/wiki\/Configure-spiffs\">configurar spiffs<\/a>,\u00a0<a href=\"https:\/\/github.com\/pellepl\/spiffs\/wiki\/Integrate-spiffs\">integrar spiffs<\/a>,\u00a0<a href=\"https:\/\/github.com\/pellepl\/spiffs\/wiki\/Using-spiffs\">usar spiffs<\/a>\u00a0y\u00a0<a href=\"https:\/\/github.com\/pellepl\/spiffs\/wiki\/Performance-and-Optimizing\">optimizar spiffs<\/a>.<\/p>\r\n\r\n\r\n\r\n<p>El sistema de archivos tiene unas limitaciones que debemos tener en cuenta:<\/p>\r\n\r\n\r\n\r\n<ul class=\"wp-block-list\">\r\n<li>La longitud m\u00e1xima de la ruta de archivos es 31 caracteres.<\/li>\r\n<li>No admite directorios. Sin embargo, podemos usar \u00ab\/\u00bb dentro del nombre de archivo (\u00ab\/proyecto\/boceto1.txt\u00bb ser\u00eda un nombre completo, no un archivo dentro de la carpeta \u00abproyecto\u00bb).<\/li>\r\n<\/ul>\r\n\r\n\r\n\r\n<p>Como vemos SPIFFS no soporta directorios, s\u00f3lo almacena una lista \u2018plana\u2019 de ficheros. Por el contrario que un sistema de ficheros tradicional, el car\u00e1cter (slash) \u2018\/\u2019 est\u00e1 permitido en los nombres de ficheros, de modo que las funciones que se ocupan de listar directorios por ejemplo, openDir(\u00ab\/website\u00bb), b\u00e1sicamente solo filtra los nombres de archivo y conserva los que comienzan con el prefijo solicitado ( \/website\/).<\/p>\r\n\r\n\r\n\r\n<p>La longitud m\u00e1xima de la ruta de archivos es 31 caracteres, este l\u00edmite se alcanza f\u00e1cilmente y si se ignora, los problemas podr\u00edan pasar desapercibidos porque no aparecer\u00e1 ning\u00fan mensaje de error en la compilaci\u00f3n ni en el tiempo de ejecuci\u00f3n. Se recomienda mantener los nombres de archivo cortos y no usar directorios anidados profundamente. Por ejemplo, el nombre de\u00a0<em>archivo \/website\/images\/bird_thumbnail.jpg<\/em>, tiene 34 caracteres y causar\u00e1 problemas si se utiliza, por ejemplo en\u00a0<strong>exists()<\/strong><\/p>\r\n\r\n\r\n\r\n<h3 class=\"wp-block-heading\">CU\u00c1NTA FLASH TIENE MI ESP8266.<\/h3>\r\n\r\n\r\n\r\n<p>Es tanta la variedad de suministradores de los dispositivos ESP8266, a parte que no est\u00e1n disponibles los datos de estos productos y por tanto no son claros ni concisos. He estado leyendo que hay que averiguar qu\u00e9 tama\u00f1o tiene nuestro flash y que existe un m\u00e9todo bastante fiable y r\u00e1pido consistente en cargar el dispositivo con el boceto\u00a0<a href=\"https:\/\/github.com\/esp8266\/Arduino\/tree\/master\/libraries\/esp8266\/examples\/CheckFlashConfig\">CheckFlashConfig.ino<\/a>\u00a0y revisar la salida del monitor serie como se muestra en la imagen de la figura 8.<\/p>\r\n\r\n\r\n\r\n<p>El c\u00f3digo\u00a0<strong>CheckFlashConfig.ino<\/strong>\u00a0es un ejemplo que viene en la librer\u00eda que nos permitir\u00e1 conocer los valores del\u00a0<em>ID flash real<\/em>,\u00a0<em>tama\u00f1o del Flash ide<\/em>, la\u00a0<em>velocidad Flash ide<\/em>,\u00a0<em>Flash ide mode<\/em>\u00a0y si la\u00a0<em>Configuraci\u00f3n del chip flash ok<\/em>. Abra el monitor serie para ver los valores que tiene su ESP.<\/p>\r\n\r\n\r\n\r\n<p>Al compilar el boceto\u00a0<em>CheckFlashConfig.ino<\/em>, puede que obtenga usted alg\u00fan error, si es as\u00ed, observe la siguiente figura.<\/p>\r\n\r\n\r\n\r\n<div class=\"wp-block-image\" style=\"text-align: center;\">\r\n<figure class=\"aligncenter is-resized\"><a href=\"https:\/\/www.diarioelectronicohoy.com\/blog\/imagenes\/2019\/06\/error_tarjeta.jpg\" target=\"_blank\" rel=\"noopener\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-4772\" src=\"https:\/\/www.diarioelectronicohoy.com\/blog\/imagenes\/2019\/06\/error_tarjeta.jpg\" alt=\"\" width=\"378\" height=\"114\" srcset=\"https:\/\/www.diarioelectronicohoy.com\/blog\/imagenes\/2019\/06\/error_tarjeta.jpg 734w, https:\/\/www.diarioelectronicohoy.com\/blog\/imagenes\/2019\/06\/error_tarjeta-300x91.jpg 300w\" sizes=\"auto, (max-width: 378px) 100vw, 378px\" \/><\/a>\r\n<figcaption>Fig. 5<\/figcaption>\r\n<\/figure>\r\n<\/div>\r\n\r\n\r\n\r\n<p>Revise en el Men\u00fa\/Herramientas\/Placa\u2026 la versi\u00f3n de la tarjeta, debe ser la versi\u00f3n 2.6.0 (no la 2.5.0).<\/p>\r\n\r\n\r\n\r\n<div class=\"wp-block-image\" style=\"text-align: center;\">\r\n<figure class=\"aligncenter is-resized\"><a href=\"https:\/\/www.diarioelectronicohoy.com\/blog\/imagenes\/2019\/06\/version2_nodemcu.jpg\" target=\"_blank\" rel=\"noopener\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-4773\" src=\"https:\/\/www.diarioelectronicohoy.com\/blog\/imagenes\/2019\/06\/version2_nodemcu.jpg\" alt=\"\" width=\"403\" height=\"453\" srcset=\"https:\/\/www.diarioelectronicohoy.com\/blog\/imagenes\/2019\/06\/version2_nodemcu.jpg 731w, https:\/\/www.diarioelectronicohoy.com\/blog\/imagenes\/2019\/06\/version2_nodemcu-267x300.jpg 267w\" sizes=\"auto, (max-width: 403px) 100vw, 403px\" \/><\/a>\r\n<figcaption>Fig. 6<\/figcaption>\r\n<\/figure>\r\n<\/div>\r\n\r\n\r\n\r\n<p>Modifique su tarjeta elegida y compile, esta vez sin error.<\/p>\r\n\r\n\r\n\r\n<div class=\"wp-block-image\" style=\"text-align: center;\">\r\n<figure class=\"aligncenter is-resized\"><a href=\"https:\/\/www.diarioelectronicohoy.com\/blog\/imagenes\/2019\/06\/sin_error_tarjeta.jpg\" target=\"_blank\" rel=\"noopener\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-4774\" src=\"https:\/\/www.diarioelectronicohoy.com\/blog\/imagenes\/2019\/06\/sin_error_tarjeta.jpg\" alt=\"\" width=\"452\" height=\"135\" srcset=\"https:\/\/www.diarioelectronicohoy.com\/blog\/imagenes\/2019\/06\/sin_error_tarjeta.jpg 734w, https:\/\/www.diarioelectronicohoy.com\/blog\/imagenes\/2019\/06\/sin_error_tarjeta-300x90.jpg 300w\" sizes=\"auto, (max-width: 452px) 100vw, 452px\" \/><\/a>\r\n<figcaption>Fig. 7<\/figcaption>\r\n<\/figure>\r\n<\/div>\r\n\r\n\r\n\r\n<p>Ahora, ya puede subir su boceto CheckFlashConfig.ino y abra su monitor serie, para comprobar el tama\u00f1o de su SPIFFS.<\/p>\r\n\r\n\r\n\r\n<div class=\"wp-block-image\" style=\"text-align: center;\">\r\n<figure class=\"aligncenter is-resized\"><a href=\"https:\/\/www.diarioelectronicohoy.com\/blog\/imagenes\/2019\/06\/salida_monitor_checkflash1.gif\" target=\"_blank\" rel=\"noopener\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-4775\" src=\"https:\/\/www.diarioelectronicohoy.com\/blog\/imagenes\/2019\/06\/salida_monitor_checkflash1.gif\" alt=\"\" width=\"237\" height=\"301\" \/><\/a>\r\n<figcaption>Fig, 8<\/figcaption>\r\n<\/figure>\r\n<\/div>\r\n\r\n\r\n\r\n<p>Para alcanzar un conocimiento optimo, siga la regla: prueba, ensayo error y prueba.<\/p>\r\n\r\n\r\n\r\n<h3 class=\"wp-block-heading\">PONER EN USO.<\/h3>\r\n\r\n\r\n\r\n<ul class=\"wp-block-list\">\r\n<li>Abra un boceto (o cree uno nuevo y gu\u00e1rdelo).<\/li>\r\n<li>Vaya al directorio de bocetos (elija Boceto&gt; Mostrar carpeta de bocetos).<\/li>\r\n<li>Cree un directorio con el nombre data con los archivos que desee en el sistema.<\/li>\r\n<li>Aseg\u00farese de haber seleccionado una placa, un puerto y el monitor serie cerrado.<\/li>\r\n<li>Seleccione Herramientas&gt; ESP8266 Elemento de men\u00fa Cargar datos de croquis .<br \/>Ya deber\u00eda comenzar a cargar los archivos en el sistema de archivos flash ESP8266.<br \/>Cuando haya terminado, la barra de estado IDE mostrar\u00e1 el mensaje de carga de<br \/>imagen SPIFFS. Puede tardar unos minutos para tama\u00f1os de sistema de archivos grandes.<\/li>\r\n<\/ul>\r\n\r\n\r\n\r\n<h3 class=\"wp-block-heading\">VEAMOS UNOS EJEMPLOS.<\/h3>\r\n\r\n\r\n\r\n<p>Como ya se ha dicho deberemos incluir un archivo por ejemplo\u00a0<em>file.txt<\/em>\u00a0con los datos que necesitemos subir, dentro de una carpeta con el nombre data.<\/p>\r\n\r\n\r\n\r\n<p>Aunque los ejemplos que se describen en este art\u00edculo hacen referencia al ESP8266-01, funcionan igualmente con los ESP-07, ESP8266-12, ESP8266-12E, ESP8266-13, etc.<\/p>\r\n\r\n\r\n\r\n<h4 class=\"wp-block-heading\">EJEMPLO DE UTILIDAD SPIFFS.<\/h4>\r\n\r\n\r\n\r\n<p>Leer y escribir en un archivo.<\/p>\r\n\r\n\r\n\r\n<pre class=\"wp-block-code\"><code>\/*leer_escribir_spiffs.ino\r\nEl c\u00f3digo intenta primero abrir un archivo llamado f.txt. \r\nSi esto tiene \u00e9xito, leer\u00e1 l\u00ednea por l\u00ednea e imprimir\u00e1 el \r\nresultado en la consola serie. Si no puede abrir el archivo, \r\nprobablemente no exista todav\u00eda. El c\u00f3digo crear\u00e1 el \r\narchivo y lo llenar\u00e1 con algunos pares de valor \/ clave \r\nimaginarios, un par por l\u00ednea. \r\n*\/\r\n\r\n#include \"FS.h\" \/\/ incluir librer\u00eda FS.h\r\n\r\nvoid setup() {\r\n Serial.begin(115200); \r\n\r\n\/\/ Siempre usa esto para \"montar\" el sistema de archivos\r\nbool result = SPIFFS.begin();\r\nSerial.println(\"SPIFFS opened: \" + result);\r\n\r\n\/\/ esto abre el archivo \"prueba.txt\" en modo lectura\r\nFile f = SPIFFS.open(\"\/prueba.txt\", \"r\");\r\n\r\nif (!f) {\r\n  Serial.println(\"File doesn't exist yet. Creating it\");\r\n\r\n\/\/ abre el archivo en modo de escritura\r\n File f = SPIFFS.open(\"\/prueba.txt\", \"w\");\r\n if (!f) {\r\n  Serial.println(\"file creation failed\");\r\n }\r\n\/\/ ahora escribe dos l\u00edneas en estilo de clave\/valor con caracteres de fin de l\u00ednea\r\n  f.println(\"ssid=abc\");\r\n  f.println(\"password=123455secret\");\r\n} else {\r\n\/\/ podr\u00edamos abrir el archivo.\r\n while(f.available()) {\r\n\/\/ Permite leer l\u00ednea por l\u00ednea desde el archivo\r\n  String line = f.readStringUntil('\\n');\r\n  Serial.println(line);\r\n }\r\n\r\n  }\r\n  file.close();\r\n }\r\n\r\nvoid loop() {\r\n  \/\/ nada m\u00e1s que hacer por ahora, esto es s\u00f3lo una simple prueba\r\n}<\/code><\/pre>\r\n\r\n\r\n\r\n<p>El siguiente es otro ejemplo m\u00e1s elaborado que, muestra como leer y escribir en un archivo.<\/p>\r\n\r\n\r\n\r\n<h4 class=\"wp-block-heading\">EJEMPLO DE LECTURA Y ESCRITURA DE ARCHIVOS SPIFFS.<\/h4>\r\n\r\n\r\n\r\n<pre class=\"wp-block-code\"><code>\/\/ EJEMPLO DE LECTURA Y ESCRITURA DE ARCHIVOS\r\n\/\/\r\n\/\/ El boceto se adjunta aqu\u00ed, tal vez sea de utilidad para cualquiera.\r\n\/\/ Este boceto Spiffs es muy b\u00e1sico, escribe 10 cadenas en \r\n\/\/ el sistema de archivos SPIFFS, y luego los lee de nuevo\r\n\/\/ Para doc. SPIFFS ver:\r\n\/\/ https:\/\/github.com\/esp8266\/Arduino\/blob\/master\/doc\/filesystem.md\r\n\/\/ Compilar en Arduino 1.6.7. Funciona bien en el tablero Wemos D1 ESP8266.\r\n\r\n#include \"FS.h\"\r\n\r\nvoid setup() {\r\nSerial.begin(9600);\r\nSerial.println(\"Ejemplo de SPIFFS muy b\u00e1sico, escribe 10 l\u00edneas en el sistema de archivos y luego las lee\\n\");\r\nSPIFFS.begin();\r\n\/\/Las siguientes l\u00edneas se deben hacer SOLAMENTE UNA VEZ !!!!!\r\n\/\/Cuando SPIFFS est\u00e1 formateado UNA VEZ, puede comentar estas l\u00edneas!!\r\nSerial.println(\"Espere 30 segundos para que se formatee el SPIFFS\"); \r\nSPIFFS.format();\r\nSerial.println(\"Spiffs formateado\"); \r\n}\r\n\r\nvoid loop() {\r\n\r\n\/\/ abrir archivo para escribir\r\nFile f = SPIFFS.open(\"\/f.txt\", \"w\");\r\nif (!f) {\r\nSerial.println(\"Fallo apertura de archivo\"); \r\n}\r\nSerial.println(\"====== Escribiendo en el archivo SPIFFS =========\");\r\n\/\/ write 10 strings to file\r\nfor (int i=1; i &lt; =10; i++){\r\nf.print(\"Millis() : \");\r\nf.println(millis());\r\nSerial.println(millis());\r\n}\r\n\r\nf.close();\r\n\r\n\/\/ open file for reading\r\nf = SPIFFS.open(\"\/f.txt\", \"r\");\r\nif (!f) {\r\nSerial.println(\"Fallo apertura de archivo\"); \r\n} Serial.println(\"====== Leyendo del archivo SPIFFS =======\"); \r\n\/\/ write 10 strings to file\r\nfor (int i=1; i&lt; =10; i++){\r\nString s=f.readStringUntil('\\n');\r\nSerial.print(i);\r\nSerial.print(\":\");\r\nSerial.println(s);\r\n}\r\n\r\n\/\/ Espera unos segundos antes de volver a hacerlo.\r\ndelay(3000);\r\n} <\/code><\/pre>\r\n\r\n\r\n\r\n<p>El siguiente boceto nos muestra un caso en el que nos hemos visto alguna vez, cuando hemos perdido la conexi\u00f3n del suministro el\u00e9ctrico, perdiendo el \u00faltimo estado o valor de una funci\u00f3n o un simple pulsador. En este caso, se recuperar\u00e1 el estado en que ha quedado un LED en el momento de perder por alg\u00fan motivo la energ\u00eda.<\/p>\r\n\r\n\r\n\r\n<h4 class=\"wp-block-heading\">EJEMPLO PR\u00c1CTICO DE UTILIDAD SPIFFS.<\/h4>\r\n\r\n\r\n\r\n<p>Muestra como recuperar el \u00faltimo estado de un LED, despu\u00e9s del reinicio.<\/p>\r\n\r\n\r\n\r\n<pre class=\"wp-block-code\"><code>\/* estado_led_memoria.ino\r\nC\u00f3digo de https:\/\/www.filipeflop.com\/\r\n\r\nEl primer intento se utiliza en un archivo para guardar el estado on\/off \r\nde un LED. Presionando el bot\u00f3n podemos cambiar el estado. Incluso si la \r\nenerg\u00eda se apaga, el estado del LED se guardar\u00e1 en la memoria. Cuando \r\nconectamos nuevamente la placa, el sistema busca el estado guardado en la\r\nmemoria y actualiza el estado del LED.\r\n\r\nEs importante notar que el programa debe grabarse dos veces. La primera \r\nvez la l\u00ednea 62 ( escritura de archivo ( \"off\", \"\/state.txt\") ) debe ser \r\nsin comentar, creando un archivo en la memoria. En la segunda y dem\u00e1s \r\nprogramaciones, la l\u00ednea debe ser comentada, pues el archivo ya existir\u00e1 \r\nen la memoria.\r\n*\/\r\n\r\n#include \"FS.h\"\r\n\r\nint led = D1;\r\nint llave = D0; \r\n\r\n\/**\r\n* escribe contenido en un archivo\r\n* string state - contenido a escribir en el archivo\r\n* string path - archivo que se va a escribir\r\n*\/\r\n\r\nvoid writeFile(String state, String path) {\r\n \/\/Abre el archivo para escribir (\"w\" write))\r\n \/\/Sobreescribe el contenido del archivo\r\n File rFile = SPIFFS.open(path,\"w+\");\r\n if(!rFile){\r\n  Serial.println(\"Error al abrir archivo!\");\r\n } else {\r\n  rFile.println(state);\r\n  Serial.print(\"grab\u00f3 estado: \");\r\n  Serial.println(state);\r\n }\r\n rFile.close();\r\n}\r\n\r\n\/**\r\n* el contenido de un archivo\r\n* param cadena path - archivo que se va a leer\r\n* return string - contenido le\u00eddo del archivo\r\n*\/\r\n\r\nString readFile(String path) {\r\n File rFile = SPIFFS.open(path,\"r\");\r\n if (!rFile) {\r\n  Serial.println(\"Error al abrir archivo!\");\r\n }\r\n String content = rFile.readStringUntil('\\r'); \r\n Serial.print(\"lectura de estado: \");\r\n Serial.println(content);\r\n rFile.close();\r\n return content;\r\n}\r\n\r\n\/**\r\n* @desc inicializa el sistema de archivos\r\n*\/\r\n\r\nvoid openFS(void){\r\n \/\/Abre el sistema de archivos\r\n if(!SPIFFS.begin()){\r\n  Serial.println(\"\\nError al abrir el sistema de archivos\");\r\n } else {\r\n  Serial.println(\"\\nSistema de archivos abierto con \u00e9xito!\");\r\n }\r\n}\r\n\r\nvoid setup() {\r\n pinMode(led, OUTPUT);\r\n pinMode(llave, INPUT); \r\n Serial.begin(9600);\r\n openFS();\r\n\r\n\/\/ en el primer upload de programa el archivo state.txt se debe crear con el contenido \"off\"\r\n\/\/ en el segundo upload la l\u00ednea debe ser comentada.\r\n\/\/ writeFile(\"off\", \"\/state.txt\"); \/\/ esta l\u00ednea debe ser comentada\r\n\r\n\/\/ comprueba el \u00faltimo estado del LED y se activa de acuerdo\r\n String state = readFile(\"\/state.txt\");\r\n if(state == \"on\") {\r\n  digitalWrite(led, HIGH);\r\n }\r\n else if(state == \"off\") {\r\n  digitalWrite(led, LOW);\r\n }\r\n}\r\n\r\nvoid loop() {\r\n\/*\r\n* comprueba el estado anterior que salvo en el archivo,\r\n* activa el LED de acuerdo y escribe el nuevo\r\n* estado del archivo.\r\n*\/\r\n if(digitalRead(llave) == LOW) \/\/ chave\r\n {\r\n  String state = readFile(\"\/state.txt\");\r\n  if(state == \"off\")\r\n  {\r\n  writeFile(\"on\", \"\/state.txt\");\r\n  digitalWrite(led, HIGH);\r\n }\r\n else if(state == \"on\")\r\n {\r\n  writeFile(\"off\", \"\/state.txt\");\r\n  digitalWrite(led, LOW);\r\n }\r\n  while(digitalRead(llave) == LOW); \r\n }\r\n}<\/code><\/pre>\r\n\r\n\r\n\r\n<p>En el boceto, lo primero es incluir la librer\u00eda FS.h y en este caso asignar los pines que vamos a utilizar como son:<\/p>\r\n\r\n\r\n\r\n<pre class=\"wp-block-preformatted\"> D0 como salida para manejar el LED y \r\n D1 como entrada para el pulsador que actuar\u00e1 con el LED<\/pre>\r\n\r\n\r\n\r\n<p>Considero que est\u00e1 bastante documentado y es bastante explicito el c\u00f3digo. Se comprende que tenemos que subir el c\u00f3digo una primera vez descomentada, la l\u00ednea:<\/p>\r\n\r\n\r\n\r\n<pre class=\"wp-block-preformatted\">writeFile(\"off\", \"\/state.txt\");<\/pre>\r\n\r\n\r\n\r\n<p>Para que se guarde el estado \u2018off\u2019 en la memoria flash. De modo que la segunda vez que subamos el c\u00f3digo, dicha l\u00ednea la debemos comentar.<\/p>\r\n\r\n\r\n\r\n<pre class=\"wp-block-preformatted\">\/\/ writeFile(\"off\", \"\/state.txt\");<\/pre>\r\n\r\n\r\n\r\n<p>Si todo ha ido bien y as\u00ed lo espero, ya podemos comprobar el efecto que hemos subido con este c\u00f3digo. Primero, podemos presionar el pulsador y en cada pulsaci\u00f3n se enciende o apaga el LED, al pulsar de nuevo se encender\u00e1, desconectemos la energ\u00eda quitando el cable USB o bater\u00eda, con lo cual se apagar\u00e1 el LED y si volvemos a conectar el cable USB o la alimentaci\u00f3n, veremos que el LED vuelve a encenderse, que es el estado que ten\u00eda al quitar la energ\u00eda.<\/p>\r\n\r\n<div align=\"center\"><iframe loading=\"lazy\" title=\"YouTube video player\" src=\"https:\/\/www.youtube.com\/embed\/ABd5elXJRMQ\" width=\"560\" height=\"315\" frameborder=\"0\" allowfullscreen=\"allowfullscreen\"><\/iframe><\/div>\r\n<!-- \/wp:post-content -->\r\n\r\n<!-- wp:paragraph -->\r\n<p>En el v\u00eddeo se aprecia lo descrito, en esta pr\u00e1ctica he guardado el estado del LED encendido, por que se aprecia mejor que se ha guardado, ya que al volver a darle energ\u00eda el LED aparecer\u00e1 encendido, usted puede guardar otra informaci\u00f3n que se adapte a sus necesidades como datos de sensores, datos para una base de datos, hojas excel, etc.<\/p>\r\n<!-- \/wp:paragraph -->\r\n\r\n<!-- wp:paragraph -->\r\n<p>Esto es todo, por este simple tutorial, espero sus preguntas. No haga malas pr\u00e1cticas, sin insultos ni faltas de respeto, sea positivo.<\/p>\r\n<!-- \/wp:paragraph -->\r\n\r\n<!-- wp:heading {\"level\":5} -->\r\n<h5>REFERENCIAS:<\/h5>\r\n<!-- \/wp:heading -->\r\n\r\n<!-- wp:list -->\r\n<ul>\r\n<li><em><a href=\"https:\/\/github.com\/esp8266\/Arduino\/blob\/master\/cores\/esp8266\/spiffs\/README.md\" target=\"_blank\" rel=\"noreferrer noopener\">SPIFFS (SPI Flash File System)<\/a><\/em><\/li>\r\n<li><a href=\"https:\/\/github.com\/pellepl\/spiffs\/wiki\">SPIFFS WiKi<\/a><\/li>\r\n<li><a href=\"https:\/\/github.com\/pellepl\/spiffs\/wiki\/FAQ\">Preguntas m\u00e1s frecuentes<\/a><\/li>\r\n<li><a href=\"https:\/\/github.com\/pellepl\/spiffs\/wiki\/Integrate-spiffs\">Integrar spiffs<\/a><\/li>\r\n<li><a href=\"https:\/\/github.com\/pellepl\/spiffs\/wiki\/Configure-spiffs\">Configurar spiffs<\/a><\/li>\r\n<li><a href=\"https:\/\/github.com\/pellepl\/spiffs\/wiki\/Using-spiffs\">Usando spiffs<\/a><\/li>\r\n<li><a href=\"https:\/\/github.com\/pellepl\/spiffs\/wiki\/Performance-and-optimizing\">Rendimiento y optimizaci\u00f3n<\/a><\/li>\r\n<li><a href=\"https:\/\/github.com\/esp8266\/Arduino\/blob\/master\/doc\/filesystem.md#file-system-object-spiffs\">SPIFFS GIT HUB P\u00e1gina de inicio<\/a><\/li>\r\n<li><a href=\"http:\/\/www.esploradores.com\/uso-memoria-flash-para-almacenamiento-de-datos\/\">Uso memoria flash<\/a><\/li>\r\n<\/ul>\r\n<!-- \/wp:list -->\r\n\r\n<!-- wp:paragraph -->\r\n<p>&nbsp;<\/p>\r\n<!-- \/wp:paragraph -->","protected":false},"excerpt":{"rendered":"<p>Funcionalidad de SPIFFS. QU\u00c9 ES SPIFFS. Podemos decir que SPIFFS es un sistema de archivos destinado a dispositivos flash SPI NOR embebidos. Vamos a aprender en detalle c\u00f3mo utilizar el SPIFFS (del ingl\u00e9s Serial Peripheral Interface Flash Fail System), como configurar nuestro IDE de Arduino y as\u00ed, poder cargar archivos en el ESP8266, aunque el [&hellip;]<\/p>\n","protected":false},"author":4,"featured_media":4765,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_exactmetrics_skip_tracking":false,"_exactmetrics_sitenote_active":false,"_exactmetrics_sitenote_note":"","_exactmetrics_sitenote_category":0,"footnotes":""},"categories":[289,342,15],"tags":[310,344,343],"class_list":["post-4764","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-esp8266","category-funcionalidad-de-spiffs","category-microcontroladores","tag-esp8266-01","tag-nodemcu12e","tag-spiffs"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.diarioelectronicohoy.com\/blog\/wp-json\/wp\/v2\/posts\/4764","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.diarioelectronicohoy.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.diarioelectronicohoy.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.diarioelectronicohoy.com\/blog\/wp-json\/wp\/v2\/users\/4"}],"replies":[{"embeddable":true,"href":"https:\/\/www.diarioelectronicohoy.com\/blog\/wp-json\/wp\/v2\/comments?post=4764"}],"version-history":[{"count":17,"href":"https:\/\/www.diarioelectronicohoy.com\/blog\/wp-json\/wp\/v2\/posts\/4764\/revisions"}],"predecessor-version":[{"id":5485,"href":"https:\/\/www.diarioelectronicohoy.com\/blog\/wp-json\/wp\/v2\/posts\/4764\/revisions\/5485"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.diarioelectronicohoy.com\/blog\/wp-json\/wp\/v2\/media\/4765"}],"wp:attachment":[{"href":"https:\/\/www.diarioelectronicohoy.com\/blog\/wp-json\/wp\/v2\/media?parent=4764"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.diarioelectronicohoy.com\/blog\/wp-json\/wp\/v2\/categories?post=4764"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.diarioelectronicohoy.com\/blog\/wp-json\/wp\/v2\/tags?post=4764"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}