salve a tutti,
ho collegato un rtc ds3231 ad Arduino e tramite 3 tasti e un LCD sono riuscito a settare l'ora da tastiera;
fin qui, a parte qualche capata, tutto bene....
lo step successivo sarebbe quella di utilzzare laeeprom presente sullo shield del 3231 per memorizzare i dati (tuti di tipo float)
dopo qualche giorno di documentazione e 5-6 sketch sbagliati, n arrivato a scrivere
#include <Wire.h>
#define disk 0x57 // indirizzo eprom 24lc32
float a= 6.3; // dato che vorrei memorizzare
float Value;
int address=0; // cella da cui prtire
float finale;
union ScompF{ // devo scomporre il float in 4 singoli byte
float Dato;
byte bytef[4];
} Diviso;
byte f0 = 0;
byte f1 = 0;
byte f2 = 0;
byte f3 = 0;
void setup(){
Serial.begin(115200);
Wire.begin();
}
void loop()
{
eepromWriteFloat(address, a);
Value = eepromReadFloat(address);
Serial.println(finale);
delay(1999);
}
void eepromWriteFloat(int address, float Value) //scrivo
{
Diviso.Dato = Value;
f0 = Diviso.bytef[0];
f1 = Diviso.bytef[1];
f2 = Diviso.bytef[2];
f3 = Diviso.bytef[3];
Wire.beginTransmission(disk);
Wire.write((int)(address >> 8));
Wire.write((int)(address & 0xFF));
Wire.write(f0);
Wire.write(f1);
Wire.write(f2);
Wire.write(f3);
Wire.endTransmission();
}
float eepromReadFloat(int address){ // leggo
Wire.beginTransmission(disk);
Wire.write((int)(address >> 8));
Wire.write((int)(address & 0xFF));
f0 = Wire.read(); // si leggono i byte
f1 = Wire.read();
f2 = Wire.read();
f3 = Wire.read();
Wire.endTransmission();
Diviso.bytef[0] = f0; // si ricompone il float
Diviso.bytef[1] = f1;
Diviso.bytef[2] = f2;
Diviso.bytef[3] = f3;
finale = Diviso.Dato;
return finale;
}
che, con mio stupore, compila correttamente ma dal seriale esce sempre lo stesso valore e cioe 'nan' (se ho capito bene not a number)
ora posto che ho letto e riletto i molti post sull argomento, nn riesco a capire dove sbaglio
qualcuno mi sa illuminare ?
Non noto errori particolarmente evidenti, a parte il fatto che fai un sacco di passaggi inutili. L'unica cosa che mi puzza un po' è quel cast a int dell'indirizzo, io farei un cast a byte, al massimo.
Salve,
Mi scusi una domanda strana. Potrebbe esserle comodo, per esempio, trattare i nuneri come array composti da cifre? Scrivere tali cifre in eeprom, usando magari un carattere separatore tra i vari numeri, e gestirli usando la libreria bignum (credo si scriva così). Personalmente non la ho mai usata, ma so che il suo scopo é operare su numeri sottoforma di array. Questo metodo richiede molto più spazio in memoria (che ammetto può essere un problema) ma semplifica la lettura, la scrittura, ed elude limiti in cifre
SukkoPera:
Non credo che l'errore fosse quello, era piuttosto quello che ha suggerito Claudio!
di certo quello era determinante;
ma l'ho provato e ho fatto un passo avati... da NAN a 0.00 il che mi ha fatto intuire che l'errore doveva essere ANCHE nella union e infatti qui qui astrobeed spiega la sintassi di union;
Questo codice inizializza solo il valore iniziale delle variabili, che tra l'altro sono solo di appoggio ed inutili, come hai intuito anche tu. Non lavorano direttamente sulla union, quindi non potevano causare il problema. Piuttosto è plausibile che Wire.read() ritorni 0 se prima non hai fatto Wire.requestFrom().