Arduino tiene una memoria no volátil de tan sólo 512 bytes, que puede ser insuficiente en algunos casos.
Pero podemos usar una EEPROM externa, en mi caso he usado una EEPROM serie 24LC256 que tiene una capacidad de 256 Kbit (32K x 8 bytes) y un precio de 2.88 euros. Os dejo el enlace a
La comunicación entre Arduino y la EEPROM se realiza mediante el bus I2C , que se trata de un bus de comunicaciones serie formado por dos lineas: una para los datos y otra para el reloj.
La librería Wire permite manejar un bus I2C desde nuestro Arduino, y en este artículo del wiki encontramos 4 funciones que usando la librería anterior implementan la lectura/escritura en la EEPROM.
El parámetro deviceaddress al que hacen referencia estas funciones en el caso de esta memoria se trata del 0x50.
No debemos olvidarnos de inicializar la conexión antes de usar estas funciones:
Wire.begin();
En cuanto a las conexiones de los pines: el pin 5 de la EEPROM (SDA) lo conectamos a la entrada analógica 4 de nuestro Arduino, el pin 6 (SCL) a la entrada analógica 5 (observar en la foto que los cables de color naranja se cruzan), el pin 8 a 5V y todos los demás a tierra.
Los pines analógicos 4 y 5 de Arduino son los que usa la librería Wire.
En cuanto al sketch, os pongo el ejemplo con el que lo probé: se trata de escribir una cadena de caracteres cuando enciende nuestro Arduino y de leerla y enviarla al ordenador repetidamente.
- /* Ejemplo EEPROM
-
* Autor: kans
-
* Fecha: 05/03/2008
-
*/
-
-
#include <Wire.h> //libreria I2C
-
-
//Las siguientes funciones para lectura y escritura en una EEPROM se encuentran en el wiki de Arduino: http://www.arduino.cc/playground/Code/I2CEEPROM
-
-
void i2c_eeprom_write_byte( int deviceaddress, unsigned int eeaddress, byte data ) {
-
int rdata = data;
-
Wire.beginTransmission(deviceaddress);
-
Wire.send((int)(eeaddress >> 8)); // MSB
-
Wire.send((int)(eeaddress & 0xFF)); // LSB
-
Wire.send(rdata);
-
Wire.endTransmission();
-
}
-
-
// WARNING: address is a page address, 6-bit end will wrap around
-
// also, data can be maximum of about 30 bytes, because the Wire library has a buffer of 32 bytes
-
void i2c_eeprom_write_page( int deviceaddress, unsigned int eeaddresspage, byte* data, byte length ) {
-
Wire.beginTransmission(deviceaddress);
-
Wire.send((int)(eeaddresspage >> 8)); // MSB
-
Wire.send((int)(eeaddresspage & 0xFF)); // LSB
-
byte c;
-
for ( c = 0; c < length; c++)
-
Wire.send(data[c]);
-
Wire.endTransmission();
-
}
-
-
byte i2c_eeprom_read_byte( int deviceaddress, unsigned int eeaddress ) {
-
byte rdata = 0xFF;
-
Wire.beginTransmission(deviceaddress);
-
Wire.send((int)(eeaddress >> 8)); // MSB
-
Wire.send((int)(eeaddress & 0xFF)); // LSB
-
Wire.endTransmission();
-
Wire.requestFrom(deviceaddress,1);
-
if (Wire.available()) rdata = Wire.receive();
-
return rdata;
-
}
-
-
// maybe let's not read more than 30 or 32 bytes at a time!
-
void i2c_eeprom_read_buffer( int deviceaddress, unsigned int eeaddress, byte *buffer, int length ) {
-
Wire.beginTransmission(deviceaddress);
-
Wire.send((int)(eeaddress >> 8)); // MSB
-
Wire.send((int)(eeaddress & 0xFF)); // LSB
-
Wire.endTransmission();
-
Wire.requestFrom(deviceaddress,length);
-
int c = 0;
-
for ( c = 0; c < length; c++ )
-
if (Wire.available()) buffer[c] = Wire.receive();
-
}
-
-
-
void setup() {
-
char cadena[] = "hola mundo desde una eeprom"; //cadena a escribir
-
Wire.begin(); //es obligatorio inicializar la conexion
-
Serial.begin(9600);
-
i2c_eeprom_write_page(0x50, 0, (byte *)cadena, sizeof(cadena)); //escribir la cadena al principio de la EEPROM; comentar esta linea para probar que la memoria es no volatil
-
delay(10); //peque�a pausa despues de escribir en la memoria
-
}
-
-
void loop() {
-
int addr=0; //direccion a leer
-
byte b = i2c_eeprom_read_byte(0x50, 0); //acceso a la primera posicion de memoria
-
-
while (b!=0) {
-
Serial.print((char)b); //enviar al ordenador
-
addr++; //siguiente direccion
-
b = i2c_eeprom_read_byte(0x50, addr); //acceso a posicion de memoria
-
}
-
Serial.println();
-
delay(2000);
-
}
Al tratarse de una memoria no volátil, podemos comentar la escritura (línea 59) para comprobar que permanecen los datos guardados con anterioridad.