EEPROM significa Electrically Erasable Programmable Read-Only Memory.
É um tipo de memória não volátil (não perde os dados quando o Arduino é desligado).
Diferente da RAM, os valores permanecem salvos mesmo sem energia.
Todos os Arduinos possuem uma quantidade de memória EEPROM interna.
O Arduino Uno R3 por exemplo possui 1Kb enquanto que o Arduino Uno R4 possui 8Kb.
Essa memória é usada para armazenar dados permanentes, como configurações ou calibrações.
Cada posição da EEPROM pode armazenar um valor de 0 a 255 (1 byte).
Ela pode ser lida e escrita individualmente.
Ela também possui vida útil limitada, cerca de 100.000 ciclos de escrita por posição.
As leituras não desgastam a memória.
A EEPROM é organizada como uma tabela de bytes.
Cada célula da tabela corresponde a um endereço numérico (0, 1, 2, 3 … até o limite da memória).
Cada endereço armazena 1 byte (8 bits), ou seja, um número de 0 a 255.
Por exemplo, o Arduino Uno R3 possui 1024 bytes, portanto ele disponibiliza os endereços de 0 a 1023.
Cada endereço guarda um valor independente, e a leitura e escrita são feitas um endereço de cada vez.
Para guardar números maiores que 255 (ex.: int, float), o valor precisa ser quebrado em vários bytes e armazenado em endereços consecutivos.
O Arduino possui funções prontas (na biblioteca
A biblioteca EEPROM.h permite ler e escrever dados na memória EEPROM do Arduino.
Ela facilita o armazenamento de dados que devem persistir mesmo sem energia.
Não precisa de instalação uma vez que ela é incluída automaticamente na Arduino IDE.
Principais funções de leitura e escrita dela:
Como boas práticas, evite gravar repetidamente dentro do loop(), use EEPROM.update() sempre que possível e planeje o mapa de endereços se houver vários dados a serem armazenados.
Lembre-se do limite de ciclos de gravação (~100.000 por endereço).
Neste projeto você fará uso da EEPROM presente na placa Arduino.
Para a criação deste circuito serão necessários os seguintes componentes:
Uma vez criado o circuito, use os dois códigos fontes a seguir no Arduino IDE para fazer o upload dele na placa Arduino e verificar o funcionamento de ambos, onde cada um deles faz o uso de diferentes funções da biblioteca EEPROM.h e devem ser testados separadamente.
Código 1: teste da EEPROM para as funções de write, update e read.
/**
* Código do curso Magos do Arduino para gravar dados simples na EEPROM Arduino.
*
* Código de teste de EEPROM para as funções de write, update e read.
* Grava os valores de 1 a 10 a partir do endereço de memória 10, e depois
* imprime no monitor serial os valores gravados.
*
* (c) Copyright KazaleIT
* @kazaleitoficial no YouTube
**/
#include <EEPROM.h>
void setup() {
Serial.begin(9600);
while (!Serial) {
; // aguarda uma conexão serial
}
int endereco = 10; // endereço onde será gravado valores na EEPROM
// grava os dados na EEPROM usando as funções write e update
for (int i=0; i<10; i++) {
// EEPROM.write(endereco, i + 1);
EEPROM.update(endereco, i + 1);
endereco++;
}
// lê os dados da EEPROM com o read e imprime os valores no monitor serial
for (int j=10; j<20; j++) {
int valor = EEPROM.read(j);
Serial.print("Endereço: ");
Serial.print(j);
Serial.print(", Valor: ");
Serial.println(valor);
}
}
void loop() {
}
Código 2: teste da EEPROM para as funções de put e get.
/**
* Código do curso Magos do Arduino para gravar dados complexos na EEPROM do Arduino.
*
* Código de teste de EEPROM para as funções de put e get.
* Grava os valores complexos (struct), e depois imprime no monitor serial os valores gravados.
*
* (c) Copyright KazaleIT
* @kazaleitoficial no YouTube
**/
#include <EEPROM.h>
struct Sensor {
float temperatura;
int umidade;
char titulo[20];
};
void setup() {
Serial.begin(9600);
while (!Serial) {
; // aguarda uma conexão serial
}
// gera dados a serem gravados na EEPROM
Sensor dadosSensor = {
26.5f,
75,
"Magos do Arduino"
};
// grava os dados na EEPROM
EEPROM.put(0, dadosSensor);
// realiza a leitura dos dados da EEPROM
Sensor leituraDados = {};
EEPROM.get(0, leituraDados);
Serial.println("Valores obtidos da EEPROM: ");
Serial.print("Temperatura: ");
Serial.println(leituraDados.temperatura);
Serial.print("Umidade: ");
Serial.println(leituraDados.umidade);
Serial.print("Título: ");
Serial.println(leituraDados.titulo);
}
void loop() {
}