quinta-feira, 20 de outubro de 2016

Fazendo um servidor de arquivos no NodeMCU/ESP8266 usando a memória flash do próprio ESP-12E e mais

Boa noite turminha! Essa é uma postagem dedicada a ensinar como fazer um servidor de arquivos usando o ESP8266/NodeMCU e similares. A maioria de vocês já deve ter rodado o exemplo que chama SDWebServer ou coisa do tipo. No caso, o ESP8266 envia arquivos armazenados dentro de um cartão SD... mas você sabia que também pode armazenar arquivos dentro do chip de memória que vem soldado junto com o ESP8266?

Se você já fuçou por aí, deve ter reparado que o ESP8266 normalmente vem em um módulo com dois CI's soldados. Um deles é o próprio ESP8266, e o outro é uma memória flash de um fabricante qualquer, com uma quantidade de memória qualquer. Existem duas maneiras de descobrir o chip de memória do seu ESP8266: uma delas é arrancando aquela capinha de metal, e a outra é rodando um software que te permite identificar o fabricante da memória flash e o tamanho dela. Agora de cabeça não lembro o nome de nenhum software do tipo, mas nada que uma busca no google não seja capaz de resolver.

De qualquer forma, os módulos ESP8266 costumam ser padronizados. Os ESP12e tem todos a mesma quantidade de memória flash (32 megabit ou 4 megabytes), e como esse é o módulo presente no NodeMCU, naturalmente ele terá 4 megabytes de memória. Se você prestar atenção, vai perceber que existe uma opção na IDE Arduino que te permite escolher o tamanho da memória flash: a opção padrão é 4M, 1M + 3M SPIFFS. Isso significa que o seu código pode ocupar 1 megabyte, e além desse 1 megabyte você pode armazenar 3 megabytes de arquivos e configurações na memória flash, usando o sistema de arquivos SPIFFS.


SPIFFS (SPI Flash File System) nada mais é do que uma forma de escrever e ler arquivos dentro da memória flash do módulo ESP de uma forma parecida com aquela usada para ler e escrever arquivos em um cartão SD. Quando você usa o firmware NodeMCU e envia arquivos .lua, é esse o sistema de arquivos que está funcionando por trás das cortinas.

Pra você usar esse sistema de arquivos quando programa o ESP usando a IDE Arduino (ou a Platformio, que é muito melhor), basta incluir a biblioteca FS.h e adicionar o define FS_NO_GLOBALS para evitar que o nome da classe File na biblioteca SD.h entre em conflito com a classe File que existe na biblioteca FS.h na hora de compilar. Os métodos da classe são praticamente os mesmos.

Enviar arquivos para dentro da memória flash do ESP é fácil: primeiro você cria uma pasta "data" junto com o seu sketch, e em seguida você

Se estiver usando a IDE Arduino: usa a ferramenta ESP8266FS, que é um plugin para a IDE arduino que pode ser baixada no seguinte link :https://github.com/esp8266/Arduino/blob/master/doc/filesystem.md#uploading-files-to-file-system

Se estiver usando a Platformio: aperta F7 e clica nessa opção:


Os arquivos que estiverem dentro da pasta data serão transformados em uma imagem .bin e colocados em endereço na memória flash depois do trecho ocupado pelo próprio programa, de tal forma que se você editar qualquer um desses arquivos e fizer o upload deles, você não precisará fazer upload do programa novamente. Que maravilha, não é mesmo?

Depois que os arquivos foram enviados, você pode lê-los da seguinte forma:

    fs::File arquivo=SPIFFS.open(nome,"r");
    servidor.setContentLength(CONTENT_LENGTH_UNKNOWN);
    servidor.streamFile(arquivo,"text/html");
    arquivo.close();

Fácil, não é? Agora vem o plot twist: vou colocar aqui um exemplo de código que mostra um webserver com SPIFFS e de brinde uma forma de enviar  parâmetros com o método POST e lê-los com JQuery. OBS: para este exemplo, você precisará de três LEDs de cores diferentes. Um no pino D1, um no D2 e um no D3, cada um tem um significado que é explicado nos comentários.


Código fonte do servidor:


Código fonte do arquivo "index.htm", que deverá estar dentro da pasta /data e introduzido na memória flash do ESP


Código fonte do arquivo "setup.htm"


O resultado deve ser alguma coisa assim:




E, em ação...

Um vídeo publicado por Ruy Jorje (@ruyjorje) em


Naturalmente é um exemplo extremamente simples, mas ele pode ser aprimorado. Por exemplo: ao invés de buscar o arquivo .js do JQuery a partir de um servidor do google, você pode colocá-lo na memória do próprio ESP8266. Com um script mais refinado você pode ter um botão que envie um formulário com um único parâmetro (ex: arcondicionado=on, ventilador=off, solenoide=on, etc etc etc) sem precisar recarregar a página inteira. As possibilidades não são infinitas, mas dá pra fazer muita coisa legal.

E por hoje é só!

Nenhum comentário:

Postar um comentário