Webserver log no ESP8266 com SPIFFS

As vezes queremos acompanhar algumas informações dos nossos projetos, seja para debug, ou mesmo para saber tudo o que está acontecendo quando não estamos com o terminal serial aberto. Isso fica muito complicado quando o ESP fica longe do computador, sem acesso ao terminal.

Uma das formas de contornar esse problema, é criar um sistema de log em arquivo, utilizando o SPIFFS (SPI Flash File System). Esse sistema de log em arquivo, poderá guardar tudo o que acontece no ESP e deixar disponível para consulta a qualquer momento, por meio de um webserver.

SPIFFS

O sistema de arquivos do ESP8266 é o SPIFFS, que foi desenhado para sistemas com memória SPI NOR flash, em dispositivos embarcados. O sistema de arquivos tem como principal meta, usar o mínimo possível de memória RAM.

Uma característica importante para ressaltar é que o SPIFFS não suporta pastas, porém o nome do arquivo pode conter “barra”, como por exemplo “/log/arquivo.txt” e subentende-se que o arquivo está dentro da pasta log, por convenção.

Alocação na memória do ESP

O sistema reserva um espaço na memória flash para a criação dos arquivos, que pode variar de acordo com o modelo do módulo ESP que está em uso. Essa alocação pode variar de 64kB até 3MB, sendo configurável em alguns modelos, como mostra a tabela abaixo.

Board Flash chip size, bytes File system size, bytes
Generic module 512k 64k, 128k
Generic module 1M 64k, 128k, 256k, 512k
Generic module 2M 1M
Generic module 4M 3M
Adafruit HUZZAH 4M 1M, 3M
ESPresso Lite 1.0 4M 1M, 3M
ESPresso Lite 2.0 4M 1M, 3M
NodeMCU 0.9 4M 1M, 3M
NodeMCU 1.0 4M 1M, 3M
Olimex MOD-WIFI-ESP8266(-DEV) 2M 1M
SparkFun Thing 512k 64k
SweetPea ESP-210 4M 1M, 3M
WeMos D1 & D1 mini 4M 1M, 3M
ESPDuino 4M 1M, 3M

 

A biblioteca SPIFFS já é nativa do ambiente Arduino para o ESP8266. Para utilizar o sistema de arquivo, basta incluir a seguinte biblioteca no seu projeto.

Funções principais da biblioteca

A biblioteca segue o padrão POSIX, com as funções de manipulação de arquivos já conhecidas, tais como:

  • open
  • close
  • read
  • write
  • seek
  • stat

Inicia o sistema de arquivo, equivalente ao mount no Linux:

Fecha o sistema de arquivo, equivalente ao unmount:

Apaga todos os arquivos na região de memória reservada:

Abre o arquivo no modo de selecionado:

Verifica a existência do arquivo:

Remove um arquivo:

Renomeia um arquivo:

Para a referência completa, acesse o manual da biblioteca no github do projeto ESP8266 Arduino.

WebServer

Para esse projeto, vamos criar um exemplo de como utilizar o sistema de arquivos SPIFFS, fazendo um sistema de armazenamento de log em arquivo, podendo ser consultado por meio de um webserver.

Código fonte

Abaixo segue o código fonte da solução, que trabalha com a criação de um log e a disponibilização dos dados por meio de um webserver.

Para limpar o log, utilize a função formatFS().

Esse projeto pode ser customizado para incluir outros logs ou fazer que o ESP atue em modo AP, facilitando a coleta de dados em ambientes sem WiFi.

Para visualizar os logs, basta acessar o endereço IP do ESP.

Conclusão

Quando um projeto está em teste, é muito importante saber tudo o que aconteceu, mesmo quando não estamos olhando o tempo todo para ele. Esse sistema facilita essa atividade de monitoramento remoto, podendo deixar o projeto por vários dias sem se preocupar com o que está acontecendo, facilitando muito a análise de problemas ou comportamentos inesperados, mesmo de forma off-line.

 

Happy Hacking!

13 Comments

  1. Mauricio Ortega

    Parabéns!
    Sempre trazendo alguma dica útil para nosso dia a dia!
    Abs.
    Mauricio Ortega

    Reply
    1. Pedro Minatel (Post author)

      Muito obrigado Mauricio!!!!!

      Valeu!!!!

      Reply
  2. Uigor Silva Fonseca

    Cara, você é demais!
    parabéns teu trabalho tem sido uma fonte de estudos muito útil!

    Reply
  3. Uigor Silva Fonseca

    parabéns seu trabalho tem me ajudado bastante, minha maior referencia de estudos do ramo de IOT. tenho tido uma duvida, estou bolando um sistema que possui um esp8266, leitor de Rfid e uma solenoide, quero que a porta do meu quarto abra com tags especificas, porém eu quero monitor os horarios que a solenoide é ativada, você recomenda esse esquema com spiffs? ou teria outra solução para esse caso?

    Reply
    1. Pedro Minatel (Post author)

      Com o spiffs vc pode gerar um log de tudo, mesmo offline. Eu faria assim!

      Reply
  4. Bruno Aguiar

    Boa tarde Pedro,

    Estive utilizando a sua ideia apresentada nesse post, e funcionou muito bem, porém quando o meu arquivo de log fica muito grande, estou enfrentando problemas com o ESP, o mesmo para de emitir a página HTML, creio que estou tendo algum problema de memória. Você teria alguma sugestão de como eu poderia mostrar na página um log com muita informação sem estourar a memória, obrigado.

    Reply
  5. Sergio Freitas

    Se desligar o ESP e ligar de novo ele persiste esse log?

    Reply
    1. Pedro Minatel (Post author)

      Sim

      Reply
  6. ft7

    como posso ler uma linha específica?

    Reply
  7. ft7

    Ou melhor, como poderia deixar uma tag rfid em cada linha e extraí-las uma a uma para testar?
    Obrigado pelo conteúdo!

    Reply
  8. Rafael Almeida

    Pedro, tudo bem?
    Eu estou tentando salvar dados no ESP (Ip, gateway, servidor e porta). Eu gostaria de conseguir mudar estes parametros após o loop e ao desligar e ligar da energia os dados fossem salvos. Quando não tem wifi salvo até consigo alterar através do Wifimanager, mas rodando o programa não. Sabe como fazer?

    Reply
  9. ALESSANDRO CARLO MOREIRA

    Muito bom exemplo. Conseguiria criar um botão ou link de modo a fazer o download desse arquivo criado para um notebook através do modo AP ?

    Reply
  10. Alessandro Carlo Moreira

    Show de explicação ! Uma dúvida : conseguiria fazer um botão ou link para download do arquivo texto, no lugar de mostrar o conteudo na tela ?

    Reply

Deixe seu comentário