In realtà, come detto, basta implementare una qualche tecnica di wear-leveling per aumentare di gran lunga la durata delle EEPROM in questione.

Supponiamo di memorizzare i kWh impiegati in un numero in virgola fissa a 32 bit (ovvero, in un intero a 32 bit che invece di contare i kWh conta i decimi di kWh); ad ogni incremento una volta su 256 va a cambiare solo il byte meno significativo (in codifica big-endian), mentre tutti gli altri byte restano fermi dove stanno. D'altra parte, il contatore diventa inutilizzabile non appena una qualunque delle celle di memoria si rompe - cella che con ogni probabilità sarà quella usata per il byte meno significativo, visto che è sottoposta ad usura molto maggiore rispetto alle altre.

Possiamo riequilibrare la situazione sfruttando gli altri byte della EEPROM: se anche abbiamo solo 256 byte di EEPROM (come gli AVR scrausi impiegati negli Arduino), possiamo usare i primi 3 byte per memorizzare l'inizio del nostro contatore, e i restanti 253 a rotazione per il byte meno significativo (o qualcuno di meno se ci sono anche altri dati da memorizzare; l'importante è che i byte in questione siano meno di 256). Ad ogni nuova misura, i primi tre byte vengono riscritti solo se sono cambiati, mentre il quarto byte viene memorizzato a rotazione in una delle celle successive (come in un ring buffer).

Il puntatore alla posizione corrente del ring buffer può stare in memoria volatile, infatti al riavvio il contatore può individuare immediatamente la posizione a cui era arrivato: dato che le celle usate per il byte meno significativo sono meno di 256, basta individuare il punto del ring buffer in cui c'è una discontinuità nella numerazione (per questo è necessario che le celle siano meno di 256, altrimenti non sarebbe possibile individuare il punto in maniera univoca, o non individuarlo punto nel caso con n=256).

---

Si possono anche inventare schemi alternativi, forse anche migliori:
  • se si può individuare con precisione quando una cella di EEPROM è morta (si può fare una verifica rapida provando a rileggere i dati appena scritti e vedere se coincidono, ma verificare se la cella è in grado di mantenere i dati a lungo non alimentata è molto più complesso), si può impostare uno schema di rilocazione, un po' come fanno i dischi fissi con i settori danneggiati; i primi 4 byte della EEPROM fungono da puntatori alle celle di memoria da impiegare per i 4 byte dell'intero da memorizzare; quando il programma vede che una cella è morta, individua la successiva cella libera (basta prendere il max+1 dei byte-puntatori), scrive lì il dato e aggiorna il byte-puntatore perché punti alla nuova cella;
  • altrimenti, ci si può fidare delle specifiche del costruttore; il primo byte della EEPROM farà da puntatore per la posizione in cui viene memorizzato il byte meno significativo (ovvero quello più soggetto ad usura); ogni 100'000/1'000'000/quelcheè di scritture (numero che già abbiamo, visto che corrisponde al numero memorizzato in memoria) il programma passa ad usare un altro byte della EEPROM, memorizzandone la posizione nel primo byte.


A tutto questo si può aggiungere quel che dicevo prima - ovvero, scrivere effettivamente i dati solo quando se ne va la corrente; esistono diversi metodi per rilevare rapidamente la caduta di tensione sul circuito di alimentazione, mantenendo alimentato il microcontrollore con un condensatore o una batteria tampone giusto per il tempo necessario per scrivere i dati in EEPROM. A questo punto, il numero di scritture in EEPROM diventa estremamente ridotto (1 per ogni volta che viene tagliata l'alimentazione, più eventualmente una ogni tanto per sicurezza), e il problema di usura delle celle risulta trascurabile.