Utilizando a EEPROM interna do Arduino.

Quanto tempo pessoal. Como eu estava querendo postar algo!!! A reforma da casa esta mais lenta que o Rubinho, então vamos vendo outras coisas enquanto isso. Hoje vamos falar um pouco sobre a memória EEPROM (Eletrically Erasable Programmable Read-Only Memory) do Arduino.

Para falar sobre EEPROM , acho legal falarmos antes um pouco sobre memória. O Arduino possui três tipos distintos de memória:

  • Memória Flash (program space) –> é onde nossos sketches são armazenados quando fazemos upload;
  • SRAM (Static Random Acces Memory) –> é onde o Arduino cria e manipula as variáveis que criamos;
  • EEPROM –> Memória não-volátil que podemos usar para criar variáveis que não terão seus valores apagados quando o Arduino for desligado.

Na verdade a memória flash também não é apagada quando desligamos o Arduino, podemos criar variáveis na Flash quando estamos criando o sketch e lê-las durante a execução, mas não podemos alterar seu valor na execução do sketch. A EEPROM permite armazenarmos valores, ler e alterá-los durante a execução do sketch.  Abaixo o tamanho de cada memória:

  • Flash            –> 32K (Mega tem 256K)
  • SRAM          –> 2k   (Mega tem 8K)
  • EEPROM    –> 1K   (Mega tem 4K)

Como podem ver, a EEPROM tem um tamanho relativamente pequeno. Para o projeto de Automação Residência parece ser adequado, pois para armazenarmos o estado de uma lampada precisamos de um único bit, e um byte tem 8 bits. Se não entendeu, com 1 byte podemos armazenar o estado de 8 lampadas, e como temos 1024 bytes de EEPROM no Arduino(1K), podemos armazenar teoricamente o estado de 8192 lampadas. Já para armazenar outros tipos de informação, pode não ser o suficiente, ai teria que fazer contas…

Outra característica da EEPROM é que tanto o acesso ou a escrita de informações é feita byte a byte, ou seja, considerando o tamanho de 1024 bytes, teremos 1024 posições de 1 byte cada. Se quisermos armazenarmos a string “arduinobr.com” nela, teremos que escrever cada caractere em uma posição de memória especifica, e a leitura terá que ser a partir desta posição de memória e pelo número de bytes que compõem a string. Vamos ver no exemplo abaixo.

Finalizando a parte teórica da coisa, cada operação de leitura ou escrita nesta memória demora 3.3 ms para ser concluída, segundo o próprio site do Arduino. Ou seja, é uma memória muito lenta e devemos utilizá-la somente quando estritamente necessário.

Bom, vamos parar de lero lero e mostrar como podemos utilizar a EEPROM do Arduino para armazenar a string “arduinobr.com”.

Código utilizando EEPROM

#include <EEPROM.h>
String texto = "arduinobr.com";
int inicio = 0;
boolean escreve = 0;

void setup(){
 Serial.begin(9600);
 if (escreve) {
 Serial.println("Iniciando escrita na EEPROM!!!");
 for (int x = inicio; x<texto.length(); x++){
 EEPROM.write(x, byte(texto.charAt(x)));
 }
 Serial.println("String escrita na EEPROM!!");
 Serial.print("A string '");
 Serial.print(texto);
 Serial.print("' possui ");
 Serial.print(texto.length());
 Serial.println(" caracteres, ou bytes!");
 Serial.println("");
 } else {
 Serial.println("Apenas leitura da EEPROM");
 Serial.println("");
 }
}

void loop() {
 for (int x = inicio; x< texto.length(); x++) {
 char c = char(EEPROM.read(x));
 Serial.print(c);
 }
 Serial.println("");
 delay(1000);
}

O código é bem simples. Para trabalharmos com a EEPROM devemos inclui-la em nosso sketch com #include <EEPROM.h> e para gravarmos utilizamos EEPROM.write(endereço, valor);. Endereço é a posição da memória onde vamos gravar o valor desejado, e valor é um byte. A classe String é composta pelo tipo char, que é exatamente o valor de um byte, então podemos armazenar strings nesta memória sem problemas. Com EEPROM.read(endereço); obtemos o valor que esta armazenado na posição de memória especificada pelo endereço.

No setup do sketch é verificado se o valor da variável escreve é true (ou 1), caso seja nós armazenamos a variável texto na memória, e no loop do sketch nós  lemos continuamente essas posições de memória. Nada impede que no loop a memória EEPROM possa ser reescrita. Caso o valor da variável seja false (ou 0), não escrevemos nada na memória e apenas lemos estas posições de memória durante o loop.

Fiquem a vontade para alterar o valor da variável texto e escreve, e ver o comportamento. Se notarem, um trabalho mais elaborado com a EEPROM pode ser muito complexo, como estamos trabalhando com posições de memória, temos que ter muito cuidado com ONDE estamos armazenando um valor, e DE ONDE estamos lendo um valor.

Neste post falei sobre a EEPROM interna do Arduino. Outros tipos de EEPROM, externas, existem, e vamos falar sobre uma delas no próximo post. Abaixo imagem com a EEPROM que utilizaremos no próximo post:

 

EEPROM

AT24C256 – Memória Externa para Arduino

Pessoal, qualquer dúvida, sugestão, links, etc, etc… por favor fiquem a vontade para comentar.

Abs e até a próxima 😉

 

8 thoughts on “Utilizando a EEPROM interna do Arduino.

  1. Claudinei

    Olá.
    Preciso de uma ajuda. Preciso gravar uma senha de 4 digitos na EEPROM. Eu ja tenho tudo funcionando porem nao consigo memorizar uma nova senha, quando desligo o sistema volta a senha padrão.
    Alguem pode me ajudar, so uma referencia ja ajuda bastante
    Sds.
    Claudinei

    Reply
  2. Claudinei

    senha de 4 digitos atraves de teclado 4×3 na EEPROM

    Reply
  3. luiz

    Qual a finalidade de eu estender a EEPROM do arduino se eu posso colocar um shild de cartão sd e estender muito mais a memoria para scket ? Descupe a ignorância eu estou aprendendo a programação 🙂

    Reply
    1. Valdinei Rodrigues dos Reis Post author

      Ola Luiz.
      A necessidade muitas vezes define a finalidade. Vamos analisar alguns pontos.

      Custo:
      Arduino –> R$40
      Shiel para SD –> R$20
      SD 512Mb –> R$20
      Bem, se não preciso de mais que 1024 bytes, não tem por que eu pagar o dobro(considerei frete nos preços)

      Praticidade:
      EEPROM –> 0 pinos
      Shield SD –> 6 pinos
      Se dinheiro não é problema, bem, talvez o uso de 6 pinos ao invéz de 0 pinos justifique. Não esquecendo, tudo depende da necessidade, para mais que 1K, a EEPROM não serve.

      Bem, como falei, depende do uso…

      Reply
  4. deivid

    testei o código mas não apareceu de forma correta o que escrito na eeprom via serial

    Reply
    1. Valdinei Rodrigues dos Reis Post author

      Ola Deivid.
      Usou o sketch do exemplo?
      Eu copiei e colei aqui no blog o exemplo, então o resultado deveria ser o mesmo.

      Abs.

      Reply
  5. Luiz

    Ola. Li em algum lugar que essa memoria eeprom do Arduino tem uma vida de escrita meio curta. Tipo 100 mil vezes. Depois disso nao grava mais. Confere ?

    Reply
    1. Valdinei Rodrigues dos Reis Post author

      Ola Luiz.
      Eu não lembro de ter lido qual a vida útil da EEPROM, mas 100 mil vezes é razoavelmente muita coisa.
      Considere que o tempo de leitura/escrita é meio lento(3,3ms) e temos que esta memória não é adequada para muitas leituras/escritas. Portanto em um projeto bem “projetado” dificilmente faremos tantas leituras/escritas.
      A SRAM é a memória adequada para este fim.

      Abs.

      Reply

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

onze − 3 =