{Resolvido} Duvida - Armazenagem EEPROM ESP8266, armazenar valores com 4 digitos

Boa noite garagistas,

Estou com uma duvida no meu projeto de alimentador de aquário com uma Wemos D1 mini,

eu preciso armazenar um valor de até 1000 na eeprom, mas não consigo salvar valores maiores que 232 por algum motivo que desconheço, são apenas 6 variáveis, as que eu estou tendo problemas são as " int tempoD1; int tempoD2; int tempoD3;"

O código do projétinho esta disponível na minha pasta do github

https://github.com/tbagro/Arra-oadorWemosD1min

as variáveis estão no arquivo server.h e as funções da eeprom em eeprom.h.

Eu tentei também armazenar valores até 100 e depois converter com uma multiplicação, mas o negocio não faz a multiplicação nem com reza rsrs. estava tentando varias variações dessa funçãozinha aqui, mas nenhuma funcionou.

int multiplicar(int num, int mult) {     return num * mult; } 

Se alguém puder me dar uma luz, eu agradeceria muito, faz mais de uma semana que estou tentando resolver esse problema.

Obs.: Esse tópico seria um complemento a este que aqui aberto por mim

http://labdegaragem.com/forum/topics/duvida-armazenar-vari-veis-na-...

para o ESP, o melhor método é salvar na memoria flash, abaixo alguns exemplos

https://www.filipeflop.com/blog/esp8266-gravando-dados-memoria-flash/

https://github.com/tbagro/Esp8266Webserver-CSS

https://www.youtube.com/watch?v=Yeq0gI88IrM&list=PLMmiQibT0iTZU...

Exibições: 2950

Responder esta

Respostas a este tópico

Amigo você esta gravando um Byte !!  Byte varia de 0 a 255

EEPROM.write(addr3, (byte) tempoD1);

Tiago, boa noite!

Realmente, o Gustavo tem razão:

No arquivo server.h

Você deve mudar o código de:

EEPROM.write(addr3, (byte) tempoD1);

Para:

EEPROM.write(addr3, tempoD1);

O prefixo (byte) chama-se operação de CAST e é usado quando você quer fazer conversões entre os tipos de dados.

No seu caso, estava convertendo de int para byte, o que causava o problema.

Faça isso para as demais variáveis int também.

Cintra, obrigado pela sugestão, fiz o sugerido, fiquei até animado com a simplicidade, mas não deu certo infelizmente, ele continua alterando o valor, eu setei um valor de 1000 e ele continuou a armazenar 232, para teste eu deixei 266 e armazenou apenas 6.

Realmente, a EEPROM somente suporta valores de 8 bits.

Encontrei essa função que permite gravar e ler números long:

https://playground.arduino.cc/Code/EEPROMReadWriteLong

Veja se ajuda

Grande Murta,

Faz sentido isso, não tinha me atentado nesse ponto rsrsrs.

mas ai que entra a minha duvida, eu teria duas alternativas, ou aumento o arquivo, ou faço uma função para multiplicar o valor.

Imagino que o mais interessante seria uma função de multiplicação do valor, e não consegui fazer nenhuma função que funcione com o array.

Murta, agora que você me apontou o problema eu encontrei uma solução, eu só não  entendi ainda como usar no meu caso;

mas a intenção seria usar mais de um byte para valores maiores que 255, pelo que entendi essa função abaixo facilitaria a gestão das variáveis inseridas na eeprom.

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

Bom dia TA,

vamos por partes (Método Jack).

As  6 variáveis que você quer gravar na EEPROM são do tipo  " int ", ou seja, cada uma ocupa 2 bytes de espaço.

Ao usar a biblioteca EEPROM.h para gravar na EEPROM,  com a função EEPROM.write(),

você teria que separa-las em 2 partes e gravar uma em cada endereço e depois usando a função EEPROM.read(), ler os dados e "remontar " a variável.

Mas esta mesma biblioteca tem as funções EEPROM.put(address, data) ,  EEPROM.get(address, data) e

EEPROM.update(address, value),  que fazem todo o trabalho braçal pra gente.

A unica preocupação que temos que ter é a sequencia de endereços.

A função EEPROM.update(address, value) só grava na EEPROM, se os valores foram diferentes dos que lá estão,

e com isto "economiza" ciclos de gravação da EEPROM.

Exemplo para o seu caso no arquivo anexo.

Rui

Anexos

RV, obrigado pela resposta, fiquei fascinado com a simplicidade da proposta, vou testar imediatamente.

Não havia visto essa opção EEPROM.update, e olha que dei uma aprofundada no assunto depois que o murta me chamou a atenção no meu erro.

Só fiquei com uma duvida, e para ler os dados nesse caso como ficaria?

Oi TA,
para ler os dados use a função EEPROM.get(),
assim:

  int eeAddress = 9; // define endere�o inical
  EEPROM.get(eeAddress , tempoD1) // le a EEPROM se e joga na variavel tempoD1
  eeAddress += sizeof(int); // Incrementa o endere�o com valor do tamanho da variavel gravada (int).
  ....
  .....
  ......

Rui

Bom dia Tiago, 

Veja que todas as variáveis para gravar e ler a eeprom estão configuradas como BYTE:

EEPROM.write(addr, (byte) a1);
EEPROM.write(addr1, (byte) a2);
EEPROM.write(addr2, (byte) a3);
EEPROM.write(addr3, (byte) tempoD1);
EEPROM.write(addr4, (byte) tempoD2);
EEPROM.write(addr5, (byte) tempoD3);

Terá que mudar todas as variáveis. Ainda não sei como. 

Me parece que esta usando a IDE do Arduino para programar o ESP8266, não é isso ? 

Então recomendo que estude o GitHub sobre a IDE adaptada para o ESP8266 :

https://github.com/esp8266/Arduino

Biblioteca EEPROM :

https://github.com/esp8266/Arduino/tree/4897e0006b5b0123a2fa31f67b1...

Nem todos os códigos  do Arduino foram adaptados  para o ESP8266 ainda. 

Boa noite TA.
Testei este sketch que estou anexando e funcionou corretamente.

Rui

Anexos

Esse Ranzinza é véio mas é F--A !  KKKK

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço