Memorizzare più dati nella eeprom

Allora ragazzi vi espongo il problema, cercavo di risolverlo nell'altro topic delle porte A4 e A5, ma voglio chiederlo a tutti! Praticamente devo memorizzare nella eeprom di arduino i valori massimi e minimi di temperatura e la raffica massima per ora... quando stacco la corrente devono essere memorizzati, però non riesco a far funzionare il programma che ho usato, perché la massima la memorizza ma la minima mi segna ovf e la raffica nan... Oltre questo volevo sapere se quando stacco la corrente alle 10 di sera per esempio e siccome ho l rtc l'orario rimane, poi se rimetto la corrente il giorno dopo, vorrei che le massime e minime si resettassero, e non che mi segnassero quelle del giorno dopo soltanto perché l'if lo legge quando c'è la corrente...magari devo salvare anche il giorno prima nella eeprom e confrontarlo con il giorno attuale?
Lo sketch in allegato...

TX20___DS18B20___DHT22___DISPLAY.ino (13.4 KB)

Nessuno sa qualcosa a riguardo?...

int eeAddress1 = 0;
int eeAddress2 = 4;
int eeAddress3 = 2;

Cioè solo se metto così fa... qualcuno sa il perché?...

Ho aggiustato così questa stringa, che avevo già aggiustato ma non so perché ma non si era salvata...

 if (giornoSalvato != day()) 
  {
    giornoSalvato = day();
    maxeeprom=sensors.getTempCByIndex(0);
    mineeprom=sensors.getTempCByIndex(0);
  EEPROM.put (eeAddress1, maxeeprom);
  EEPROM.put (eeAddress2, mineeprom);

Comunque non centra niente questo... Mi fa solo mettendo gli address in quel modo, sto cercando di capire perché ma è impossibile... poi sarà un problema se fa così quando devo memorizzare anche il pluviometro tipo...
Rimetto lo sketch aggiornato

TX20___DS18B20___DHT22___DISPLAY.ino (13.4 KB)

A Questo punto per fare un lavoro pulito useró l sd dell ethernet quando l avró, per memorizzare questi dati

Allora riprendo questo topic, tempo fa guglielmo mi aveva detto di guardare l avr, però ci ho capito poco... Ho da poco arduino mega e sto cercando di far funzionare la memorizzazione dei dati, qualcuno sa darmi una mano? Pubblico tutto lo sketch che per ora utilizzo

prova_eeprom.ino (15.7 KB)

Il tuo sbaglio e di voler fare tutto assieme ...
... se devi usare una cosa che NON consci, prendi gli esempi dell'IDE dove usa SOLO la EEPROM e ti studi quelli così da vedere il suo uso isolato da tutto il resto.

Capito come funziona, applicarla poi in un programma di maggior dimensioni non dovrebbe essere un problema.

Guglielmo

P.S.: Non ricordo se te l'ho già dato, comunque, in allegato un documento sull'uso della EEPROM.

EEPROM.pdf (181 KB)

Che poi il problema si è presentato con il put e get, con il read e write non avevo avuto problemi... comunque proverò a memorizzare da soli dei dati, perché adesso con la mega qualsiasi indirizzo che metto mi dà "nam"... ti farò sapere grazie :wink:

Hai guardato gli esempi relativi solo a put e get ?

E comunque ...
... invece di usare quella Classe (C++) impara ad usare le funzioni della AVR libc (puro C) che ti ho indicato :wink:

Guglielmo

Francamente in questo caso non ne vedo il motivo, la libreria EEPROM funziona molto bene ed è molto comoda per salvare oggetti di dimensioni arbitrarie.

Non vedo perché usare funzioni di più basso livello per reimplementare quelle di alto già esistenti e debuggate.

SukkoPera:
Non vedo perché usare funzioni di più basso livello per reimplementare quelle di alto già esistenti e debuggate.

... sarà il caso che te la vai a leggere :wink: ... potresti avere delle sorprese ... e prova a vedere la classe EEPROM cosa usa al suo interno ... creando solo un inutile passaggio in più (... ed un appesantimento del codice) !

Guglielmo

Comunque utilizzando sempre la eeprom.h, ho utilizzato lo sketch clear e poi rimesso quello che ho postato e adesso me li segna i valori ! Non so nemmeno perché, l'unica è la minima eeprom che non so perché ma mi segna sempre 0

Comunque devo impararmi per forza quella che dici... anche se non ci sono abituato al C xd perché poi dovrò praticamente memorizzare nella eeprom una trentina di valori e passa... e potrei avere problemi con la h

@gpb: Nella libc c'è eeprom_write_block() (ed eeprom_write_float() che forse in questo caso basterebbe, oltre alle relative funzioni di lettura ed aggiornamento) che è sicuramente sufficiente a fare quel che serve, siamo d'accordo. Ma richiede che si abbia un po' di dimestichezza con i puntatori e sizeof(), che non tutti hanno. Inoltre c'è il discorso di fare update() invece di write(). Sono d'accordo con te che ad un certo punto si debba andare "oltre", ma per il livello a cui si trova As_Needed (senza offesa :slight_smile: ), mi sembra un po' precoce, per cui credo che EEPROM.h sia più adatta a lui.

@As_Needed: Come suggerito, fai uno sketch in cui fai solo letture e scritture. Se ancora non va, postalo per intero, non c'è motivo per cui non debba funzionare, ti garantisco che si possono leggere e scrivere cose ben più complesse in EEPROM :).

... ahhhh ... se dedicaste un po' di tempo a leggere i documenti che vi allego, scoprireste come la <avr/eeprom.h> in realtà vi semplifichi la vita:

Esempio della dichiarazione delle variabili da mettere in EEPROM, senza preoccuparsi di dove vengono messe:

uint8_t  EEMEM EEnoOfTel;       // variabile di un byte
uint8_t  EEMEM EEuserPsw[10];   // array di 10 bytes
uint8_t  EEMEM EEtelID[5][10];  // 5 array di 10 bytes

... esempio di lettura :

noOfTel = eeprom_read_byte (&EEnoOfTel);
eeprom_read_block(userPsw, &EEuserPsw, 10);
eeprom_read_block(telID[i], &EEtelID[i], 10);

... esempio di scrittura:

eeprom_write_byte(&EEnoOfTel, 5);
eeprom_write_block(userPsw, &EEuserPsw, 10);
eeprom_write_block(telID[i], &EEtelID[i], 10);

Non mi sembra così complesso, anzi ... mi sembra molto più facile :grin:

Guglielmo

Proveró tutto :smiley: comunque invertendo l indirizzo eeaddress1 con il 2 fa... questi sono misteri per me xd per voi invece?

@gpb: Mi duole ma no, a me non sembra più facile, mettendomi nei panni di uno che non hai mai visto quella '&' prima! E poi, voglio dire, credi che nessuno abbia la tentazione di fare semplicemente:

EEnoOfTel = 100;

? Ti ricordo che 9 arduinisti su 10 non riescono ad afferrare la complicatissima logica dietro all'utilizzo di millis()...

Infine, Arduino non è solo AVR! Se dovessi portare quel codice su una Due, su una Zero, su una Teensy, su un ESP8266... compilerebbe?

SukkoPera:
Infine, Arduino non è solo AVR! Se dovessi portare quel codice su una Due, su una Zero, su una Teensy, su un ESP8266... compilerebbe?

... non compilerebbe neanche la EEPROM.h (che usa avr/eeprom.h) ... quindi ...

Oh .. volete complicarvi la vita ed appesantire il codice con delle inutili classi ? fate pure ...
... a me non cambia nulla eh ! :smiling_imp:

Guglielmo

gpb01:
... non compilerebbe neanche la EEPROM.h (che usa avr/eeprom.h) ... quindi ...

Oh .. volete complicarvi la vita ed appesantire il codice con delle inutili classi ? fate pure ...
... a me non cambia nulla eh ! :smiling_imp:

Guglielmo

Veramente io il codice vero voglio farlo con l'altra :smiley: quindi vedrò di provarci e riuscirci xd onestamente anche se non ci sono abituato mi pare un lavoro più pulito quello della avr!
In ogni caso oltre questo problema devo aprire un altro topic per un problema che è insorto con l sd....

gpb01:
... non compilerebbe neanche la EEPROM.h (che usa avr/eeprom.h) ... quindi ...

Forse non ci siamo capiti. Se usi un core per una diversa piattaforma col supporto EEPROM, puoi attenderti che EEPROM.get() e compagnia siano state portate e funzionino. Se includi manualmente avr/eeprom.h invece dovrai farti il porting da solo.

gpb01:
Oh .. volete complicarvi la vita ed appesantire il codice con delle inutili classi ? fate pure ...
... a me non cambia nulla eh ! :smiling_imp:

Ma allora buttiamo via tutta la libreria di funzioni di Arduino e usiamo solo la AVR libc, no? Io condivido il tuo punto di vista in parte, solo sono convinto che una scelta del genere vada fatta da chi è già ad un certo livello, conscio di cosa guadagna (velocità, risparmio RAM/flash, ecc) e di cosa perde (semplicità, portabilità).

Sono d'accordo sukko con quello che dici. Alla fine come hai detto prima per il mio livello è più comoda la eeprom h, ma una volta capiti i meccanismi della avr è una cosa in più che è meglio fare :wink: Io voglio provare per ora con la h e se proprio non riesco allora mi cimento nell avr che penso che questo lo farò comunque!