A quantidade de memória EEPROM varia conforme o modelo da placa. O Arduino Uno (microcontrolador ATMega328), tem 1 KB de memória EEPROM. Já o Arduino Mega (microcontrolador ATMega2560) tem 4 KB. No Arduino Nano com microcontrolador ATMega168, esse valor cai para 512 bytes.
O comando para escrever na memória EEPROM é o EEPROM.write(endereço, valor), e exige o uso da biblioteca EEPROM , que já faz parte da IDE do Arduino.

endereço tem o valor inicial em 0, e vai até a capacidade total da memória EEPROM. Assim, se você estiver trabalhando com um Arduino Uno, você tem 1024 posições de memória pra gravar os dados, um byte (8 bits) de cada vez, ou seja, o maior valor que você consegue gravar em uma posição de memória é 255.
Mas se cada posição armazena apenas um byte, como eu vou armazenar um número inteiro (2 bytes) na EEPROM ?
Um INT (inteiro) no Arduino Uno e em outras placas baseadas no ATMega, é um número entre -32.768 e 32.767, que ocupa 2 bytes (16 bits) de memória.

Uma das maneiras de gravar um número inteiro na EEPROM é separar esse número em duas partes, e gravar cada uma separadamente.

Digo "uma das maneiras", porque você pode utilizar as próprias funções da biblioteca para gravar dados na EEPROM, usando os comandos abaixo :
void eeprom_write_word (uint16_t *__p, uint16_t __value)
void eeprom_write_float (float *__p, float __value)
void eeprom_write_block (const void *__src, void *__dst, size_t __n)
A primeira opção, por exemplo, utiliza o uint16_t, que é um unsigned int de 16 bits, cujo valor vai de 0 a 65.535.
No meu método mais arcaico, eu armazeno o INT dividindo-o em duas partes : primeiro divido o número que desejo armazenar por 256, obtendo a primeira parte, e depois uso a função % (modulo), para obter a segunda parte. Posteriormente, coloco cada uma delas em um endereço de memória diferente.
Eu faço isso no programa abaixo, gravando o número 23767 na memória separando-o assim:
Primeira parte : 23767 / 256 = 92 (apenas a parte inteira do número)
Segunda parte :  23767 % 256 = 215 (resto da divisão)
Depois de ler o valor em memória, preciso montar novamente o valor original, juntando as 2 partes. Para isso uso :

Valor original = (parte1 * 256) + parte2
Isso quer dizer que a partir de agora você pode gravar todos os dados na memória EEPROM do Arduino ? Infelizmente não.
Segundo o datasheet do ATMega328P , temos um limite de ciclos de leitura e escrita na memória EEPROM. Esse número é de aproximadamente 100.000 ciclos.
Apesar de ser um número relativamente grande, procure usar um intervalo maior para gravação, ou utilize-o apenas para valores essenciais, como por exemplo os valores máximo e mínimo de um sensor de temperatura.

Exibições: 2298

Responder esta

Respostas a este tópico

Para ajudar um amigo

Anexos

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço