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.