CONTENUTO ►
La memoria EEPROM di Arduino consente di salvare dati importanti durante l’esecuzione del programma, come le impostazioni di sistema. Tutte le informazioni saranno salvate anche in caso di spegnimento o riavvio del microcontrollore, perché la memoria non è volatile. Vediamo come lavorare con la memoria EEPROM di Arduino con esempi di scrittura e lettura di diversi tipi di dati utilizzando i comandi della libreria standard EEPROM.h Arduino.
Per questa attività sono necessari:
- Arduino Uno / Arduino Nano / Arduino Mega
Memoria non volatile EEPROM di Arduino
Memoria EEPROM (Electrically Erasable Programmable Read-Only Memory) di Arduino è un dispositivo di memoria permanente che può conservare i dati scritti per decenni dopo un’interruzione di corrente. La memoria EEPROM può essere riscritta diverse centinaia di migliaia di volte a una temperatura di almeno 24°C e la lettura dei dati è illimitata. La capacità di memoria EEPROM delle schede Arduino più diffuse è la seguente:
- ATmega168 (scheda Arduino Nano) – 512 byte
- ATmega328 (scheda Arduino Uno, Arduino Nano) – 1 Kbyte
- ATmega1280, ATmega2560 (scheda Arduino Mega) – 4 Kbyte
Occorrono circa 3,3 µs per scrivere un byte nella EEPROM e circa 0,4 µs (microsecondi) per leggere un byte. Ogni byte (cella) della EEPROM di Arduino ha come valore predefinito 255 (cioè una cella che non è mai stata scritta). Si noti che se i dati occupano uno spazio maggiore di 1 byte (ad esempio, un numero maggiore di 255), vengono suddivisi in più celle. Questo è un aspetto importante da considerare quando si scrivono grandi numeri nella EEPROM.
Comandi della libreria EEPROM.h di Arduino
Funzione |
Descrizione |
read() |
EEPROM.read(address) Legge un byte dalla EEPROM all’indirizzo address |
write() |
EEPROM.write(address, value) Scrive un byte di valore nella EEPROM all’indirizzo address |
update() |
EEPROM.update(address, value) Simile a write(), ma i nuovi dati vengono scritti nella cella solo quando differiscono da quelli già scritti. L’uso di questa funzione prolunga la durata della memoria EEPROM. |
get() |
EEPROM.get(address, data) Legge qualsiasi tipo di dati dalla EEPROM di Arduino all’indirizzo specificato address. I dati possono essere di qualsiasi tipo, ad esempio int o float |
put() |
EEPROM.put(address, data) Scrive qualsiasi tipo di dati nella EEPROM all’indirizzo address. La funzione scrive solo dati diversi nella cella |
EEPROM[] |
EEPROM[address] Consente di trattare i byte della EEPROM come un array. I byte possono essere letti e scritti |
Programma Arduino per la scrittura di EEPROM (write)
#include "EEPROM.h" void setup() { Serial.begin(9600); EEPROM.write(0, 100); delay(2000); Serial.println(EEPROM.read(0)); Serial.println(EEPROM[0]); } void loop() { }
Spiegazione del codice per la scrittura di memoria EEPROM (write):
- la funzione EEPROM.write() sovrascrive ogni volta i dati nella cella con indirizzo 0, il che riduce il ciclo di vita della memoria, quindi è meglio usare EEPROM.update().
Programma Arduino per la pulizia di EEPROM (update)
#include "EEPROM.h" void setup() { Serial.begin(9600); EEPROM.update(0, 100); delay(2000); Serial.println(EEPROM.read(0)); Serial.println(EEPROM[0]); } void loop() { }
Spiegazione del codice per la pulizia di memoria EEPROM (update):
- le funzioni di scrittura/lettura/aggiornamento consentono solo il tipo di dati byte e non possono essere utilizzate per float o int. A tale scopo, utilizzare le funzioni put/get.
Programma Arduino per la lettura di EEPROM (read)
#include "EEPROM.h" int address; byte value; void setup() { Serial.begin(9600); Serial.println(EEPROM.length()); delay(3000); while (address < EEPROM.length()) { value = EEPROM.read(address); Serial.print("Address: "); Serial.print(String(address)); Serial.print(", value: "); Serial.println(String(value)); address++; delay(100); } } void loop() { }
Spiegazione del codice per la lettura di memoria EEPROM (read):
- la funzione EEPROM.length() indica il numero totale di celle della memoria. Se si lavora con un ATmega168 Nano, il ciclo terminerà a 512 celle;
- se la memoria non è stata utilizzata, tutti i valori nelle celle saranno 255.
Dimostriamo come scrivere un numero superiore a 255, ad esempio 999, nella EEPROM di Arduino. Quando viene scritto nella EEPROM del microcontrollore, il numero 999 viene diviso nel moltiplicatore (byte alto) e nel numero mancante (byte basso), occupando due spazi nella memoria non volatile (cioè 999 = 3×256 + 231). Per visualizzare il numero memorizzato sulla monitor seriale dell’IDE Arduino, è necessario “assemblarlo” utilizzando la funzione word().
Esempio di utilizzo della EEPROM per scrivere int
#include "EEPROM.h" int num = 999; byte hi = highByte(num); byte low = lowByte(num); void setup() { Serial.begin(9600); EEPROM.update(1, hi); EEPROM.update(2, low); delay(1000); byte val1 = EEPROM.read(1); byte val2 = EEPROM.read(2); Serial.println("highByte - " + String(val1)); Serial.println("lowByte - " + String(val2)); int NUM = word(hi, low); Serial.println("int num - " + String(NUM)); } void loop() { }
Spiegazione del codice per utilizzo EEPROM per scrivere int:
- il problema principale della memorizzazione di numeri grandi è quello di non sovrascrivere accidentalmente la cella corretta con le nuove informazioni. A tale scopo, si tiene conto della dimensione dei dati da memorizzare utilizzando le funzioni EEPROM.put() e EEPROM.get().
Conclusione. Per cancellare la memoria EEPROM non volatile di Arduino e riportarla alle impostazioni di fabbrica, è necessario sovrascrivere tutte le celle di memoria con il valore 255. A tale scopo si può utilizzare un ciclo for o while. Un semplice esempio di programma di cancellazione EEPROM per Arduino è mostrato qui sopra. Se avete domande sulla EEPROM di Arduino, lasciatele nei commenti a questo articolo.
Lascia un commento