Come utilizzare Arduino EEPROM per salvare i dati tra i cicli di alimentazione

Come utilizzare Arduino EEPROM per salvare i dati tra i cicli di alimentazione

Sapevi che Arduino può memorizzare dati quando è spento? Non lo schizzo archiviato nella memoria flash. Sto parlando di dati variabili nella EEPROM. Unisciti a me mentre ti mostro come leggerlo e scriverci sopra e cosa può fare per i tuoi progetti.





Se non conosci Arduino, assicurati di dare un'occhiata al nostro guida per principianti .





Che cos'è l'EEPROM?

EEPROM sta per memoria di sola lettura programmabile cancellabile elettricamente . È un tipo di memoria non volatile. Non preoccuparti se non capisci cosa significa tutto questo. Memorizza semplicemente i dati anche con l'alimentazione rimossa (a differenza di RAM , che necessita di elettricità per conservare i dati).





La EEPROM è integrata in una miriade di processori, come l'FPGA (field-programmable gate array) utilizzato nel Matrix Creator Pi HAT. Tutti gli Arduino hanno EEPROM disponibile, ma la capacità varia in base al modello. Assicurati di dare un'occhiata alla nostra guida all'acquisto per maggiori dettagli su ciascuna scheda.

Come funziona?

La EEPROM viene cancellata elettricamente e programmata utilizzando Tunnel di Fowler-Nordheim . Non è necessario conoscere i dettagli tecnici per poterlo utilizzare. La premessa di base è che l'elettricità viene utilizzata per modificare i dati binari (cos'è binario). Può essere letto, cancellato e riscritto elettronicamente.



Fortunatamente, il Linguaggio Arduino rende facile modificare i dati, il tutto senza bisogno di una laurea in informatica.

Aspettativa di vita

Sebbene sia facile da usare EEPROM in Arduino, ha una durata limitata. La EEPROM è specificata per gestire 100.000 cicli di lettura/cancellazione. Ciò significa che è possibile scrivere e quindi cancellare/riscrivere i dati 100.000 volte prima che la EEPROM diventi instabile. In realtà, Atmel (i produttori del 'Chip' Arduino) i semiconduttori possono gestire un numero di cicli maggiore o minore, a seconda delle tolleranze di ogni singolo processore.





Una volta che una posizione è stata scritta e cancellata troppe volte, può iniziare a diventare inaffidabile. Potrebbe non restituire i dati corretti o restituire il valore da un bit adiacente.

Questo può sembrare un sacco di scritture, ma può essere facile raggiungere questo limite se si legge e si scrive in modo programmatico (in un ciclo continuo , Per esempio). La lettura dei dati non degrada il silicio, solo scrivere lo fa . Puoi leggere i dati dalla EEPROM quanto vuoi senza paura!





È importante notare che questo limite si applica a ciascuna posizione di memoria. Il tuo Arduino potrebbe avere 1.000 o più posizioni di memoria disponibili in EEPROM, quindi se scrivi troppe volte in una posizione, è solo quella posizione interessata e non nessuna delle altre. Più tardi parlerò livellamento dell'usura , che può ridurre l'usura della EEPROM distribuendo i dati in modo uniforme, cosa di cui gli SSD fanno uso.

A cosa serve?

EEPROM è incredibilmente utile per i tuoi progetti Arduino. Poiché ricorda i dati anche quando viene rimossa l'alimentazione, è possibile memorizzare lo stato di Arduino. Forse potresti costruire una torretta laser che ricordi la sua posizione o quante 'munizioni' sono rimaste. Puoi usarlo per controllare i tuoi elettrodomestici e registrare quante volte il tuo apparecchio è stato attivato.

EEPROM è più adatto per cose come impostazioni o punteggi più alti. Se vuoi scrivere regolarmente dati complessi, forse prendi in considerazione uno scudo ethernet (con slot SD integrato) o un Raspberry Pi .

Leggere e scrivere

Ora che la teoria è fuori mano, diamo un'occhiata a come leggere e scrivere alcuni dati! Innanzitutto, includi la libreria (questa viene fornita con l'IDE Arduino):

#include

Ora scrivi alcuni dati:

EEPROM.write(0, 12);

Questo scrive il numero 12 alla posizione EEPROM 0 . Ogni scrittura richiede 3,3 millisecondi ( SM , 1000 ms = 1 secondo). Nota come non puoi scrivere lettere ( char ), sono consentiti solo i numeri da zero a 255. Questo è il motivo per cui l'EEPROM è l'ideale per le impostazioni o i punteggi più alti, ma non altrettanto per i nomi dei giocatori o le parole. È possibile memorizzare il testo utilizzando questo metodo (è possibile associare ogni lettera dell'alfabeto a un numero), tuttavia sarà necessario disporre di più posizioni di memoria, una posizione per ogni lettera.

Ecco come leggere quei dati:

perché il mio messaggio non viene recapitato
EEPROM.read(0);

Zero è l'indirizzo a cui hai scritto in precedenza. Se non hai mai scritto a un indirizzo prima, restituirà il valore massimo ( 255 ).

Sono disponibili alcuni metodi leggermente più utili. Supponi di voler memorizzare una cifra decimale o una stringa:

EEPROM.put(2,'12.67');

Questo scrive i dati in più posizioni, qualcosa che sarebbe facile da scrivere da soli, ma comunque utile. Dovrai comunque tenere traccia di quante posizioni sono state scritte, in modo da non sovrascrivere accidentalmente i tuoi dati! Devi usare il ottenere metodo per recuperare nuovamente questi dati:

float f = 0.00f;
EEPROM.get(2, f);

Il valore di get è memorizzato nel float F variabile. Nota come questo viene inizializzato con 0.00f come il valore. Il F consente al compilatore di sapere che potresti voler memorizzare un numero elevato in questa variabile, quindi imposta alcune configurazioni aggiuntive durante la compilazione.

Il Documentazione EEPROM sul Sito web Arduino ha molti più esempi.

Livellamento dell'usura

Il livellamento dell'usura è una tecnica utilizzata per ridurre l'usura e aumentare la durata della EEPROM. Se stai lavorando solo su un piccolo progetto, potresti non doverti preoccupare di questo.

La cosa più semplice che puoi fare per preservare la vita della EEPROM è limitare le tue scritture a una posizione particolare. Puoi farlo leggendo prima l'indirizzo, e se il valore che vuoi scrivere è già presente, non c'è bisogno di scriverlo di nuovo (ricorda, la lettura dei dati non fa male). Ecco come lo faresti:

int safeWrite(int data, address) {
if(EEPROM.read(address) != data) {
EEPROM.write(address, data);
}
}

Questo è un po 'di codice piuttosto semplice, tuttavia funziona solo per numeri interi! Invece di reinventare la ruota, usa la funzione integrata nella libreria EEPROM di Arduino:

EEPROM.update(address, val);

Questo metodo ha esattamente la stessa firma del Scrivi metodo, sebbene possa ridurre drasticamente il numero di scritture necessarie!

Se hai bisogno di scrivere molti dati e sei preoccupato di consumare il silicio, puoi tenere traccia di quante scritture fai, anche se questo utilizza più dati. Ecco un'implementazione approssimativa in pseudocodice :

var address = 0
var writeCount = 0
if(writeCount > 75,000)
writeCount = 0
address += 1
EEPROM.write(address, data)

Dovrai memorizzare indirizzo e writeCount in EEPROM (e writeCount dovrà essere suddiviso tra le posizioni degli indirizzi). Nella maggior parte dei casi, questo livello di protezione non sarà necessario. Anche gli Arduino sono così economici, quindi potresti trovare più facile acquistare un backup!

Ora dovresti sapere abbastanza per realizzare dei progetti fantastici. Facci sapere se fai qualcosa di interessante! Riesci a riconoscere tutti i dispositivi nelle immagini? Lasciaci un commento qui sotto!

Condividere Condividere Tweet E-mail 5 suggerimenti per potenziare le tue macchine Linux VirtualBox

Stanchi delle scarse prestazioni offerte dalle macchine virtuali? Ecco cosa dovresti fare per aumentare le prestazioni di VirtualBox.

Leggi Avanti
Argomenti correlati
  • Fai da te
  • Arduino
  • Elettronica
Circa l'autore Joe Coburn(136 articoli pubblicati)

Joe si è laureato in Informatica presso l'Università di Lincoln, nel Regno Unito. È uno sviluppatore di software professionista e, quando non pilota droni o scrive musica, lo si trova spesso a scattare foto o produrre video.

Altro da Joe Coburn

Iscriviti alla nostra Newsletter

Iscriviti alla nostra newsletter per consigli tecnici, recensioni, ebook gratuiti e offerte esclusive!

Clicca qui per iscriverti