AT24C256 – Usando EEPROM externa

AT24C256 é um módulo EEPROM da ATMEL que pode ser utilizado no Arduino caso o tamanho da EEPROM interna não seja suficiente. Lembrando que a EEPROM do Arduino possui 1k, e o módulo AT24C256 posui 32K.

EEPROM

Módulo AT24C256 para uso com Arduino.

Como vimos no post anterior, utilizar a memória EEPROM  é relativamente simples. Para utilizar uma memória externa teremos que saber de qual forma o módulo se comunica com o Arduino. O módulo AT24C256 é um dispositivo I2C, então usaremos a biblioteca  Wire.h.

Opa, I2C?? Que isto? Uhmm, parece que o autor do blog esta colocando o carro na frente dos bois…

Bem pessoal, é isso mesmo. Estou colocando o carro na frente dos bois. Eu gosto de ser, ou pelo menos tentar ser, o mais claro possível nas explicações, para que todos entendam e possam inventar a partir dos exemplos que dou, mas aqui a história é um pouco diferente. I2C basicamente é uma das formas padronizadas que o Arduino tem para se comunicar com outros dispositivos. Existem outras formas, sendo que já falamos aqui superficialmente sobre os protocos One-Wire e SPI. Embora não seja, afinal, tão complicado assim, o I2C é razoavelmente mal documentado, inclusive no site do Arduino, o que gera muita confusão. Demorei até juntar as informações de diversos sites e entender bem o I2C. Nos próximos posts vou tentar passar o pouco que aprendi. Portanto, só posso garantir o sucesso no sketch deste post se o módulo utilizado for exatamente o da figura acima e as conexões forem exatamente iguais as da figura mais abaixo. Esse módulo utiliza o chip AT24C256 da Atmel, e será utilizado nos posts futuros específicos sobre I2C.

O chip AT24C256 é utilizado em vários layouts de módulos diferentes. Este módulo que comprei do Ebay possui jumpers para configuração do endereço I2C. Utilizem o chip com os jumpers nas posições indicadas acima, e conectem o mesmo ao Arduino conforme o diagrama abaixo.

at24c256 Arduino

EEPROM externa AT24C256 – Ligação com Arduino

A ligação é simples, e agora então vamos para o código. Lembrando novamente que o objetivo aqui é mostrar a escrita e leitura de informações em uma EEPROM externa. Não se preocupem com detalhes que nos próximos posts daremos uma geral no protocolo I2C:

Código para uso com o módulo AT24C256

#include <Wire.h>
#define EEPROM_END 0x50
String texto = "arduinoBR.com";
int inicio = 0;

void setup(){
 Wire.begin();
 Serial.begin(9600);
 Serial.println("Escrevendo na EEPROM...");
 for (int x=inicio; x<texto.length(); x++){
 i2c_eeprom_escrita(EEPROM_END, x, byte(texto.charAt(x)));
 delay(5);
 }
 Serial.println("Escrita concluida!!!");
 Serial.println("");
}
void loop(){
 for (int x=inicio; x<texto.length(); x++){
 Serial.print(i2c_eeprom_leitura(EEPROM_END, x));
 }
 Serial.println("");
 delay(1000);
}

void i2c_eeprom_escrita(int end_eeprom, unsigned int end_memoria, byte valor)
{
 Wire.beginTransmission(end_eeprom);
 Wire.write((int)(end_memoria >> 8));
 Wire.write((int)(end_memoria & 0xFF));
 Wire.write(valor);
 Wire.endTransmission();
}

char i2c_eeprom_leitura(int end_eeprom, unsigned int end_memoria)
{
 Wire.beginTransmission(end_eeprom);
 Wire.write((int)(end_memoria >> 8));
 Wire.write((int)(end_memoria & 0xFF));
 Wire.endTransmission();
 Wire.requestFrom(end_eeprom, 1);
 byte dado;
 if (Wire.available()){
 dado=Wire.read();
 }
 Wire.endTransmission();
 return dado;
}

O código acima faz o que o código do post anterior faz, ou seja, escreve cada caractere da string texto na EEPROM durante o setup(), e fica lendo a cada execução do loop(). As diferenças ficam por conta do protocolo I2C utilizado, e pela ausência de uma variável para verificar se é para escrever na memória ou não. Fique a vontade para alterar a string texto e verificar o resultado. Para brincar um pouco, comente a linha  i2c_eeprom_escrita(EEPROM_END, x, byte(texto.charAt(x))); que se encontra no setup(), faça upload, desligue o Arduino, vá dormir, e no outro dia conecte novamente o Arduino, abra o console da serial, e verifique que ele vai continuar lendo os valores da EEPROM 😉

Bem pessoal, é isso por enquanto, sei que o código não esta nada claro, mas assim que terminarmos de falar sobre I2C nos próximos posts tenho certeza de que vocês vão reescrever esse código sem nem olhar mais para este post.

Abs e até a próxima.

 

7 thoughts on “AT24C256 – Usando EEPROM externa

  1. Caio Cesar

    Valdinei muito bom o post e realmente i2c é muito mal difundida, gostaria de saber se haveria como usar um modulo diferente a 24c04, pois tenho um aqui e não consigo gravar nela por esses sketches e nem ler! Qual eh a modificação para que ela funcione?

    Reply
    1. Caio Cesar

      Amigo já consegui! Mas continue com blog dei uma olhada e é de grande valor para nós! Grato

      Reply
      1. Valdinei Rodrigues dos Reis Post author

        Ola Caio.

        Perdão pela demora, e parabéns por encontrar a solução

        Abs

        Reply
  2. Umberto Schneider

    Olá, vi seu projeto residencial e estou fazendo algo similar na casa de um amigo, porem algumas duvidas sobre a parte fisica do projeto:
    O cabo UTP é um cabo rigido e sua maliabilidade é limitada, assim, acredito que não posso simplesmente conecta-lo nos terminais do relé, pois com o tempo e a exposição a umidade o mesmo pode vir a diminuir a sua condução e até mesmo se romper. Achas-te alguma saída para isso? Ou tu achas que a chance de isso acontecer é muito pequena?
    Fico no aguardo, pois essas duvidas me fizeram meio que desanimar com o projeto.

    Reply
    1. Valdinei Rodrigues dos Reis Post author

      Ola Humberto
      Se não desencapar uma boa distância, a maleabilidade pode sim ser prejudicada.
      Bem, nos laboratórios eu conecto o cabo direto nos pinos fêmeas. Agora que estou para colocar em “produção”, comprei conectores próprios (macho/fêmea), e pretendo soldar os cabos UTPs.

      Abs.

      Reply
  3. Helio

    Valdinei, tudo bem? Parabéns pelo post. Mas uma dúvida: Tenho duas eeprom e gostaria de ler as duas, mas como se fazendo a referencia 0x50, como eu faço a referencia para 0x51, 0x52 utilizando a mesma porta sda e scl?

    Obrigado!

    Reply
    1. Valdinei Rodrigues dos Reis Post author

      Ola Hélio, tudo bem?

      Estou considerando que tudo OK para ti na parte do código. Na parte de ligações, é muito simples.
      Você vai ligar as duas EEPROMs em paralelo, ou seja, o mesmo fio que sai do SDA do Arduino vai conectado na SDA de cada uma das EEPROMs, o mesmo para o SCL, GND e VCC.

      Se tiver dúvidas na programação, avise que ajudaremos.
      Se ainda tiver dúvidas quanto a ligação, fique de olho que estou para postar sobre mais de dois dispositivos I2C.
      Abs.

      Reply

Deixe uma resposta

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

20 − um =