Buon pomeriggio ragazzi, sto crando un cronotermostato con arduino mega e sono arrivato al punto di dover salvare i vari dati in modo che in caso di riavvio non perdo tutto ogni volta.
Alcuni valori (come gli orari) sono in formato INT, altri (come i setpoint) sono FLOAT.
Visto che sono in possesso anche di scheda ethernet con sd, secondo voi sarebbe meglio salvare tutti i dati in una sd oppure nella eeprom?
Normalmente uso la EEPROM, ma la SD ha il grande vantaggio della portabilità: se si guasta la MEGA puoi sostituirla senza perdere i set point e le altre personalizzazioni.
Grazie per la risposta.. Hai ragione, avevo pensato a questo discorso..
Eventualmente? se decidessi di usare la eeprom puoi consigliarmi come fare per salvate i.. .. float? Ho trovato una marea di esempi però mi sembrano tutti piuttosto macchinosi.. Oppure anche una libreria da utilizzare..
Purtroppo mi sono fermato ancor prima di iniziare! Ho copiato la cartella della libreria EEPROMex nella cartella di arduino, ho dichiarato #include <EEPROMex.h> ma mi dà questi errori e non riesco a venirne a capo.
Stdlib\EEPROM.cpp.o: In function eeprom_read_byte': i:/arduino-1.0.5-r2/hardware/tools/avr/lib/gcc/../../avr/include/avr/eeprom.h:197: multiple definition of EEPROM'
EEPROMEx\EEPROMex.cpp.o:(.bss.EEPROM+0x0): first defined here
i:/arduino-1.0.5-r2/hardware/tools/avr/bin/../lib/gcc/avr/4.3.2/../../../../avr/bin/ld.exe: Disabling relaxation: it will not work with multiple definitions
i:/arduino-1.0.5-r2/hardware/tools/avr/bin/../lib/gcc/avr/4.3.2/../../../../avr/bin/ld.exe: Warning: size of symbol `EEPROM' changed from 2 in EEPROMEx\EEPROMex.cpp.o to 1 in Stdlib\EEPROM.cpp.o
Con queste librerie, se io includo la EEPROMex l'errore che ho riportato sopra mi viene fuori sempre, se io tolgo SPI, Ethernet, EthernetUdp l'errore non mi si presenta più (però in questo caso devo aggiungere la libreria Wire altrimenti mi ritorna un errore dicendomi che manca).
Qualcuno sa come mai può succedere una cosa come questa?
mah.. ometterei la libreria eprom ,
trasformerei i float in int moltiplicandoli es x 100
farei modulo 10 (%) per ricavare le singole cifre
poi memorizzo una cifre per memoria
Rieccomi qua, finalmente ho avuto un minuto libero per fare qualche prova..
Con la libreria EEPROMex è un casino, a parte il discorso che non avrei potuto utilizzare l'ethernet per qualche motivo che non ho capito, la scrittura e lettura dei dati mi dava problemi, mi uscivano valori assurdi..
Alla fine ho lasciato perdere e ho seguito più o meno il consiglio di elrospo usando due indirizzi di memoria (uno per gli interi e l'altro per i decimali), e uso la libreria eeprom "standard".
Un esempio al volo se può tornare utile a qualcuno:
SCRITTURA
if (SPCronoSala1 != temp_SPCronoSala1) { //controllo se ho valori diversi altrimenti non sovrascrivo
SPCronoSala1x100 = (SPCronoSala1 * 100);
EEPROM.write(17, highByte(SPCronoSala1x100));
EEPROM.write(18, lowByte(SPCronoSala1x100));
}
Se usai 2 byte, stai salvando dati di tipo integer, attento però che i valori che possono memorizzare gli integer vanno da -32768 a +32767 e basta.
Se i numeri sono più grandi, vai in overflow quando moltiplichi il tuo float per 100. Forse dovresti usare un long, che ha 4 byte di capacità e milioni di valori gestibili.
leo72, chiedo scusa per il ritardo sono stato un po' latitante ultimamente.
Ti ringrazio per la precisazione, alla fine io memorizzerò setpoint di temperatura di stanze, quindi moltiplicandoli per 100 difficilmente supererò i 2500, comunque grazie davvero, farò tesoro di questa cosa se mai mi capiterà un discorso come quello che dici