{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

Cintra, bom dia, fiz as alterações, agora que entendi alguns itens da postagem do Pedro Minatel com essa sua explicação rs, apesar de lá estar bem detalhado.

Essa parte que você não entendeu eu também não tinha entendido, mas acredito que seja para definir o tamanho da EEPROM, mas pelo que entendi o comando EEPROM.begin(5); substitui essa lógica imagino eu.

Depois de fazer o upload, no webserver a hora ficou meio bugada
fincando horaliga 53:51 e horaDesl 52:52, conforme print em anexo

Atualizei o paste bin com o que eu fiz.
http://pastebin.com/H5JNJueK

Anexos

Tiago. Está ficando bom o projeto.

Vamos tentar descobrir porque está vindo esses valores iniciais errados.

1) Primeira tentativa. No Arduino, A EEPROM só grava bytes. No ESP acho que deve ser a mesma coisa. Se gravar int pode comprometer o valor.

Por isso, faça um cast na hora de gravar para todas as variáveis:

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

2) Segunda tentativa. O tamanho inicial reservado acho que é suficiente, pois 5 bytes gravam 5 variáveis. No entanto, por via das dúvidas, mude o tamanho para 256

EEPROM.begin(256);

3) É uma dúvida minha. Na primeira vez que você lê a EEPROM não tem nada gravado lá. O que ele traz? Zeros ou lixo?

Faça um pequeno sketch só pra gravar zeros nos primeiros 256 bytes da memória. Quando ligar o sistema você testa as variáveis para saber se é a primeira vez.

4) Acho que a leitura da EEPROM pode ficar no setup, pois vai ser feita uma única vez quando liga.

5) O END só pode usado se você não vai usar mais a EEPROM naquela seção.

fiz o  teste, com as modificações dos itens 1, 2, 3, 4, e 5 , rodou bem melhor, mas ainda tem uns bugs.

Consegui armazenar  o status da gpio corretamente

quanto ao item 3, ele inicia com lixo na primeira vez, sendo esses valores mesmos horaliga  53:51 e horaDesl 52:52, mas dessa vez os controles funcionaram, e consegui armazenar a hora, mas por algum motivo ele gera um minuto a mais na hora liga.

Acho que ficou assim pq eu havia definido valores iniciais ao horaliga e horaDes próximo a linha 34, dessa vês coloquei tudo zero, mas para testar precisaria limpar a EEPROM.

Atualizei novamente o pastebin com as ultimas modificações http://pastebin.com/H5JNJueK

Tiago, pelo que entendi está tudo funcionando, exceto que está gravando uma minuto a mais na horaliga?
Não sei se é devido à gravação anterior.

Para tirar a dúvida você pode fazer um pequeno programa à parte para zerar a EEPROM ou então incluir uma opção no sistema para zerar:

for (int i = 0, i <= 255; i++) { EEPROM.write(i,0); }

Cintra, estou fazendo a adaptação do código para zerar a EEPROM, mas de fato agora aprendi a usa-la

tenho que fazer alguns ajustes, mas esta funcionando.

Obrigado a todos pela ajuda

Boa tarde, parabéns pelo artigo, esta perfeito e queria aplicar em um cenário sem wifi apenas com cabo, sei que todos estão ocupados sem tempo e como estou começando agora, por isso não tenho bom conhecimento ainda, mais por a caso vcs tem esse .ino para o Arduíno uno com Ethernet shield ou sabe onde posso achar? ou mesmo me ajudar a molificar para uno já procurei algo parecido mais não achei na

net 

Davi, boa tarde.

Nunca usei um Ethernet shield, mas a lógica dele é mais ou menos a mesma do ESP, até onde eu sei a grosso modo vc só precisaria tirar a parte que controla a conexão com a internet do Ethernet shield.

Recomendo que vc abra um novo tópico só para isso, ai vc pode linkar esse tópico como exemplo.

Att

Ok, obrigado pela resposta rápida, farei os testes hoje se não obter sucesso faço o que sugeriu de um novo tópico e posto o que consegui de resultado do uno.

opa  beleza  gostei  do  seu  projeto mas  ta  dando muito  erro . não consigo   gravar   da  erro na  biblioteca 

Eules boa tarde, qual a biblioteca que esta dando erro?

 ESP8266WiFi.h

estranho, essa é nativa da configuração do arduino, recomendo que atualize a versão placa do esp8266 no gerenciador de placas da ide do arduino.

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço