29 de junho de 2014

MemoryLib.h EEPROM

Vamos falar um pouco sobre a memória EEPROM.
Essa biblioteca vai ajudar!


Quando desenvolvemos um projeto com o Arduino nosso de cada dia, muitas vezes precisamos manter os valores de algumas variáveis, de forma que seja possível desligar o circuito sem a perda da mesma.
Um circuito de um relógio, por exemplo, para ter a função alarme/despertador, temos que guardar o horário em memória.
A biblioteca que já conhecemos e utilizamos para acessar a memória, nos permite escrever em cada endereço apenas 1 byte (valores de 0 a 255).

Mas se precisarmos armazenar um valor lido por um sensor conectado na porta analógica, que nos retorna valores de 0 a 1024?
E se entre as infinitas possibilidades, precisarmos armazenar um valor compreendido entre 0 a 999999999?

Para esses casos já começamos a ter um certo trabalho. Foi pensando nisso que resolvi desenvolver essa biblioteca que faz esse gerenciamento da memória EEPROM e facilita a minha vida!

E só incluir a MemoryLib.h no projeto e vida nova!

Agora pode-se armazenar variáveis do tipo int e também do tipo long. Sem dor de cabeça.

A sintaxe para escrever na memória é:
memory.write(endereço, valor);

Para retornar o valor armazenado na memória:
memory.read(endereço);

Para ser mais prático no exemplo, vamos armazenar uma varíavel do tipo int no endereço 5 da EEPROM, e em seguida ler o valor gravado.
int valor = 32767;
memory.write(5, valor);

int valorLido = memory.read(5);

E se a variável fosse do tipo long, como seria? A mesma coisa!
long valor = 2147483647;
memory.write(5, valor);

long valorLido = memory.read(5);


Ficou fácil utilizar a EEPROM agora!

Senhoras e senhores, venho por meio deste compartilhar essa íncrivel biblioteca com vocês.

Biblioteca disponível em:
https://github.com/fellipecouto/MemoryLib.h

A instalação pode ser realizada através do gerenciador de bibliotecas da IDE Arduino:

Junto com a biblioteca tem os exemplos de uso para não ter dúvidas.

É isso! Espero que seja útil!

23 comentários:

  1. Biblioteca muito boa, obrigado por compartilhar!

    ResponderExcluir
  2. Este comentário foi removido pelo autor.

    ResponderExcluir
  3. Esta biblioteca é fantástica! Facilita em muito o trabalho. Parabéns.

    ResponderExcluir
  4. Somente uma pergunta, tenho 36 variáveis do tipo INT que serão gravadas na eeprom, assim como uma do tipo LONG. Tem como configurar para trabalhar com dois tamanhos de variáveis? Obrigado

    ResponderExcluir
    Respostas
    1. Boa noite! Vc pode deixar configurado como LONG, assim funciona tanto para INT e LONG. Abraços!

      Excluir
  5. Boa tarde Felipe... Vc tem algum exemplo da utilização dessa biblioteca em alguma rotina, pois para mim está dando o seguinte erro " error 'memory' was not declared in this scope ", pode-me ajudar a identificar o sucedido, adicionei a biblioteca. Desde já o meu obrigado. Abraços.

    ResponderExcluir
    Respostas
    1. Boa noite! No arquivo disponibilizado para download, junto com a biblioteca, tem exemplos. O erro parece ser por estar faltando instanciar a biblioteca no inicio do código.

      //Inicia a biblioteca passando como parametros a capacidade da EEPROM em KB e o tipo de variavel
      MemoryLib memory(1, 1); //memory(sizeMemory, typeVar) : sizeMemory = KB / typeVar = 1=int | 2=long

      Verifica se é isso mesmo. Abraços!

      Excluir
  6. Muito obrigado por compartilhar seu trabalho!!!
    Seus projetos e suas bibliotecas são fantásticas!!!
    Seu site é uma fonte de inspiração para quem esta começando e
    para os avançados.

    ResponderExcluir
  7. Bom dia Felipe Couto... Antes de mais parabéns pelo trabalho, a biblioteca foi uma preciosa ajuda.. Tenho a seguinte duvida; posso escrever exemplo no endereço de memoria 0 o valor 2147483647 e no endereço 1 o valor 1546632999

    long valor = 2147483647;
    memory.write(0, valor);

    long valor1 = 1546632999;
    memory.write(1, valor1);

    Quando efetuar a leitura de cada um desses endereços, vou ter o nr. tal e qual como gravado?

    Aguardo,

    Abraço

    ResponderExcluir
  8. Bom dia Filipe Couto...Já utilizo à algum tempo sua biblioteca, muito funcional e facilitou muito minha vida..., acontece que recentemente verifiquei o seguinte erro ao utilizar a variável LONG.

    Quando é escrito em memoria os seguintes valores;

    100 - Grava 10
    101 - Grava 11
    201 - Grava 21
    210 - Grava 21
    10000 - Grava 100

    Estes são alguns exemplos do que está acontecendo, quando se grava ou quando é feita a leitura, não consegui entender em que momento acontece.

    Minha pergunta, é de fácil correção?

    Seria possível dar uma olhada? E disponibilizar a correção para download.

    Muito obrigado,
    Abraço,

    Manuel Henriques
    mejhenriques@gmail.com
    Claro / WhatsApp (11) 98648 2242

    ResponderExcluir
    Respostas
    1. Oi Manuel! Boa tarde!
      Agradeço o seu contato! Realmente quando é variavel Long está apresentando esse problema. Vou verificar e efetuar a correção.
      Abraços!

      Excluir
    2. Bom dia!
      Após muito tempo, consegui parar e dar uma olhada no erro. Ajustado!
      Links para download no post atualizados.

      https://www.4shared.com/rar/ovITpRiuca/MemoryLib.html

      Abraços!

      Excluir
  9. Olá Felipe Couto, achei a sua biblioteca incrível, muito prática e simples de ser utilizada.

    Porém está acontecendo o mesmo que o colega mencionou anteriormente, eu gravo o dado long 1000 e quando vou ler me dá 10.

    Você já efetuou essa correção? Se sim o que devo fazer para funcionar perfeitamente?

    Obrigado

    ResponderExcluir
    Respostas
    1. Bom dia!
      Após muito tempo, consegui parar e dar uma olhada no erro. Ajustado!
      Links para download no post atualizados.

      https://www.4shared.com/rar/ovITpRiuca/MemoryLib.html

      Abraços!

      Excluir
  10. Boa tarde Fellipe!
    tem que desenvolver um projeto que trabalha com teclas para acionar reles com 74hc595 são 30 teclas para acionar as saidas temporizadas tipo ligo n*5 dispara o rele 5 e depois de 20 seg dispara 3,4,6, 7
    vc pode me ajudar?
    obrigado.

    ResponderExcluir
    Respostas
    1. Paulo, bom dia!
      Pelo pouco que entendi, não parece ser muito complicado. Já tem algo pronto?
      As saídas temporizadas pode-se usar o Delay, ou o exemplo de Delay que tem na própria IDE do Arduino chamada BlinkWithoutDelay.
      Abraços!

      Excluir
  11. como eu pesquisaria na EEPROM se por exemplo o valor 324567898 está gravado nela?

    ResponderExcluir
    Respostas
    1. Bom dia!
      Para retornar um valor onde sabe qual o endereço está (Ex.: Endereço 20):
      memory.read(20);

      Para localizar um valor, não sabendo em qual endereço está armazenado, teria que efetuar um loop, passando por cada endereço verificando os valores armazenados.

      Abraços!

      Excluir
  12. Essa estrutura irá funcionar no caso de uma memória eeprom externa. Apenas trocando o endereçamento ela já faria toda a gestão?

    ResponderExcluir
    Respostas
    1. Oi Thiago! Esse teste em memória externa não realizei e não sei te informar no momento. Mas todo o desenvolvimento não foi considerando eeprom externa.

      Excluir