Consiglio su libreria SD card

Buondì,

per un progetto mi serve salvare in una SD i valori di qualche variabile, che vengono aggiornati ad orari fissi una volta al giorno.

Potrei utilizzare la classica libreria arduino SD.h:

se non fosse che da prove effettuate personalmente, ho notato che nella SD i valori salvati non vengono sovrascritti ma aggiunti in coda.

Bene, che voi sappiate esiste una libreria che mi consenta di sovrascrive il valore di alcune variabili cosi da rileggerli da SD con più facilità?

Grazie

... ovvio che vengono scritti in coda, come con qualsiasi libreria se fai semplicemente una write()!

Sei tu che DEVI sapere la posizione esatta in cui li hai scritti (quindi devi creare una struttura a "record" di lunghezza fissa) e, per aggiornare un valore, fare la seek() su quella posizione e poi sovrascrivere.

Guglielmo

qualcosa di più semplce, tipo una libreria già pronta non c'è? Non volevo approfondire tanto....

Grazie mille comunque.

... difficile, NON dovrebbe essere una libreria per SD, ma dovrebbe essere una libreria che si appoggia alla libreria SD per fornore metodi di accesso ai files, esempio accesso "random" a record di lunghezza fissa (banale da implementare), accesso a chiavi di tipo "index/sequential" (non troppo complicato, ma fare una cosa fatta bene, come un "balanced binary tree", richiede risorse che ... su Arduino scarseggiano), ecc. ecc.

Implementati una semplice struttura in cui tutti i record che scrivi hanno la stessa lunghezza e, quando ti serve, con un banale calcolo e con l'uso della seek(), ti piazzi sul record da aggiornare. Più complesso da descrivere che da implementare ... :smiley:

Guglielmo

Ok farò così, grazie Guglielmo!

beh, io consiglerei forte forte
di fare un giro di esplorazione sul forum, che si troverebbero cosette utili:
a partire da un minimo di diciamo così "cultura generale"
AiutateCi ad aiutarVi
che forse non ti serve, strettamente parlando, vistop che il tuo problema lo hai descritto bene, ma ti farebbe trovare questo:
La pappa è fatta
che invece contiene un certo numero di link su argomenti di carattere più specifico, in particolare questo:
Salva che ti passa
che, se ho ben capito, risolve esattamente il tuo problema

fammi sapere se ho centrato la questione

ciao Standardoil

dunque come prima domanda ti chiederei dopo poter scaricare e quindi provare la tua nelson.h

poi aprendo il link salva che ti passa non capisco ad esempio come la macro:

#define Salva(a) {Registro inifile("/file.ini"); inifile.salva(#a, a);}

possa gestire un file da storare in una SD e cspecialmente come indicarglielo.

Grazie

non capisco cosa domandi con
"possa gestire un file da storare in una SD e specialmente come indicarglielo"
se guardi la libreria registro e gli esempi ampiamente documentati vedi che il nome file viene passato come argomento alla creazione
quindi il nomefile è quello tra le virgolette, non era abbastanza chiaro? ha anche il punto tra nome ed estensione...
la libreria usa il file system spiffs di una esp12e, dato che solo quella ho, ma non è difficile farla andare su SD, i comandi quelli sono....

per quanto riguarda la libreria nelson.h da quando ho scritto quella roba ad adesso ho cambiato (causa continui dissapori) la mia politica
tutto quello che ho fatto è pubblico, ogni singola funzione della libreria nelson.h è già stata pubblicata, quindi basterebbe cercare
però capisco che cercare è fatica e quindi dopo, in privato (ho cambiato anche questo della mia politica, ora uso i PM, a mia discrezione però)
dicevo dopo in privato ti metto le sole due funzioni e la sola macro che servono per far andare la libreria dei registri

Standardoil, io chiedo solo perchè sono una capra e non provenendo dal mondo informatico, tutto quello che cerco di imparare e di fare come maker hobbysta, mi costa tanta fatica. Solo per questo chiedo. Scusa se ho urtato la tua sensibilità...
Grazie mille per quello che fai.

Saluti

Io non ho più nemmeno una UNO per provare, e dal mio trasloco ho cambiato molte delle mie abitudini e dei miei tempi
Quindi non posso far nulla per adattare la libreria dei registri alle schede SD
Ma non serve molto lavoro, e poi è tutto documentato
Casomai prova a chiedere, sono sicuro che tra tutte le persone che ci leggono qui, qualcuno risponderà, magari anche qualcuno di quelli che ai tempi criticavano e mi dicevano che quello che facevo era inutile e stupido.
Sono sicuro che saprebbero aiutarti

Poi se avanzò tempo ti seguì io

>droidprova: Senza dover usare cose già fatte per te troppo complesse, quello che devi fare è banale e ti ho già ben spiegato COME lo devi fare, quindi ... mettiti e comincia a scrivere il codice :wink:

Guglielmo

droidprova:
Buondì,

per un progetto mi serve salvare in una SD i valori di qualche variabile, che vengono aggiornati ad orari fissi una volta al giorno.
se non fosse che da prove effettuate personalmente, ho notato che nella SD i valori salvati non vengono sovrascritti ma aggiunti in coda.
Bene, che voi sappiate esiste una libreria che mi consenta di sovrascrive il valore di alcune variabili cosi da rileggerli da SD con più facilità?

Scusa me quindi a te serve che nel file ci sia sempre solo ultimo valore di quelle variabili ?
Cancella il file prima di scriverci.

Oppure (ma sarebbe da provare) dopo averlo aperto fai file.seek(0); che posiziona ad inizio (ma non è detto che venga accettato dalla lib)

nid69ita:
Oppure (ma sarebbe da provare) dopo averlo aperto fai file.seek(0); che posiziona ad inizio (ma non è detto che venga accettato dalla lib)

... e perché non dovrebbe? La seek() è uno dei normali metodi della libreria SD e tu poi tranquillamente riposizionarti all'inizio.

Però, dato che a lui serve solo aggiornare un dato valore in una data posizione, quello che deve fare è scrivere tutte righe della stessa lunghezza, esempio 10 caratteri, per cui la prima andrà da 0 a 9, la seconda da 10 a 19, la terza da 20 a 29 e così via. Se vuole sovrascrivere la riga N basta che fa una seek(10 * (N - 1)) e si trova sulla riga da riscrivere. Più banale di così ... ::slight_smile:

Guglielmo

Guglielmo, tu mi suggerisci di provare una cosa del genere?

#include <SD.h>
File file;
void setup() {
...
 }
void loop() {
  file = SD.open("miofile.txt", FILE_WRITE);
  file.seek(10 * (N - 1)) 
  file.print("provaprova");
  file.close();
}

E per il numero di caratteri esatti ci pensa la seek()?

NO, rileggi esattamente quello che ho scritto, devi fare TU una gestione di righe a lunghezza fissa (ovvero, ogni volta che scrivi un qualche cosa devi fare in modo di occupare SEMPRE lo stesso numero di caratteri, tutte righe della stessa lunghezza) e sapere quale vuoi aggiornare con il metodo che ti ho detto.

Ma tu che tipo di informazioni devi scrivere ed aggiornare ?

Guglielmo

Devo scrivere sempre l'ultima lettura di un sensore (poggiata su variabile float) che però potrebbe assumere lunghezze differenti ... es. 8.9 oppure 21.5

Ciao

... bene, converti il float in una stringa di lunghezza costante (decidi quante cifre e costruisci la stringa con SEMPRE il punto decimale e sempre lo stesso numero di caratteri), per cui, prendendo i tuoi valori dovrai SEMPRE scrivere, ad esempio:

008.9\r\n
021.5\r\n
xxx.y\r\n
...

... quindi, ogni riga sarà composta da 7 caratteri, il numero vero e proprio in 5 caratteri (tre interi, il punto ed un decimale) seguito da \r (CR) e \n (LF).

Una volta scritti, se vuoi, come nell.esempio aggiornare il valore N (ovviamente N deve valere al massimo il numero di righe/valori che avrai scritto) farai semplicemente seek(7 * (N - 1)) e ti troverai sulla riga del valore da aggiornare e dovrai semplicemente scrivere i 7 caratteri che sostituiranno i precedenti ... semplice no?

Guglielmo

... per "visualizzarlo" meglio, prendi un foglio a quadretti, decidi quanti interi e quanti decimali e scrivi un numero per ogni riga. Li avrai tutti belli incolonnati e ti sarà chiaro, come arrivare ad ogni singolo valore semplicemente saltando tutti i precedenti :smiley:

Guglielmo

perfetto tutto chiaro! Ci provo

Grazie

vorremmo anche aiutarti, ma ci mancano alcune indicazioni

  1. il file lo devi leggere anche su PC?
  2. il file lo devi anche £scrivere£ da PC, per cambiare delle impostazioni?
  3. devi tenere una sola (l'ultima) dei salvataggi, oppure uno storico?
  4. una sola variabile oppure più di una?