Utilizando a “EEPROM” do ESP8266

Nada pior do que se esquecer daquela informação importante, que infelizmente não anotamos em nenhum lugar para se lembrar depois. Isso pode acontecer com qualquer um.

Nos sistemas embarcados, temos a grande ajuda das memorias, sejam elas memorias flash, EEPROM, FRAM entre outros tipos de memorias não voláteis, para guardar informações importantes e que não podem ser perdidas.

Memoria do ESP

O ESP8266, não possui memoria não volátil interna, sendo necessário incluí-la externamente no módulo. No caso dos módulos do ESP8266, essa memoria é uma memoria flash que pode variar de 512kB até 4MB, dependendo da versão do modulo e utiliza um barramento QSPI (queued serial peripheral interface).

Abaixo uma tabela mostra os diferentes tamanhos de memoria nos módulos do ESP.

Placa Flash/bytes
Generic module 512k
Generic module 1M
Generic module 2M
Generic module 4M
Adafruit HUZZAH 4M
ESPresso Lite 1.0 4M
ESPresso Lite 2.0 4M
NodeMCU 0.9 4M
NodeMCU 1.0 4M
Olimex MOD-WIFI-ESP8266(-DEV) 2M
SparkFun Thing 512k
SweetPea ESP-210 4M
WeMos D1 & D1 mini 4M
ESPDuino 4M

Dá para utilizar a memoria flash do ESP para o armazenamento de informações do seu sistema, além das informações que já são armazenadas, como o código fonte da aplicação e todos os recursos como bibliotecas. Para armazenar as suas informações na memoria do ESP, existem duas formas:

SPIFSS (SPI Flash File System)

O SPIFFS é um tipo de sistema de arquivo, que possibilita a criação de arquivos e diretórios na memoria flash. Pode ser utilizado para sistema de armazenamento de dados mais complexos, como imagens e bases de dados.

Não vou cobrir o uso de SPIFFS neste artigo, ficará para um artigo especifico para isso.

EEPROM (emulação)

O ESP não tem EEPROM, mas sim uma emulação na memoria flash. Isso significa que a vida útil de escritas na memoria será a mesma da flash, cerca de 10.000 ciclos, e não de uma EEPROM que pode passar de 1 Milhão de ciclos de escrita (no mesmo endereço).

O tamanho desta zona de memoria pode ser de 4 à 4096 bytes (não é possível alocar menos de 4 bytes), o suficiente para a maior parte das aplicações. Caso precise de mais memoria, sugiro utilizar o SPIFFS, que pode chegar a 3MB dependendo do modelo de ESP.

O endereço inicial da EEPROM emulada na flash é o 0x7b000.

Como utilizar

Para utilizar a EEPROM emulada no ambiente do Arduino, devemos incluir a biblioteca EEPROM (#include <EEPROM.h>) na sketch.

O primeiro passo para a utilização é definir o tamanho da memoria a ser utilizada, que poderá ser definida dentro do setup() da seguinte forma:

Onde o tamanho (size) pode ser de 4 a 4096 bytes. Sem esta definição, não será possível utilizar a memoria.

Uma vez definido o tamanho, já podemos ler ou escrever na memoria, como os exemplos abaixo:

Escrita:

Onde o primeiro argumento é o endereço (address) e o segundo o valor (value) que é um unsigned8.

Para salvar as informações, devemos executar o comando:

E para liberar o recurso:

Atenção, o comando EEPROM.end já faz o comando commit, fazendo o uso do EEPROM.commit desnecessário quando utilizando o .end.

Leitura:

A leitura tem apenas um argumento que é o endereço que será lido, o retorno é um unsigned8.

Exemplo

Abaixo segue um exemplo de como fazer um contador de inicialização do ESP, onde a cada boot é feito um incremento na memoria.

Conclusão

Salvar dados da memoria pode ser extremamente útil em diversas aplicações, como salvar o estado das GPIOs, sinalização de alarmes, tempo de uso entre outras informações simples. Já para casos mais complexos, ou que demandam de maior espaço, o uso da EEPROM emulada é mais limitado, o ideal seria o uso de SPIFFS.

 

Happy Hacking!