{Resolvido] Duvida - Armazenar Variáveis na memoria esp8266 em caso de reinicio - IDE Arduino

Bom dia, estou a alguns meses quebrando a cabeça nesse problema,

Estou trabalhando num projetinho de Webserver para ESP8266 onde é utilizado um temporizador com NTP programável para acionar um rele, esta quase pronto, bem leve e rápido, mas me falta a parte de armazenar as variáveis de tempo e o status da GPIO, fiquei empacado nessa parte.

O código que estou disponibilizando esta disponível nesse link

https://github.com/jhon2c/WifiRTC/blob/master/C%C3%B3digo/firmware/...

As variáveis que preciso armazenar em caso de falta de energia ou reinicio da placa por enquanto são:

21 int horaLiga;
22 int minutoLiga;
23 int horaDesl;
24 int minutoDesl;

33 boolean stateRelay;

Qual a melhor forma de armazenar estas variáveis, seria EEPROM ou SPIFFS?

Abaixo como esta ficando a pagina do WebServer

desde de já agradeço

Exibições: 5574

Responder esta

Respostas a este tópico

Olá, 

Tente usar a biblioteca EEPROM, para armazenar poucos dados ela serve. 

Aqui um conceito bem claro https://gist.github.com/dogrocker/f998dde4dbac923c47c1

Abs.

CK

CK bom dia,

Obrigado pela dica, vou dar uma estudada para ver se consigo adaptar esse código.

Pelo que já li a respeito do ESP8266 ele não possui EEPROM interna como o Atmega328.

Me corrijam se eu estiver errado. Acho que a biblioteca que o amigo Carlos enviou, possa ser para armazenar dados em uma EEPROM externa (outro chip). 

Mas sei que na memória Flash do ESP8266 tem espaço reservado para o usuário.

E o espaço é bem grande! Não sei ainda como usar esse pedaço de memória não volátil. 

User parameter area:store user parameters in application, in IOT_Demo, it is the 16KBytes
starting from 0x3C000 , users can RW this area.

 

Manual = ESP8266 Flash RW Operation

https://espressif.com/sites/default/files/documentation/99a-sdk-esp...

Manual = ESP8266 SDK Getting Started Guide

https://espressif.com/sites/default/files/documentation/2a-esp8266-...

Todos os manuais:

https://espressif.com/en/products/hardware/esp8266ex/resources

Olá amigo J. Gustavo,

você tem razão neste sentido, mas aqui um esclarecedor documento do colega Pedro Minatel para ajudar, acho que isso vai esclarecer melhor o tópico, mas você tem razão EEPROM realmente não tem, mas tem artifícios. Eu pessoalmente emulo esta "EEPROM" nas minhas aplicações IoT usando MQTT.

Link: http://pedrominatel.com.br/pt/esp8266/utilizando-eeprom-do-esp8266/

Abraços!

CK.

Ah bom !
" 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)."

Corrigindo o Pedro Minatel sobre memórias Flash :

More than 100,000 erase/program cycles

http://www.winbond.com/hq/product/code-storage-flash-memory/serial-...

pois é o Esp tem uma gambiarra de EEPROM emulada, mas não estava muito animado com a historia dos 10.000 ciclos, mas com essa informação ja melhora um pouco.

CK , muito interessante.

Eu estudei postagem do Pedro, mas não entendi a parte dos endereços, por exemplo eu tenho 5 variáveis, como faço para endereça-las usando esse exemplo? funcionaria com strings?

TA,

Sim vai poder usar string, para endereçar o melhor a fazer é estudar o conceito, e aplicar, leia este tópico de 2015

 http://labdegaragem.com/forum/topics/salvar-datas-no-eeprom-do-ardu...

E este legado do colega Wiechert:

http://labdegaragem.com/profiles/blog/show?id=6223006%3ABlogPost%3A...

Abs.

CK

CK muito instrutivos os materiais, acho que entendi um pouco mais sobre o tema, o material do Wiechert foi bem esclarecedor.

Tiago, boa noite!

Com as funções disponibilizadas na biblioteca padrão, você só consegue armazenar bytes (0 a 255) . Para gravar Strings você vai ter que usar um artifício.

http://playground.arduino.cc/Code/EepromUtil

Mas no seu caso você quer armazenar somente os horários, correto? 

Então as funções padrão já são suficientes.

O que você tem que fazer criar uma variável com endereço inicial da memória e incrementando o endereço cada vez que vai gravar.

Exemplo:

int addr = 0; //endereço inicial
byte var1 = 10;
byte var 2 = 5;
EEPROM.write(addr++, var1); //Grava variável var1 e incrementa o endereço
EEPROM.write(addr, var2); //Grava variável var2

Para ler vai ser a mesma coisa.

Mas o programador tem que saber que var1 está no endereço 0, var2 no 1 e assim por diante.

Para facilitar, você pode definir os nomes das variáveis de endereço com nomes que indiquem o valor que estão armazenando

Se quiser, informe as variáveis que quer armazenar que poderemos ajudar melhor...

Cintra, acho que entendi, modifiquei o meu Sketch, mas ainda não fiz o upload, aparentemente se entendi a logica apresentada por vocês é para estar correta.

por sorte minhas variaveis neste caso são inteiros, e um booleano sendo elas as seguintes:

 int horaLiga;

 int minutoLiga;
 int horaDesl;
 int minutoDesl;

 boolean stateRelay;


Aonde eu fiz inserção do eeprom eu coloquei o comentario //***eeprom***

segue o link do pastebin, se puder dar uma olhada se estruturei corretamente

http://pastebin.com/H5JNJueK

Tiago, parece que está OK.

Somente algumas observações:

- Com a EEPROM emulada do ESP, é necessário reservar a memória antes de usar.
EEPROM.begin(5);
No setup

- Depois de gravar, ou quando não estiver usando o recurso.
faça um END

EEPROM.end();

- Não sei se vai ser necessário converter os valores para byte ante de gravar. Faça um teste. Se for necessário, use CAST para cada write:

EEPROM.write(addr, (byte) horaLiga);

- A parte abaixo não entendi. Acho que pode retirar do código:

//***eeprom***
// avança para o próximo endereço indo até o byte 512 da
// EEPROM, quando então retorna para o byte 0.
addr = addr + 1;
if (addr == 512)
addr = 0;

}

Depois nos fale se deu certo!

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço