Libreria EEPROMex

Ciao a tutti, sto avendo problemi a salvare dei valori in EEPROM con questa libreria; riassumendo velocemente, salvo in EEPROM tre variabili, una è un array e due sono float con questo metodo:

int mia_var[12];
float var_float1,var_float2;

EEPROM.writeBlock(0x00,mia_var,12);
EEPROM.writeFloat(0x50,var_float1);
EEPORM.writeFloat(0x00+sizeof(mia_var),var_float2);

.......
//  poi le leggo
EEPROM.readBlock(0x00,mia_var,12);
var_float1=EEPROM.readFloat(0x50);
var_float2=EEPORM.readFloat(0x00+sizeof(mia_var));

mi scrive giusto tranne var_float1 che mi restituisce "nan".
Non capisco, ho provato sia con il mega che con il nano ma mi restituisce sempre nan...
AIUTO

C'è un motivo specifico per utilizzare quella libreria piuttosto che quella standard fornita da Arduino?
Con la libreria standard hai il metodi put e get che ti scrivono e leggono tutti i formati dei dati

Dici la libreria EEPROM.h???
Onestamente no...
Mi dai un link dove trovare spiegazioni di queste funzioni??
Ma salvi anche array bidimensionali?
Grazie

manolomao:
Dici la libreria EEPROM.h???
Onestamente no…
Mi dai un link dove trovare spiegazioni di queste funzioni??
Ma salvi anche array bidimensionali?
Grazie

Nel Reference ci sono spiegati tutti i metodi, ti allego anche un PDF per la gestione avanzata della EEPROM.

EEPROM.pdf (168 KB)

Ho seguito il tuo consiglio, ho messo la libreria EEPROM.h ma non capisco perchè solo quella variabile non me la carica (o scrive) in maniera corretta, leggo sempre "nan"...
Se volessi salvare un array bidimensionale posso usare lo stesso metodo??
tipo:

int lampada[2][5];

EEPROM.put(0x00,lampada); //per scrivere

EEPROM.get(0x00,lampada);//per leggere

non so più cosa pensare

Guarda non so cosa dirti, se guardi nell'esempio del reference della get viene letta una struttura con dentro un array quindi direi che anche un array bidimensionale viene gestito senza problemi, prova a mettere tutto il codice dello sketch magari c'è un errore nascosto che non ti salta all'occhio

Dimenticavo, all’inizio

#include <EEPROM.h>

o

#include <avr/eeprom.h>

???

Se vuoi usare la libreria la prima, se vuoi i metodi a basso livello la seconda. Ti consiglio la prima per il momento

Concordo col mettere tutto col codice, perché "nan" tra gli interi non esiste, esiste solo tra i numeri floating point.

Sukkopera, infatti la variabile che leggo è una float (var_float1)...
Ma cosa sinifica nan?
Ho poi fatto un sizeof come segue:

byte dep_size=(sizeof(mia_var)+sizeof(var_float1)+sizeof(var_float2)+sizeof(var_int))

e mi restituisce 33, mentre io conto 34; cioè 24 byte per l'array,4+4 byte per le due float, e due per l'int.
Devo considerare anche lo 0, quindi da 0 a 33 (totale 34???)

manolomao:
Sukkopera, infatti la variabile che leggo è una float (var_float1)...
Ma cosa sinifica nan?
Ho poi fatto un sizeof come segue:

byte dep_size=(sizeof(mia_var)+sizeof(var_float1)+sizeof(var_float2)+sizeof(var_int))

e mi restituisce 33, mentre io conto 34; cioè 24 byte per l'array,4+4 byte per le due float, e due per l'int.
Devo considerare anche lo 0, quindi da 0 a 33 (totale 34???)

SukkoPera si riferiva al tuo esempio dell'array bidimensionale definito come int. Per sapere se il tuo conto è corretto sarebbe il caso di postare il codice perché senza saper il tipo di mia_var è difficile risponderti, così a naso comunque do ragione alla funzione sizeof :slight_smile:

Posta il codice reale che stai usando completo, per favore.

E nota che con EEPROM.get() e .put() non serve alcun sizeof.

Ok, appena riesco lo metto, ma nel frattempo ho visto che su arduino uno gira tutto bene, sul mega idem e sul nano no, mi da sempre nan...ma che diavolo è nan???
Per intenderci, nel calcolo del sizeof la variabile mia_var è un array, più precisamente mia_var[12].
Con EEPROM.put posso mettere un array bidimensionale? (tipo mia_var [2][5]).
Sukkopera, volendo scrivere consecutivamente le variabili, come faccio a dare l'indirizzo di dove posizionarsi, se non dicendo la grandezza precedente??
Grazie per l'aiuto

manolomao:
Ok, appena riesco lo metto, ma nel frattempo ho visto che su arduino uno gira tutto bene, sul mega idem e sul nano no, mi da sempre nan...ma che diavolo è nan???

Così di primo impatto ti direi che se il tuo codice gira bene sulle altre schede, forse la parte di eeprom del nano potrebbe essere danneggiata, prova a spostare forzatamente la scrittura/lettura della eeprom su altre locazioni (Es. dalla 00 sposti tutto in avanti del doppio delle dimensione massima chessò farti da 50) e riprova a vedere il risultato se una o più celle di eeprom sono danneggiate leggendo/scrivendo su altre dovrebbe funzionare anche sul nano

[Edit]
Nan sta per Not a number
[/Edit]

Risolto,grazie dell'aiuto...
Ho utilizzato la libreria EEPROM, poi ho proveeduto o cancellare l'intera memoria e poi ho iniziato a scrivire e leggere...tutto gira alla perfezione.
Volevo solo chiedervi un'ultima cosa, avete parlato che non serve sizeof per determinare l'indirizzo di dove scrivere e leggere, dovendo memorizzare diverse variabili in diversi formati, come fa a sapere esattamente dove sono memorizzati se non gli dico l'indirizzo???
Grazie.

Non serve il sizeof per le funzioni get e put, altre funzioni necessitano della sizeof. Chiaramente ti serve per sapere quanto spazio occupa in memoria e sapere quindi l'indirizzo da utilizzare per le informazioni successive.
In alternativa puoi seguire la metodologia spiegata nel pdf che ti ho allegato alcuni post fa e li fa tutto il compilatore, ma è meno intiutiva della libreria che stai usando, quindi direi che se tutto ti funziona per quel che ti necessita usa il sizeof per sapere dove scrivere le varie informazioni e sei arrivato al tuo scopo

Grazie Fabpolli,per ora mi sta bene così, tanto ci pensa il compilatore e non "pesa" sulle risorse di Arduino.
Poi quando avrò del tempo ottimizzerò meglio il tutto.
Grazie dell'aiuto davvero.

manolomao:
Grazie Fabpolli,per ora mi sta bene così, tanto ci pensa il compilatore e non "pesa" sulle risorse di Arduino.

Giusto per correttezza la sizeof pesa sull'esecuzione del programma così come qualsiasi funzione/istruzione che la mcu deve eseguire, chiaramente in questo caso è assolutamente e completamente trascurabile il tempo necessario alla sua elaborazione.
Dalle virgolette ho capito che hai chiaro il concetto ma è a beneficio di chi in seguito potrebbe incontrare questa discussione

No, sizeof() viene valutata al momento della compilazione (a meno di casi piuttosto particolari), dunque in esecuzione è come una costante.

SukkoPera:
No, sizeof() viene valutata al momento della compilazione (a meno di casi piuttosto particolari), dunque in esecuzione è come una costante.

Anche nel caso di array di stringhe???