Manual

do

Maker

.

com

Como salvar arquivos no ESP8266

Como salvar arquivos no ESP8266

Atualmente o sistema de arquivos do ESP8266 / ESP32 é LittleFS. Porém, a sintaxe é exatamente a mesma, bastando trocar spiffs por littlefs.

Muita gente não sabe, mas você pode salvar arquivos dentro do ESP8266, como se fosse  um computador comum, graças ao sistema de arquivos SPIFFS. Mas para isso, a imagem dentro dele deve ter esse suporte. Logo, recomendo que instale um RTOS próprio para o ESP8266 e para variar, você tem opções de escolha. Quer programar em C, LUA ou em Python? Então vamos ver como salvar arquivos no  ESP8266.

Se você optar por NodeMCU, esse último artigo supracitado exemplifica a escrita de arquivos no sistema de arquivos e também tem dicas preciosas em relação à hierarquia de execução dos scripts instalados. Se não, siga a leitura.

Após ter sua imagem instalada no ESP8266, você poderá subir apenas arquivos para o filesystem invés de ter que compilar todo o firmware. Uma outra vantagem em utilizar o sistema de arquivos é que você pode ter arquivos de inicialização ou parametrização da sua aplicação. Enfim, o espaço livre deve ficar em torno de 1.5M, portanto não há razão para não utilizá-lo.

Dando suporte ao upload através da IDE do Arduino

Para que o upload de arquivos para o ESP8266 se torne transparente, você precisa previamente adicionar o suporte à IDE do Arduino. Para isso, faça download deste arquivo ou preferencialmente abra a página do git nesse endereço e veja qual a última versão disponível. O arquivo deve ser extraido e o diretório ESP8266 deve ser copiado para dentro do diretório "Tools" da IDE do Arduino. Os caminhos de diretórios são diferentes em Windows e Linux mas não importa, vá até o diretório do Arduino  e deixe lá uma cópia do conteúdo. Exemplo com Linux na IDE de versão 1.6.13:

unzip ESP8266*
cp -r ESP8266FS/ ~/arduino-1.6.13/tools/

Agora pode abrir o Arduino e lá você verá essa opção em "Tools".

Criar um arquivo no arquivo de sistemas através de sua aplicação

Se vocẽ quiser criar arquivos através de sua aplicação, agora está fácil, basta subir um sketch mais ou menos assim:

#include"FS.h"

void setup(){
    Serial.begin(115200);
  
    bool ready = SPIFFS.begin();
    if (!ready){
        Serial.println("Suporte ao fs falhou!");
        exit(0);
    }
    
    bool createFile = SPIFFS.exists("/teste.txt");

    if (createFile){
        Serial.println("Lendo arquivo...");
        File myFile = SPIFFS.open("/teste.txt", "r");
        if (!myFile){
            Serial.println("Problema ao tentar ler, sorry...");
            exit(0);
        }
        int s = f.size();
        Serial.printf("Size=%d\r\n", s);

        String data = myFile.readString();
        Serial.println(data);

        myFile.close();
    }
    SPIFFS.end()
}


void loop() {
  
}

Salve o sketch, mas não faça nada além disso. Vá ao menu Sketch->Show Sketch Folder e dentro dele crie um diretório chamado "data". Depois adicione os arquivos que deseja e então use sua nova ferramenta Tools->Esp8266 Sketch Data Upload.

Mais informações sobre o SPIFFS

Esse minimalístico sistema de arquivos tem algumas limitações. Por exemplo, ele não suporta criação de diretórios; todos os arquivos ficarão jogados na raiz (em "/"). Outra questão é em relação ao nome de arquivo, que suporta no máximo 31 caracteres. Em outra parte da documentação do sistema de arquivos fala para não usar níveis de diretório complexos, então ao meu entender  "/um/dois/teste.txt" é um nome de arquivo plano, não dois diretórios com um arquivo no último nível. Enfim...

É fundamental que antes de fazer o upload, você tenha selecionado a board que recebe os arquivos. Isto é, se estiver selecionado Arduino UNO nas boards, não funcionará o upload.

Desmonte o sistema de arquivos antes de fazer upload via OTA

É fundamental que você finalize o sistema de arquivos antes de fazer upload via OTA. Para isso, basta chamar o comando:

SPIFFS.end()

Ele foi exemplificado no código mais acima.

Enquanto estiver em uso, não  há problema em deixá-lo montado.

Formatar o sistema de arquivos

Interessante ou não? Eu acho muito interessante. Não sei se há degradação do sistema de arquivos do ESP8266, mas caso haja, você tem a opção de formatar o sistema de arquivos sem ter que reescrever um novo firmware.

bool formatIsOk = SPIFFS.format()

Retorna true para uma formatação bem sucedida.

open

Você pode abrir o arquivo diretamente com o comando SPIFFS:

SPIFFS.open(path, mode)

O "path" obviamente é o caminho absoluto para o arquivo e o "mode" pode ser  "r", "w", "a", "r+", "w+", "a+". Invés da tradicional combinação "rw", para ler e escrever você utilizará "r+". Se utilizar "w+" ele cria o arquivo caso não exista ou de outro modo, o trunca. O "a" é append, adicionando qualquer novo conteúdo ao final do arquivo e "a+" abre para leitura e adição, escrevendo ao final do arquivo.

Um exemplo está no código disposto lá em cima.

exists

Retorna true se o arquivo existe no caminho absoluto.

openDir

Bizarro falar isso, mas está na documentação. Esse comando abre um diretório dado no caminho absoluto (parâmetro da função). O retorno é um objeto Dir (lembra que logo acima escrevi que o fs não suporta diretório? Pois é).

remove

Usado para remover um arquivo do sistema de arquivos. Retorna true em caso de sucesso.

info

Retorna uma estrutura com informações sobre o sistema de arquivos.

FSInfo fs_info;
SPIFFS.info(fs_info);

A estrutura é essa:

struct FSInfo {
    size_t totalBytes;
    size_t usedBytes;
    size_t blockSize;
    size_t pageSize;
    size_t maxOpenFiles;
    size_t maxPathLength;
};

Essa estrutura pode ser preenchida usando o método FS::info. Seus valores:

  • totalBytes - tamanho total de área de dados usável no sistema de arquivos
  • usedBytes - número de bytes utilizados pelos arquivos
  • blockSize - tamanho de blocos do SPIFFS
  • pageSize - tamanho lógico do page size
  • maxOpenFiles - número máximo de arquivos que podem ser abertos simultaneamente
  • maxPathlength - tamanho máximo do nome de arquivo (incluindo o terminador nulo)

Objeto Dir

Esse objeto serve para iterar sobre os arquivos existentes em um diretório. Existem 3 métodos oferecidos:

next()

filename()

openFile()

O código de exemplo da documentação mostra como ele deve ser usado:

Dir dir = SPIFFS.openDir("/data");
while (dir.next()) {
    Serial.print(dir.fileName());
    File f = dir.openFile("r");
    Serial.println(f.size());
}

O método next() retorna true enquanto houver arquivos dentro de um diretório para iterar. Ele sempre deve ser chamado antes de fileName e openFile. O método openFile tem a mesma função de SPIFFS.open.

seek

É meio incrível, mas o SPIFFS inclui um tratamento de arquivo como o do C, com seek. Dependendo do valor em "mode", ele move o cursor para a respectiva posição no arquivo:

  • SeekSet - posição inicial configurada para "offset" (primeiro parâmetro) bytes a contar do início do arquivo.
  • SeekCur - posição corrente é movida para mais "offset" bytes.
  • SeekEnd - A posição é ajustada para "offset" bytes do fim do arquivo.

O retorno é true para sucesso em qualquer um dos casos.

position

utilizado para retornar a posição atual dentro do arquivo, em bytes.

size

Retorna o tamanho do arquivo em bytes.

name

Retorna o nome do arquivos como const char*. Você pode recebê-lo em uma variável do tipo String, sem problemas.

String name = file.name();

close

Fecha o arquivo.

Inscreva-se no nosso canal Manual do Maker no YouTube.

Também estamos no Instagram.

Nome do Autor

Djames Suhanko

Autor do blog "Do bit Ao Byte / Manual do Maker".

Viciado em embarcados desde 2006.
LinuxUser 158.760, desde 1997.