Controllo lettura EEPROM

Ciao!
Per il mio termostato ho fatto si che i setpoints vengano salvati nella EEPROM.
Funziona tutto ed è stato anche molto semplice (vuoi perché i setpoints li ho creati byte).
Volevo però implementare un controllo nel caso ci fosse qualche problema di lettura dalla EEPROM.
Qualcosa del tipo "se ottengo una lettura strana / non ottengo lettura " ---- > imposta valore di default.
Ho provato con if ( isnan(EEPROM.read(addr) ).
Ma anche al primissimo avvio, quando l'indirizzo address era vuoto, l'eeprom read ha restituito 255.
Ha senso quindi isnan? Oppure dovrei usare !EEPROM.read(addr) ?
Come controllare che la lettura EEPROM sia regolare?

// setting setpoints termostato via EEPROM
  if ( isnan(EEPROM.read(tSSRMinEEPROMaddrs)) ) { // se nella EEPROM non è archiviato nessun valore
    tSSRMin = 16;  // setto la temperatura di accensione a 16 °C
    Serial.println(F("Indirizzo EEPROM tSSRMin vuoto. Valore settato di default"));
  }
  else { 
    tSSRMin = EEPROM.read(tSSRMinEEPROMaddrs);  // altrimenti carico il valore dalla EEPROM.
    Serial.println(F("Valore tSSRMin settato da EEPROM"));
  }

ciao

il problema è capire cosa intendi per lettura "strana": anche se non hai mai scritto in un indirizzo di memoria nella EEPROM, questo conterrà un valore di "default": l'unica cosa che posso pensare è che tu abbia solo un certo range di valori ammissibili e quindi tu possa fare un confronto... es: se leggo 255 e il massimo set point è 100 vuol dire che c'è stato un problema

La funzione isnan(double x) serve per verificare se un valore float è un numero valido. NaN significa"Not a Number" e vale solo come verifica sulla validità del formato (rappresentazione) float di un numero.
Se i tuoi valori sono dichiarati byte, isnan() non va bene.

Ciao
QP

lucadentella:
il problema è capire cosa intendi per lettura "strana"

Ciao Luca :slight_smile:
Il problema è che non so, a priori, cosa intendere per lettura strana :slight_smile:
Ho già altri controlli di sicurezza, ad esempio se i bottoni fanno contatto e la temperatura di spegnimento del riscaldatore schizza a + 200 (con il rischio di uccidere tutte le piante) questa comunque viene ignorata perché superiore alla temperatura di sicurezza (24°C).
Quindi in altri punti ho già inserito il controllo che suggerisci tu.

Quello da cui volevo tutelarmi era proprio "un problema relativo alla eeprom".
Che ne so, la eeprom consente un massimo di 100.000 riscritture? alla 100.000 + 1 che succede?
Torna il valore di default? rimane l'ultimo valore? mi viene restituito un byte corrotto?

Volevo assicurarmi che il byte letto dalla eeprom fosse integro, c'è modo di fare ciò?

@QuercusPetraea pensavo che isnan funzionasse anche sui byte! Grazie!

  1. una qualsivoglia cella di una memoria EEPROM "vergine", ossia mai scritta, contiene in origine il valore $FF, cioè 255.
    Quindi, devi tenerne conto. Ti consiglio di inserire una voce nel tuo programma per permettere all'utente di "formattare" la memoria, ossia scriverci il valore di default che vuoi tu.

  2. il max numero di scritture non è un valore così preciso e definito. Non è che fino a 100.000 funziona, poi scade la garanzia ed a 100.001 non funziona più. Può capitare che ti possa durare fino a 110.000 come anche fino a 150.000. Diciamo che la media di scritture minime garantite dal produttore è 100.000.
    Dopo può succedere di tutto, può succedere che la cella non accetti più nessuna scrittura come anche che solo alcuni bit "saltino".

leo72:
ossia scriverci il valore di default che vuoi tu.

Se ho capito cosa intendi, si c'è già.
Con il tastierino aumento o diminuisco le variabili di set point ed ogni ciclo viene fatto un controllo.
Se il valore contenuto in eeprom è diverso da quello che ha inserito l'utente, il valore in eeprom viene sovrascritto con quello scelto dall'utente.

// aggiornamento dati in EEPROM
    if (tSSRMin != EEPROM.read(tSSRMinEEPROMaddrs)) { // se la tSSRMin è diversa dal valore in EEPROM
      EEPROM.write(tSSRMinEEPROMaddrs, tSSRMin); // significa che è stata modificata, quindi aggiorna il valore in EEPROM
      Serial.print(F("Valore EEPROM tSSRMin Aggiornato: "));
      Serial.println(EEPROM.read(tSSRMinEEPROMaddrs));
    }

Dopo può succedere di tutto, può succedere che la cella non accetti più nessuna scrittura come anche che solo alcuni bit "saltino".

Quindi, se non ho capito male, fondamentalmente NON c'è un controllo... ne ha senso implementarlo.
All'avvio carico i valori dalla eeprom e pace, mi confermi?