Como sabemos o espaço disponível para os sketches é limitado e por isso temos que nos preocupar com o código (tamanho e qualidade) para que não tenhamos a desagradável surpresa de ver o nosso projeto naufragar por este pequeno e importante detalhe.

Nos microcontroladores que equipam os Arduinos (ATMEGA328), temos três grupos de memória e seus respectivos tamanhos:
| Flash | 32KB, onde o sketch é armazenado. |
| SRAM (Static Random Access Memory) |
2KB, onde o sketch cria e manipula as variáveis. |
| EEPROM (Electrically-Erasable Programmable Read-Only Memory) |
1KB, espaço de memória livre destinado aos programadores |
Características das Memórias
As memórias Flash e EEPROM são do tipo não volátil, ou seja, a informação persiste após a alimentação ser desligada. A memória SRAM é volátil e os dados serão perdidos quando não houver energia.
Soneto de Fidelidade
“[…]Mas que seja infinito enquanto dure.”
Vinicius de Moraes
Vocês vão entender a menção ao poeta Vinicius de Moraes. As memórias Flash e EEPROM podem ser programadas e apagadas várias vezes, mas infelizmente isto não é para sempre. Ocorre uma deterioração interna do chip durante o processo de apagamento. Segundo o datasheet da ATMEL os ciclos de escrita e apagamento são de 10.000 para memórias Flash e 100.000 para memórias EEPROM. Há também o fator temperatura. Os dados são retidos nestas memórias por 20 anos a 85 graus centigrados e 100 anos a 25 graus centigrados.
Organização da memória EEPROM
Tomando como exemplo uma memória de 1KB, teremos 1024 posições com espaço de um byte cada. Então, cada posição pode armazenar valores inteiros de 0 a 255.

No sketch teremos que controlar em qual posição faremos a leitura ou gravaçao deste byte. O exemplo a seguir vai deixar mais claro.
Exemplo Prático: Monitor de Temperatura com o LM35.
O objetivo é monitorar a temperatura ambiente, exibindo esta temperatura e a máxima anterior registrada na console serial.
A máxima anterior registrada está na posição 0 (zero) da EEPROM. Somente atualizamos esta posição se temperatura atual for maior que a máxima anterior registrada.
O esquema é bem simples: o terminal Vs do LM35 conectar no pino +5V do Arduino, o terminal Vout do LM35 conectar no pino analógico 0 (zero) do Arduino e o terminal GND (terra) do LM35 conectar no pino GND do Arduino.

Usaremos os dois métodos responsáveis pela escrita e leitura: write() e read(). Para isto não podemos esquecer de incluir a biblioteca EEPROM.h .
Sketch
#include <EEPROM.h>
void setup() {
pinMode( 0, INPUT); // pino analogico 0
Serial.begin(9600);
}
void loop() {
unsigned int
temperatura = 0,
media = 0,
registrada,
amostras = 20,
coleta;
for ( coleta = 1; coleta <= amostras; coleta++ ) {
temperatura = analogRead( 0 );
temperatura = (5 * temperatura * 100) / 1024;
media = media + temperatura;
delay(500); // pausa entre as coletas
}
temperatura = media / amostras;
registrada = EEPROM.read( 0 );
Serial.print("Temperatura media = \t");
Serial.print( temperatura );
Serial.print("\tMaxima Anterior Registrada = \t");
Serial.println( registrada );
if ( temperatura > registrada || registrada == 255 ) {
// o valor padrao para uma posicao ainda nao gravada = 255
EEPROM.write( 0, temperatura);
}
}

Estou tendo bom aproveitamento através destas aulas bem esclarecedoras…
muito bom mesmo 😀
Obrigadissimo.
Muito eu estava precisando dessa aula…
Parabens pessoal.