
SPIFFS - (Sistema de arquivos Flash da Interface Periférica Serial) para memória flash conectada por uma interface periférica serial. Em palavras simples: existe um microcontrolador ESP32 (Figura 1), que possui uma memória NOR não volátil regravável, que armazena: Preferências, gerenciador de inicialização, firmware (esboço compilado), sistema de arquivos (SPIFFS) e outra coisa algo como uma atualização over-the-air (OTA).

Figura 1. Diagrama de blocos funcionais do microcontrolador ESP32
A memória NOR é um tipo de memória regravável não volátil que possui uma velocidade de leitura bastante alta, velocidade de gravação e exclusão relativamente baixa, em comparação com o tipo de memória NAND . É quase impossível encontrar memória NOR de grande capacidade, geralmente limitada a 128 MB. No caso do ESP32 - quatro .
Hoje, o SPIFFS tem algumas desvantagens. falhas , incluindo: falta de suporte a pastas; não é uma pilha em tempo real; portanto, a mesma operação pode levar tempos diferentes; falta de habilidade para encontrar e consertar blocos quebrados. Se as deficiências listadas não são críticas para você, continuamos a ler o próximo parágrafo.
Vamos falar sobre o uso
Infelizmente, fora da caixa, a memória do microcontrolador não está marcada como SPIFFS. Para marcá-la, você precisa usar o plug- in ESP32FS para o ambiente de desenvolvimento do Arduino IDE.
Após o download do plug-in, ele deve ser instalado:
- Verifique se você possui a versão mais recente do ambiente de desenvolvimento do Arduino IDE e o driver do seu dispositivo no ESP32 instalado . Eu tenho o driver M5Stack CP210X que eu baixo deste link;
- Copie a pasta da ferramenta baixada com o plug-in incorporado na pasta / Arduino / tools / ESP32FS / ;
- No macOS, a pasta está localizada em ~ / Documents / Arduino / ;
- Reinicie o computador e verifique no ambiente de desenvolvimento no menu Ferramentas o item Upload de dados de esboço do ESP32 aparece (Figura 2) - isso significa que você fez tudo corretamente;

Figura 2. Menu Ferramentas
- Preste atenção na pasta de dados localizada ao lado do esboço. Todos os arquivos localizados nesta pasta serão carregados na memória do dispositivo durante a formatação;
- Sinta-se livre para selecionar o item indicado e aguarde até o final da formatação da área de memória. Observe que outras seções da memória NÃO serão afetadas, o que significa que o firmware permanecerá na memória do dispositivo e funcionará. Da mesma forma que no esboço, quando ele é compilado no firmware e baixado no dispositivo, o sistema de arquivos não será afetado.
Se você quer conforto
Se você quiser tocar em arquivos e ver informações sobre espaço livre, faça o download do esboço BRIDGE e faça o flash do dispositivo.
Também baixar e compilar gerenciador de arquivos de plataforma cruzada A-Explorer (Figura 3). No GitHub, os binários em breve estarão na pasta bin .

Figura 3 a. Gerenciador de arquivos A-Explorer para macOS

Figura 3, b. Gerenciador de arquivos A-Explorer para Windows
Este gerenciador de arquivos permitirá que você descubra informações sobre espaço livre, carregue / faça o download / exclua arquivos. Há uma indicação do andamento da operação.
Como você pode ver na Figura 3, o plug-in alocou aproximadamente 1,38 MB de memória no SPIFFS.
Quem é essa PONTE?
O BRIDGE é um esboço e, antes de tudo, uma função com o mesmo nome que funciona com o sistema de arquivos SPIFFS e o A-Explorer é um shell gráfico para ele. O último envia um comando ou outro, e essa função o processa no próprio dispositivo usando as bibliotecas FS e SPIFFS . Vamos ver o que é interessante nessas bibliotecas.
Vamos começar examinando os métodos públicos da classe SPIFFS :
Método Bool Begin (bool formatOnFail = false, const char * basePath = "/ spiffs", uint8_t maxOpenFiles = 10). Este método tenta inicializar uma instância da classe. O primeiro argumento é verdadeiro ou falso, caso o sistema de arquivos deva ser formatado se o sistema de arquivos não estiver formatado. O segundo argumento segue o caminho onde a raiz do sistema de arquivos estará localizada. O terceiro argumento determinará o número de arquivos abertos simultaneamente. É melhor deixar os dois últimos parâmetros padrão e não alterá-los. Se o sistema de arquivos estiver ausente (o plugin acima não foi usado). então a função retornará false.
O método bool format () verifica se o sistema de arquivos está formatado - retorna true, caso contrário - false.
Método size_t totalBytes (). Este método retorna o número size_t do número total de bytes alocados para o sistema de arquivos.
Método Size_t usedBytes (). Este método retorna o número size_t de bytes usados no sistema de arquivos.
Anule o método end (). Esse método desinicializa essa classe. Depois de chamar esse método, não faz sentido chamar outros métodos.
Tudo nesta classe, não há nada particularmente interessante. Vamos passar para a classe FS e ver o que pode ser útil a partir daí.
A primeira coisa que chama sua atenção é o método inicializador da classe bool begin (). Este método não requer argumentos e não é necessário chamá-lo, porque usaremos o próximo método imediatamente.
O método File open (const char path, modo const char ) e seu irmão File open (const String & path, const char * mode). Esses métodos usam dois argumentos, o primeiro dos quais é um ponteiro simbólico e de seqüência de caracteres para o caminho do arquivo e o segundo é o modo de abertura, que pode ser a seguinte constante:
FILE_READ - aberto apenas para leitura;
FILE_WRITE - aberto apenas para gravação;
FILE_APPEND - aberto para substituição.
Depois que abrimos o arquivo, agora podemos executar quaisquer operações nele.
- O método size_t write (uint8_t) permite gravar um número inteiro não assinado de 8 bits no final do arquivo.
- O método de gravação size_t (const uint8_t * buf, size_t size) permite escrever uma série de números inteiros não assinados do comprimento especificado no segundo argumento.
- O método int available () conta o número de caracteres do final ao ponteiro.
- O método int read () lê um caractere do arquivo e o retorna como um número inteiro, enquanto o cursor move uma unidade para a direita.
- O método size_t readBytes (char * buffer, size_t length) lê caracteres no buffer apontado pelo primeiro argumento e o número de caracteres passados pelo segundo argumento. Retorna o número de caracteres lidos.
- O método String readString () lê uma linha de um arquivo.
- O método int peek () funciona de maneira semelhante ao método int read (), apenas o cursor permanece no lugar.
- O método bool seek (uint32_t pos, modo SeekMode) e bool seek (modo uint32_t pos, modo SeekMode) define o cursor para o local especificado. A posição é passada como o primeiro argumento e a segunda regra ( SeekSet - defina o cursor). Se for bem-sucedido - retorna verdadeiro, caso contrário - falso.
- O método size_t position () retorna a posição do cursor.
- O método size_t size () retorna o tamanho do arquivo em bytes.
- O método const char * name () retorna o nome do arquivo.
- O método const char * fullName (), levando em consideração o caminho completo.
- O método bool isFile () retornará true se o objeto aberto for um arquivo. Caso contrário - uma mentira.
- O método bool isDirectory () retornará true se o objeto aberto for uma pasta. Caso contrário - uma mentira.
- O método File openNextFile () retorna um ponteiro para o próximo arquivo na raiz, caso contrário, NULL.
- Os métodos bool existe (const char * path) e bool existe (const String & path) tomam o nome completo do arquivo como argumento e, se esse arquivo existe, ele retorna true, caso contrário, retorna false.
- Os métodos bool remove (const char * path) e bool remove (const String & path) tentam excluir o arquivo cujo nome é passado pelo argumento. Se for bem-sucedido, retorna verdadeiro, caso contrário - falso.
- Método bool rename (const char pathFrom, const char pathTo) e bool rename (const String & pathFrom, const String & pathTo); aceita o nome completo do arquivo como o primeiro argumento e o segundo como o novo nome completo do arquivo e renomeia-o.
Sim, sim, você pode pegar essa função e executá-la em um thread separado em qualquer outro esboço
Muito obrigado pelo seu tempo! Ficaria feliz se este artigo o beneficiar.
Referências e (ou) fontes:
- Sistema de arquivos SPIFFS aqui
- Trabalhe com o sistema de arquivos no complemento ESP8266 no IDE do Arduino aqui
- Uploader do sistema de arquivos Arduino ESP32 aqui