ESP32

Como escrever arquivos no SPIFFS com ESP32

SPIFFS com ESP32

SPIFFS com ESP32

Para manipular o SPIFFS com ESP32, vamos começar pela maneira mais simples de todas, utilizando o exemplo contido em File > Examples > SPIFFS.

Vou aproveitar o momento para dar uma dica que considero importante na hora de desenvolver.  É comum olhar pra um código, estranhar uma função/método por conter uma declaração com conceitos que não estão no nosso dia-a-dia e sentir preguiça. Nesse caso, a primeira coisa que vem à mente é: “Depois eu vejo”. A mesma coisa acontece quando olhamos pra um código buscando a última linha pra ver o quanto tem de trabalho. Mas isso é mais psicológico que outra coisa. Explico.



Nós vamos ver aqui diversas funções para manipulação de arquivos, mas quase não tem trabalho nenhum. Tudo bem, 159 linhas é pouco, mas olhando o que está implementado, é menos ainda. E veja porque:

  • Precisamos listar arquivos contidos no SPIFFS.
  • Precisamos ler arquivos criados, senão eles não tem finalidade.
  • Precisamos escrever arquivos no sistema de arquivos.
  • Podemos ter a habilidade de adicionar conteúdo a um arquivo existente.
  • Podemos querer renomear um arquivo.
  • Precisamos ter a capacidade de excluir um arquivo.
  • Podemos querer ver o tamanho de um arquivo.

Já é bastante satisfatória essa quantidade de recursos de manipulação de arquivos, não? E veja, são apenas 7 ítens. Mas aí a mente prega outra peça: Quanto vou ter que escrever de código para ter esses 7 ítens funcionando? – Bem, não devemos nos preocupar com isso. Se dividirmos em 7 etapas, podemos fazer uma função hoje, outra mais tarde, outra amanhã e daí por diante. Cada etapa é um objetivo alcançado, então, invés de implementar tudo de uma vez, defina objetivos.

Olhando a lista de tarefas acima, para poder satisfazer-se com cada etapa criada, qual seria o caminho ideal a seguir? Se estamos falando de manipulação de arquivos, a primeira coisa que precisamos é que os arquivos possam existir. Daí implementamos a função de criação de arquivos, mas como constatar o sucesso da operação? Então, suponhamos que só fossemos testar a criação de arquivos hoje, a implementação de código deveria ser:

1 – Função para a criação de arquivos

2 – Função para listar arquivos, assim comprovamos que ambas as funções funcionaram.

Vamos ao código.

Criação de arquivos com ESP32

Às vezes devemos tomar um pouco do nosso tempo estudando conceitos e entendendo as características de cada individuo de um recurso. Isso deixa as coisas mais claras, por isso que às vezes escrevo artigos mostrando uma pequena porção de código não funcional, apenas para poder discorrer a respeito. Eu poderia simplesmente colar código aqui e cumprir a tarefa de provar o conceito, mas isso não seria nada prazeroso pra você e nem para mim. O melhor é olhar pra um recurso e compreendê-lo, por essa razão elevo o nível de detalhamento sobre o que escrevo. Agora vamos compreender como funciona a criação de arquivos com o ESP32 na IDE do Arduino.

Para criar um arquivo, nós devemos escrevê-lo no sistema de arquivos SPIFFS. A manipulação do sistema de arquivos não é em tempo real porque o tempo de escrita de cada arquivo pode variar, mas isso está abstraido, portanto não precisamos nos preocupar com isso. A função contida no exemplo para escrita é essa:

Tem muitíssimas pessoas que só aprenderam a programar por causa do Arduino e muitas dessas programam apenas para Arduino. Olhando  a declaração da função pode lhes causar incômodo:

Em C++ utilizamos “::” para chamadas estáticas de uma classe e FS é uma classe de C++.  Em seguida, esse primeiro parâmetro da função writeFile tem um &fs, significando que esse parâmetro recebe um endereço (&) denominado fs.

O segundo parâmetro da função recebe um array constante de char. O ponteiro (*) indica o começo do array que será varrido. Esse segundo parâmetro é o nome de arquivo com o caminho completo. Isto é, você poderá criar diretórios. Vale lembrar que na documentação da versão anterior do ESP-IDF (não li a mais recente) está explicitado que não há suporte a criação de diretórios, mas no ESP8266 eu já fiz muito disso, então alguém aplicou um patch e não atualizaram a documentação. Além disso, esse é um exemplo da IDE do Arduino, portanto de algum modo, sim, é possível criar diretórios na atual versão.

O terceiro e último parâmetro é o conteúdo do arquivo. Não importa se você está manipulando fórmulas matemáticas para guardar seus valores, isso deverá ser convertido para um array de char, senão vai ficar muito esquisito. Fiz um exemplo rápido aqui no Linux pra mostrar o que acontece:

 

SPIFFS com ESP32
SPIFFS com ESP32

Agora o resultado:

SPIFFS com ESP32
SPIFFS com ESP32

Os primeiros 2 prints estão corretos. Os segundos, não. Isso porque char é um tipo de int também, não existe “letras” para o computador. O valor decimal correspondente ao char 0 é 48. Quando mandamos imprimir como inteiro (%d), o valor ASCII de char foi exibido. Quando mandamos imprimir ‘0’ como inteiro, bem. Eis o resultado. Em alguns dos meus códigos eu costumo subtrair 48 quando tenho que converter char pra int. Isso porque 48-48 é 0, 49-48 é 1 e assim por diante. Mas se você passar inteiros pro array de char e escrever sem converter dentro da função (ou previamente à função), terá resultados bem esquisitos no arquivo.

SPIFFS com ESP32 - ascii table

Listar diretório

Se não houver erro, a função writeFile imprime a mensagem de sucesso da operação. Mas não temos constatação visual e como humanos, queremos provar o conceito, hum?

Então vamos agora implementar a função de listar arquivos (e diretórios):

Listar diretório é mais simples ainda. Repare apenas que é feito um loop para listar os arquivos. Esse loop avalia file, que é subtraido pelo retorno da função root.openNextFile(). Se reparar, a maior parte dessa função é composta por condicionais para avaliar excessões; condições que podem gerar erro. Se você não tratar as excessões, algumas anomalias podem acontecer, como por exemplo, reset do ESP32.

Apagar um arquivo

A função é trivial, nem tem o que falar dela:

Da implementação nativa do ESP-IDF, o arquivo é removido com unlink(arquivo), que faz diversos tratamentos de excessões. Depois na classe FSremove é chamado, tratando mais uma excessão:

SPIFFS com ESP32
SPIFFS com ESP32

Por isso que quanto melhor for a implementação, menos código precisamos escrever. Em contrapartida, quando mais camadas, menos sabemos como as coisas funcionam. Olhe a implementação de mais baixo nível do remove:

SPIFFS com ESP32
SPIFFS com ESP32

Primeiro é verificado se o sistema de arquivos está “montado”, depois o path, depois se o arquivo ou diretório existe, depois tem uma alocação de memória que também tem tratamento de excessão, daí só então é feito o unlink. Bem mais simples fazer utilizando a API para a IDE do Arduino, hum?

Com essas 3 funções já consegui explicar tudo o que gostaria e seria o suficiente para um teste inicial. Agora vou colocar o código completo abaixo para você ver as demais funções e suas chamadas.

Comprar o ESP32

E continuo seguindo com minha recomendação de comprar na CurtoCircuito. Tenho certeza de que se tornará um hábito comprar com eles a partir da próxima leva de produtos que está por vir.

Agora pretendo escrever alguns artigos práticos antes de irmos para os próximos recursos do ESP32 e do FreeRTOS. Espero que esteja gostando da série!

Inscreva-se no nosso newsletter, alí em cima à direita e receba novos posts por email.

Siga-nos no Do bit Ao Byte no Facebook.

Prefere twitter? @DobitAoByte.

Inscreva-se no nosso canal Do bit Ao Byte Brasil no YouTube.

Nossos grupos:

Arduino BR – https://www.facebook.com/groups/microcontroladorarduinobr/
Raspberry Pi BR – https://www.facebook.com/groups/raspberrybr/
Orange Pi BR – https://www.facebook.com/groups/OrangePiBR/
Odroid BR – https://www.facebook.com/groups/odroidBR/
Sistemas Embarcados BR – https://www.facebook.com/groups/SistemasEmbarcadosBR/
MIPS BR – https://www.facebook.com/groups/MIPSBR/
Do Bit ao Byte – https://www.facebook.com/groups/dobitaobyte/

Próximo post a caminho!