Diferencia entre revisiones de «EEPROM»
De ArduWiki
(→Descripción) |
(→Referencias) |
||
(No se muestran 30 ediciones intermedias del mismo usuario) | |||
Línea 1: | Línea 1: | ||
== Descripción == | == Descripción == | ||
− | Es una memoria no volátil para mantener datos después de apagado nuestro Arduino. Se puede grabar constantes desde un [[boceto]] con algunas instrucciones especiales. Al igual que la memoria [[ | + | Es una memoria no volátil para mantener datos después de apagado nuestro Arduino. Se puede grabar constantes desde un [[boceto]] con algunas instrucciones especiales. Al igual que la memoria [[flash]] tiene una vida útil de unas 100,000 ciclos de escritura. Esta memoria solo puede leerse byte a byte y su uso puede se un poco incómodo. También es algo más lenta que la [[SRAM]]. |
{|class="wikitable col2cen col3cen col4cen" | {|class="wikitable col2cen col3cen col4cen" | ||
Línea 13: | Línea 13: | ||
|- | |- | ||
|EEPROM||1K||4K||- | |EEPROM||1K||4K||- | ||
+ | |} | ||
+ | |||
+ | Es una libreria [https://github.com/thijse/Arduino-EEPROMEx EEPROM] de Thijs Elenbaas... | ||
+ | |||
+ | == Sintaxis == | ||
+ | <pre> | ||
+ | #include <EEPROM.h> | ||
+ | EEPROM.write(dirección, dato); | ||
+ | EEPROM.read(dirección); | ||
+ | </pre> | ||
+ | |||
+ | == Parametros == | ||
+ | ;dirección:Es la dirección entre 0 y el total de memoria EEPROM de tu placa. | ||
+ | ;dato:Es un valor de un [[byte]]. | ||
+ | |||
+ | |||
+ | == Metodos == | ||
+ | |||
+ | {| class="wikitable" | ||
+ | |+Metodos de EEPROM | ||
+ | |- | ||
+ | ! Metodo !! Descripciom | ||
+ | |- | ||
+ | | read() || | ||
+ | |- | ||
+ | | readByte() || | ||
+ | |- | ||
+ | | readInt() || | ||
+ | |- | ||
+ | | readLong() || | ||
+ | |- | ||
+ | | readDouble() || | ||
+ | |- | ||
+ | | readBlock() || | ||
+ | |- | ||
+ | | writeByte() || | ||
+ | |- | ||
+ | | writeInt() || | ||
+ | |- | ||
+ | | writeLong() || | ||
+ | |- | ||
+ | | writeDouble() || | ||
+ | |- | ||
+ | | writeFloat() || | ||
+ | |- | ||
+ | | writeBlock() || | ||
+ | |- | ||
+ | | update() || | ||
+ | |- | ||
+ | | updateByte() || | ||
+ | |- | ||
+ | | updateInt() || | ||
+ | |- | ||
+ | | updateLong() || | ||
+ | |- | ||
+ | | updateBouble() || | ||
+ | |- | ||
+ | | updateFloat() || | ||
+ | |- | ||
+ | | updateBlock() || | ||
+ | |- | ||
+ | | isReady() || | ||
+ | |- | ||
+ | | setMemPool() || | ||
+ | |- | ||
+ | | setMaxAllowedWrites() || | ||
+ | |- | ||
+ | | getAddress() || | ||
|} | |} | ||
Línea 19: | Línea 87: | ||
* Para actuar con esta memoria debes usar la '''libreria EEPROM.h''' que esta por defecto en el IDE. | * Para actuar con esta memoria debes usar la '''libreria EEPROM.h''' que esta por defecto en el IDE. | ||
* Debes trabajar con direcciones y hacerlo byte a byte, tanto para leer como para escribir. | * Debes trabajar con direcciones y hacerlo byte a byte, tanto para leer como para escribir. | ||
− | * Las direcciones van de 0 a | + | * Las direcciones van de 0 a 999 y podrás almacenar datos de 0 a 255. Para datos mas grandes debes dividirlos en bytes. Por ejemplo si el dato es tipo [[unsigned int]] lo debes dividir entre 4 y luego de recuperar multiplicar por 4 (pierdes presicion). |
+ | |||
+ | == Advertencias == | ||
+ | * En ESP8266 es distinto [https://arduino.stackexchange.com/questions/25945/how-to-read-and-write-eeprom-in-esp8266 mira aqui]. | ||
== Ejemplo 1 == | == Ejemplo 1 == | ||
− | + | Escribir y leer un solo [[byte]]. | |
− | < | + | <syntaxhighlight lang="c++"> |
#include <EEPROM.h> | #include <EEPROM.h> | ||
int Direccion = 0; //Variable con la posición de memoria | int Direccion = 0; //Variable con la posición de memoria | ||
void setup(){ | void setup(){ | ||
− | |||
//Escribir | //Escribir | ||
byte data = B11001; //25 en binario | byte data = B11001; //25 en binario | ||
EEPROM.write(Direccion, data); | EEPROM.write(Direccion, data); | ||
− | |||
− | |||
//Leer | //Leer | ||
− | byte | + | byte val = EEPROM.read(Direccion); |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
} | } | ||
Línea 52: | Línea 110: | ||
//Nada | //Nada | ||
} | } | ||
− | </ | + | </syntaxhighlight> |
+ | |||
+ | == Ejemplo 2 == | ||
+ | Escribir y leer un dato tipo [[int]] osea dos bytes. | ||
+ | |||
+ | <syntaxhighlight lang="c++"> | ||
+ | #include <EEPROM.h> | ||
+ | void setup(){ | ||
+ | //Escribir | ||
+ | int dato = 12345; | ||
+ | EEPROM.write(0, highByte(dato)); //Toma mas significativo | ||
+ | EEPROM.write(1, lowByte(dato)); //Toma menos significativo | ||
+ | //Leer | ||
+ | int val = EEPROM.read(0); | ||
+ | val = val << 8; //Desplaza a la izquierda | ||
+ | val += EEPROM.read(1); | ||
+ | } | ||
+ | |||
+ | void loop(){ | ||
+ | //Nada | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | == Ejemplo 3 == | ||
+ | Escribir y leer un dato tipo [[long]] osea cuatro bytes. | ||
+ | |||
+ | <syntaxhighlight lang="c++"> | ||
+ | #include <EEPROM.h> | ||
+ | |||
+ | void setup(){ | ||
+ | //Escribir | ||
+ | long dato = 123456789; | ||
+ | for (byte i=0; i<4; i++) { | ||
+ | EEPROM.write(3-i, lowByte(dato)); | ||
+ | dato = dato >> 8; //Desplaza 8 bits a la derecha | ||
+ | } | ||
+ | //Lee | ||
+ | long val = 0; | ||
+ | for (byte i=0; i<3; i++) { | ||
+ | val += EEPROM.read(i); | ||
+ | val = val << 8; //Desplaza 8 bits a la izquierda | ||
+ | } | ||
+ | val += EEPROM.read(3); | ||
+ | } | ||
+ | |||
+ | void loop(){ | ||
+ | //Nada | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | == Ejemplo 4 == | ||
+ | Escribir y leer un dato tipo matriz. | ||
+ | |||
+ | <syntaxhighlight lang="c++"> | ||
+ | #include <EEPROM.h> | ||
+ | |||
+ | void setup(){ | ||
+ | Serial.begin(9600); | ||
+ | //Escribir | ||
+ | char data[12] = "Arduino 123"; | ||
+ | for (byte i=0; i<13; i++){ | ||
+ | EEPROM.write(i, data[i]); | ||
+ | } | ||
+ | //Leer | ||
+ | char val[12]; | ||
+ | for (byte i=0; i<13; i++){ | ||
+ | val[i] = EEPROM.read(i); | ||
+ | } | ||
+ | Serial.print(val); | ||
+ | } | ||
+ | |||
+ | void loop(){ | ||
+ | //Nada | ||
+ | } | ||
+ | </syntaxhighlight> | ||
== Vea también == | == Vea también == | ||
− | + | <categorytree mode=all>Librerias</categorytree> | |
− | |||
== Referencias == | == Referencias == | ||
− | * [https://www.luisllamas.es/guardar-variables-entre-reinicios-con-arduino-y-la-memoria-no-volatil-eeprom/ Luis Llamas] | + | * [https://www.arduinolibraries.info All Librays] |
+ | * [http://playground.arduino.cc/Code/EEPROMex EEPROMex] | ||
+ | * [https://www.luisllamas.es/guardar-variables-entre-reinicios-con-arduino-y-la-memoria-no-volatil-eeprom/ Memoria EEPROM] - Luis Llamas | ||
+ | * [http://www.educachip.com/como-usar-la-memoria-eeprom-de-arduino/ Como usar EEPROM] - EducaChip | ||
+ | * [https://arduino.stackexchange.com/questions/25945/how-to-read-and-write-eeprom-in-esp8266 EEPROM para ESP8266] | ||
+ | * [https://arduinoplusplus.wordpress.com/2019/04/02/persisting-application-parameters-in-eeprom/ Persisting parameters in EEPROM] - Marco_C | ||
− | [[Category: | + | [[Category:Librerias]] |
+ | [[Category:memoria]] |
Revisión actual del 00:14 10 sep 2019
Contenido
Descripción
Es una memoria no volátil para mantener datos después de apagado nuestro Arduino. Se puede grabar constantes desde un boceto con algunas instrucciones especiales. Al igual que la memoria flash tiene una vida útil de unas 100,000 ciclos de escritura. Esta memoria solo puede leerse byte a byte y su uso puede se un poco incómodo. También es algo más lenta que la SRAM.
Tipo | Arduino UNO | Arduino MEGA | Arduino MKR1000 |
---|---|---|---|
flash | 32K | 256K | 256K |
Flash-bootloader | 0.5K | 8K | - |
SRAM | 2K | 8K | 32K |
EEPROM | 1K | 4K | - |
Es una libreria EEPROM de Thijs Elenbaas...
Sintaxis
#include <EEPROM.h> EEPROM.write(dirección, dato); EEPROM.read(dirección);
Parametros
- dirección
- Es la dirección entre 0 y el total de memoria EEPROM de tu placa.
- dato
- Es un valor de un byte.
Metodos
Metodo | Descripciom |
---|---|
read() | |
readByte() | |
readInt() | |
readLong() | |
readDouble() | |
readBlock() | |
writeByte() | |
writeInt() | |
writeLong() | |
writeDouble() | |
writeFloat() | |
writeBlock() | |
update() | |
updateByte() | |
updateInt() | |
updateLong() | |
updateBouble() | |
updateFloat() | |
updateBlock() | |
isReady() | |
setMemPool() | |
setMaxAllowedWrites() | |
getAddress() |
Comentarios
- La EEPROM de tu Arduino es especialmente util para guardar datos como: MAC, IP, constantes de calibración de algún sensor y claves de usuario.
- Para actuar con esta memoria debes usar la libreria EEPROM.h que esta por defecto en el IDE.
- Debes trabajar con direcciones y hacerlo byte a byte, tanto para leer como para escribir.
- Las direcciones van de 0 a 999 y podrás almacenar datos de 0 a 255. Para datos mas grandes debes dividirlos en bytes. Por ejemplo si el dato es tipo unsigned int lo debes dividir entre 4 y luego de recuperar multiplicar por 4 (pierdes presicion).
Advertencias
- En ESP8266 es distinto mira aqui.
Ejemplo 1
Escribir y leer un solo byte.
#include <EEPROM.h>
int Direccion = 0; //Variable con la posición de memoria
void setup(){
//Escribir
byte data = B11001; //25 en binario
EEPROM.write(Direccion, data);
//Leer
byte val = EEPROM.read(Direccion);
}
void loop(){
//Nada
}
Ejemplo 2
Escribir y leer un dato tipo int osea dos bytes.
#include <EEPROM.h>
void setup(){
//Escribir
int dato = 12345;
EEPROM.write(0, highByte(dato)); //Toma mas significativo
EEPROM.write(1, lowByte(dato)); //Toma menos significativo
//Leer
int val = EEPROM.read(0);
val = val << 8; //Desplaza a la izquierda
val += EEPROM.read(1);
}
void loop(){
//Nada
}
Ejemplo 3
Escribir y leer un dato tipo long osea cuatro bytes.
#include <EEPROM.h>
void setup(){
//Escribir
long dato = 123456789;
for (byte i=0; i<4; i++) {
EEPROM.write(3-i, lowByte(dato));
dato = dato >> 8; //Desplaza 8 bits a la derecha
}
//Lee
long val = 0;
for (byte i=0; i<3; i++) {
val += EEPROM.read(i);
val = val << 8; //Desplaza 8 bits a la izquierda
}
val += EEPROM.read(3);
}
void loop(){
//Nada
}
Ejemplo 4
Escribir y leer un dato tipo matriz.
#include <EEPROM.h>
void setup(){
Serial.begin(9600);
//Escribir
char data[12] = "Arduino 123";
for (byte i=0; i<13; i++){
EEPROM.write(i, data[i]);
}
//Leer
char val[12];
for (byte i=0; i<13; i++){
val[i] = EEPROM.read(i);
}
Serial.print(val);
}
void loop(){
//Nada
}
Vea también
Referencias
- All Librays
- EEPROMex
- Memoria EEPROM - Luis Llamas
- Como usar EEPROM - EducaChip
- EEPROM para ESP8266
- Persisting parameters in EEPROM - Marco_C