Lettura dato EEPROM non corretta

Ciao ragazzi, vado subito al problema, per ogni riavvio di arduino devo andare a leggere nell'EEPROM alcuni valori di byte per dopo convertirli in decimale facendo una semplice divisione. Durante il salvataggio non possiedo nessuna difficoltà ma nella lettura mi ritrovo il valore diminuito di una unità,ma quando rivado a memorizzare lo stesso valore di prima, al prossimo riavvio lo legge in modo corretto.

double valpresscost;    //valore pressione costante
double valpresscostimp; //valore pressione costante impostato


//lettura
 valpresscostimp = EEPROM.read(1);
valpresscostimp =valpresscostimp  /10;
//sub vari calcoli--------------------------------------------------------------------





//-----------------------------------------------------------------------------
//scrittura
  valpresscost = valpresscost * 10;
  valpresscostimp =  valpresscost;

  EEPROM.write(1, valpresscostimp);
  Serial.println(valpresscostimp);
  delay(15);

ciao fabio22,

scusa ma non ho ben capito il problema...puoi postare quale sarebbe il valore salvato e cosa invece ottieni alla prima lettura e a quella successiva?

Allora il valore che lui salva è ad esempio 52, quando lo vado a leggere lui la prima volta mi legge 51, successivamente rivado a salvare 52 e lui al prossimo riavvio mi legge 52. Questo vale per tutti i valori

Usa put() e get() al posto di write() e read().

Ciao grazie per la risposta, mi potresti spiegare la differenza ?
Mi da questo errore:

no matching function for call to 'EEPROMClass::get(int)'

Stai lavorando su dei double, che occupano 4 byte. EEPROM.read() e .write() lavorano su un byte solo.

Fai: EEPROM.get(1, value);

Stesso errore su una variabile intera

  lingua = EEPROM.get(0);

Ma hai letto quel che ho scritto???

Ho letto solo ora il seguente post https://www.arduino.cc/en/Reference/EEPROMGet
Con questa sintassi non ho più bisogno di convertirli in intero ?

ciao Fabio22,

allora come detto da SukkoPera con EEPROM.write() ed EEPROM.read() gestisci 1 byte, con il suo range di valore decimale da 0 a 255; tu stai utilizzando variabili di tipo double (4 bytes)...quindi con .get() e .put() leggi e scrivi tanti bytes quanti sono quelli indicati nella funzione...ed è più corretto visto il tipo di variabili in gioco.

Altra osservazione...stai usando delle double, che sono delle variabili float a doppia precisione, per maneggiare valori interi!?...puoi chiarirmi sto punto?

...mi sono dimenticato di scrivere un'altra cosa importante sulle variabili di tipo float (o double)...la loro aritmetica NON è così immediata come per le variabili di tipo int o boolean...prova ad eseguire il codice qui sotto e vedi per i due calcoli cosa ti ritorna il seriale (1==vero; 0==falso)...

double var;
double var2;
boolean trueORfalse;

void setup() {
Serial.begin(9600);
var=10.1;
var2=10.2;
trueORfalse=((var+var2)==20.3);
Serial.println(trueORfalse);

var=10.1*2;
var2=10.2;
trueORfalse=((var+var2)==30.4);
Serial.println(trueORfalse);
}


void loop() {

}

...non è che nel programma ci sia qualche operazione matematica od un cast che possono influire!?

ORSO2001:
... variabili di tipo float (o double) ...

... vi rammento che sugli Arduino basati su MCU AVR, float e double sono la stessa cosa, entrambi floating point a 32 bit e che la precisione è piuttosto scarsina:

Floats have only 6-7 decimal digits of precision. That means the total number of digits, not the number to the right of the decimal point. Unlike other platforms, where you can get more precision by using a double (e.g. up to 15 digits), on the Arduino, double is the same size as float.

Guglielmo

hai ragione.... :smiley:

Grazie ragazzi, con i vostri consigli ho risolto il problema.

ciao Fabio22,

se posso chiedere...qual'era il problema? come hai risolto?

Uttilizzando EEPROM.put e EEPROM.get lasciando le dovute celle libere... ad esempio quando salvo un double dovrò lasciare le 4 celle successive libere, se salvo un'intero dovrò lasciare 2 celle libere e per il byte solo una.

perfetto grazie! ... :smiley:

Grazie a voi per la disponibilità :slight_smile: