Dubbio scrittura EEPROM.

Ciao a tutti.
Ho un dubbio, e spero che qualcuno possa aiutarmi.
Fino ad ora nel mio progetto, sto scrivendo su EEPROM interna di arduino tante variabili che voglio salvare di entità diverse (float,int,byte,array di byte singoli e doppi).
LA mia domanda è:
esiste un modo per scriverli tutti insieme con un comando solo senza dover scriverle una alla volta?
E per leggerle tutte insieme?
Volendo fare la stessa cosa utilizzando una EEPROM esterna, cosa mi consigliate?

Grazie.

Vedi qua: https://forum.arduino.cc/index.php?topic=579582.msg4042219#msg4042219

(Non solo quel post, un po' tutto il thread, che sia per ESP c'entra poco)

SukkoPera il link non mi funziona.

Potresti crearti una struttura contenente tutte le tue variabili, e poi scrivere e leggere su eeprom con put e get.

torn24: SukkoPera il link non mi funziona.

se sei su un pc basta che dopo l'errore 404 cancelli i primi caratteri sbagliati prova questo: questo è quello che serve

SukkoPera, grazie... Non ho nessuna dimistichezza con la struct... Vediamo se ho capito

struct pippo {
  int a;
  byte b;
  float c;
  byte d[3][2];
  byte e[10];
};

struct int PIPPO;

void setup() {PIPPO.a = EEPROM.read(addr);.....}

poi per salvare

EEPROM.put(addr, PIPPO);

Potrebbe funzionare?? Come detto non so usare le struct.... Come tratto le singole variabili all'interno del programma una volta che le racchiudo nella struct? Posso richiamare dalla EEPROM tutto il blocco con EEPROM.get(addr,PIPPO);??? Ultima domanda: EEPROM.get e EEPROM.put è la libreria EEPROM.h per gestire EEPROM interna, volendo metterela esterna cosa consigli di fare? Utilizzare la wire o esiste qualcosa di meglio? Grazie per l'aiuto.

struct pippo {
  int a;
  byte b;
  float c;
  byte d[3][2];
  byte e[10];
};

Questo va bene. È la tua struct e puoi metterci quel che ti pare. Diciamo che dovresti usare nomi un po' più "parlanti" per i diversi membri ma vedi tu :).

struct int PIPPO;

Questo no... La tua struct si chiama pippo, quindi:

pippo PIPPO;
void setup() {PIPPO.a = EEPROM.read(addr);.....}

Erm, ma se fai così qual è il beneficio? Puoi leggere (e scrivere) tutta la struct in una volta:

EEPROM.get(addr, PIPPO);

Per usare i singoli membri basta metterci PIPPO. davanti, quindi PIPPO.a, PIPPO.b, ecc...

PS: Link fixato... Sto cavolo di bug del forum!

Ho postato in contemporanea a sukkoPera, altrimenti evitavo di postare :) Per usare la struttura nel programma, dovrai mettere nome struttura, il punto e poi il nome della variabile. Poi la usi come fosse una normale variabile sia per assegnarli un valore che per leggerlo.

struct pippo {
  int a;
  byte b;
  float c;
  byte d[3][2];
  byte e[10];
};

struct pippo PIPPO;

PIPPO.a=14;
PIPPO.e[2]=35;

:o Ragazzi, vi ringrazio... Ora provo di vedere come inserirla... SukkoPera, per salvare/richiamare la struct su EEPROM esterna, cosa consigli? Grazie

Torn24, grazie anche a te... una domanda sulla struct

struct pippo PIPPO;

Quello che non capisco è perchè bisogna prima nominare la struct (nel raggruppamento) e poi sel setup nominarla nuovamente con un altro nome... Ignoro...

La prima è la DEFINIZIONE della struct, ovvero dici com'è fatta, quali campi contiene, e definisci un nuovo tipo corrispondente. Stai quindi creando un nuovo tipo alla pari di int, float, char, ecc...

La seconda è una dichiarazione di una variabile del tipo della struct. Ovviamente puoi avere più variabili di quel tipo, esattamente come puoi avere tutti gli int, float, ecc che vuoi.

:) Grazie SukkoPera, credo di aver capito, spiegazione esaudiente!! PEr la parte della EEPROM esterna, cosa mi suggerisci?

Se uso la wire, posso fare uguale con la struct?? O non funziona??

Non c'è una risposta assoluta, dipende dalle funzioni che offre la libreria specifica che andrai a utilizzare. In ogni caso qualunque librerià offrirà la possibilità almeno di leggere/scrivere singoli byte e con quella in un modo o nell'altro ne puoi sempre uscire.

Io uso la wire perchè uso un display i2c; se puoi consigliarmi una libreria facile che faccia il caso mio... Altrimenti con la wire la vedo più complicata...

Fammi vedere un pezzo di codice che usi per scrivere, altrimenti non ci capiamo.

Ok Sukkopera, purtroppo per esigenze varie (famiglia e lavoro) i miei progetti li devo lasciare e riprendere…
Volevo chiedere un’altra cosa…
All’inizio per richiamare le variabili dalla EEPROM ed assegnare loor il valore, faccio una cosa del genere

EEPROM.get(0h00,a);
EEPROM.get(0h00+sizeof(a),b);
EEPROM.get(0h00+sizeof(a)+sizeof(b),c);........

dove a,b,c sono int byte float array.
A prescindere che potrei fare una struct (e ci sto lavorando), ed essendo che le variabili sono tutte in fila in spazi determinati, esiste un modo più veloce ed elegante di scrivere per evitare di ripetere tutte le volte sizeof ???
grazie

Sì: la struct.

Ah ecco....nessun altro modo vero?? Ma quando dovrò salvare singolarmente o richiamarla singolarmente (anche con la struct) come faccio a dire a che indirizzo si trova?? Faccio sempre sizeof ?? Inserisco l’indirizzo Preciso???

Tu leggi l'intera struct da EPROM in RAM all'inizio del programma, e poi ce l'hai sempre disponibile, non serve leggerla ogni volta.

vediamo se ho capito

struct store{
int time_lamp[16];
byte rele_1[3][5];
byte rele_2[2][7];
float temperatura;
float delta;
byte count;
byte timer1;
byte timer2[6];
byte timer3[4];}

struct store EEPROM;



void setup(){

EEPROM.get(0x00,EEPROM);}

void loop(){
...........
EEPROM.put(0x00,EEPROM);}

Così leggo e memorizzo tutte le variabili insieme…
Mentre se voglio memorizzarne una sola alla volta

EEPROM.put(0x14,EEPROM.lamp[10]);

Così memorizza la singola cella, mentre se voglio memorizzare la singola variabile intera???

//*****singolarmente
EEPROM.put(0x00,EEPROM.lamp);

Funziona???

Tutto ok, eccetto che non capisco perché dovresti salvare o leggere una sola variabile. Fai che leggere o scrivere SEMPRE l'intera struttura, dimentica gli offset. A non scrivere più del necessario ci pensa la put(), non ti preoccupare.

Ah, ed eviterei di chiamare la struct EEPROM per evitare conflitti con la libreria.