EEPROM una memoria non volatile

L’ EEPROM è un tipo di memoria non volatile che consente di scrivere e cancellare i dati utilizzando una tensione elettrica.

Possono essere riscritte un numero limitato di volte, di solito tra 100.000 e 1.000.000 volte, a seconda del dispositivo, per questo motivo è consigliabile evitare scritture a loop.

Sono comunemente utilizzati in sistemi embedded in cui è necessario memorizzare piccole quantità di dati  e  dove non è  necessario aggiornarli frequentemente.

L’EEPROM è stata sviluppata come sostituto delle memorie EPROM e PROM, entrambe con limitazioni.

La PROM può  essere scritta una sola  volta, mentre,  EPROM può essere riutilizzata, ma per essere cancellata deve essere esposta alla luce ultravioletta e questo processo richiede  diverse ore.

L’EEPROM, ha risolto molti delle problematiche delle memorie EPROM e PROM.

La EEPROM può essere cancellata e riscritta in modo elettrico e il processo è relativamente veloce.

Inoltre, i chip EEPROM sono piccoli, a basso consumo e possono essere integrati in una varietà di dispositivi, come i microcontrollori.

Sul microcontrollore ESP32  non è  stata integrata una memoria EEPROM ma c’è un emulatore di  EEPROM che consente di memorizzare i dati in una sezione specifica della memoria flash che funge da EEPROM virtuale.

Pertanto,  è possibile  utilizzarla nei nostri progetti per memorizzare variabili che devono essere uttilizzate anche dopo un riavvio del sistema, per esempio variabili di configurazione.

È importante notare che anche  la memoria EEPROM emulata sull’ ESP32 ha un numero limitato di cicli di scrittura, poiché utilizza parte della memoria FLASH che ha anch’essa un numero limitato di scritture.

La memoria interna, EEPROM emulata, può memorizzare 512 valori compresi tra 0 e 255 oppure 128 indirizzi IP.

Figura 1

Utilizzo della libreria EEPROM per la scrittura e lettura di dati sull’ESP32

In questo sketch si utilizza la libreria EEPROM per scrivere e leggere dati dalla memoria EEPROM dell’ESP32.

#include <EEPROM.h>

#define EEPROM_SIZE 12
void setup() {
 	
 	Serial.begin(115200);
 	
 	//Inizializziamo l'EEPROM
 	EEPROM.begin(EEPROM_SIZE);
 	//Write data 
 	int address = 0;
 	int data = 18;
 	EEPROM.write(address, data);
 	address += sizeof(data); 
 	float param = 26.5;
 	EEPROM.writeFloat(address, param);/
 	EEPROM.commit();
 	
 	address = 0;
 	int lettura;
 	lettura = EEPROM.read(address); 
 	Serial.print("leggi = ");
 	Serial.println(lettura);
 	address += sizeof(lettura); 
 	float variabile_float;
 	EEPROM.get(address, variabile_float); 
 	Serial.print("Read param = ");
 	Serial.println(variabile_float);
 	EEPROM.end();
}
void loop() {}

Codice completo, di seguito descrivo le principali istruzioni.

#define EEPROM_SIZE 12

E’ una direttiva del preprocessore che definisce una costante chiamata “EEPROM_SIZE” con un valore di 12.

Questa costante viene utilizzata per specificare la dimensione della memoria EEPROM che verrà utilizzata nello sketch.

Ciò significa che la quantità massima di dati che possono essere memorizzati nella EEPROM è 12 byte.

EEPROM.begin(EEPROM_SIZE);

Questa funzione inizializza la memoria EEPROM con la dimensione specificata (in questo caso la dimensione è definita dalla costante EEPROM_SIZE = 12) e la prepara per le operazioni di lettura e scrittura.

Deve essere richiamata prima di poter utilizzare qualsiasi altra funzione EEPROM.

EEPROM.write(address, data);

Il comando “EEPROM.write (address, data)”  scrive il  valore contenuto nella variabile  data all’indirizzo specificato  dalla variabile address.

address += sizeof(data);

Questa riga di codice aumenta il valore della variabile “address” della dimensione della variabile “data”. La funzione “sizeof” restituisce la dimensione in byte della variabile specificata.

In questo caso, la dimensione della variabile “data” viene aggiunta al valore corrente della variabile “address” per spostare l’indirizzo di memoria alla posizione successiva per la scrittura o lettura nella memoria EEPROM.

EEPROM.writeFloat(address, param);

Questa riga di codice scrive un valore a virgola mobile della variabile   “param”  nell’indirizzo che abbiamo calcolato  nell’istruzione precedente.

La scrittura di un valore a virgola mobile richiede più byte rispetto ai valori interi, quindi la funzione “EEPROM.writeFloat”  è stata scritta per memorizzare correttamente i dati nella memoria.

EEPROM.commit();

La funzione “EEPROM.commit()” scrive i dati dal registro temporaneo alla memoria EEPROM vera e propria, garantendo che i dati non vengano persi anche se l’ESP32 verrà spento.

EEPROM.get(address, variabile_float);

La funzione “EEPROM.get” legge il valore memorizzato nell’indirizzo specificato e lo assegna alla variabile “variabile_float”.

Questa funzione è simile alla funzione “EEPROM.read” ma con la differenza che “EEPROM.get” permette di leggere più byte contemporaneamente, poiché in questo caso dobbiamo leggere un valore float.

EEPROM.end();

Cancella semplicemente la cache locale.

Conclusioni

Se hai domande o curiosità riguardo al codice o al post, non esitare a contattarci tramite il modulo di contatto sottostante. Saremo felici di aiutarti!

Lascia una risposta

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Ti sei iscritto alla newsletter

There was an error while trying to send your request. Please try again.

Quattrodispositivi utilizzerà le informazioni fornite in questo modulo per restare in contatto con te e fornire aggiornamenti del sito