Go Down

Topic: Rileggere variabili dalla ultima riga da una SD (Arduino MEga) [RISOLTO] (Read 2813 times) previous topic - next topic

remino

Buongiorno a tutti,
utilizzo un Arduino Mega con Ethershield + SD.

Il mio progettino è quasi concluso, vi espongo l'unico punto aperto.

Quando avviene un reset, vorrei che L'arduino andasse a leggere le variabili dell'ultima riga, memorizzate sulla SD (che sarebbero quelle attuali), in modo da poter continuare da dove ci si era fermati.

Sono in cerca di qualche tutorial in Italiano (con quelli Inglesi ho difficolta).

Qualche consiglio ?

Grazie e buona giornata
Remo

mancio

beh se salvi su file basta che leggi tutto il file finche non arrivi alla fine e poi ti recuperi l'ultima riga..oppure salvi su file "al contrario" in modo da avere l'ultimo evento sempre in cima al file

remino

#2
Apr 26, 2013, 08:41 am Last Edit: Apr 26, 2013, 08:43 am by remino Reason: 1
Grazie del consiglio,
dovró rileggermi e studiarmi la libreria della SD.

Il mio intento è quello di ri-settare delle variabili, in pratica dovró riconvertirle in formato INT dopo la lettura.

Saluti
Remo

pablos

Dovresti postare il formato del file, un esempio di come sono salvate le var, altrimenti sarà difficile darti un consiglio.
Quante variabili sono? sono separate da virgola, sono su più linee? una riga sola ...

ciao
no comment

remino

I valori (a parte data e ora) sono in INT, qui sotto un esempio (a memoria, non ho qui il log).
Tutto su una unica riga

17.4.2013 ORE: 12:25:37 Consumo Attuale 1456 watt Contatore alto 123456 Kwh Contatore basso 113455 ecc......


Quelle marcate in Rosso mi interesserebbe recuperare dopo un restart.

Saluti
Remo


pablos

#5
Apr 26, 2013, 09:21 am Last Edit: Apr 26, 2013, 10:12 am by pablos Reason: 1
Dovresti salvare i dati in questo modo, il char "," fa da separatore e il "#" da l'inizio riga, ora fai uno split dell'ultima linea i valori 7,8,9 sono quelli che ti interessano

Code: [Select]

#,18,4,2013,13,25,37,1456,123466,113465
#,19,4,2013,14,25,37,1466,123476,113475
#,20,4,2013,15,25,37,1476,123486,113485
#,21,4,2013,16,25,37,1486,123496,113495
#,22,4,2013,17,25,37,1496,123506,113505


anche uno "\n" può farti da fine linea e new line, forse il # puoi non usarlo, dipende come scrivi su file
Ora mi rendo conto di averti rovinato le righe e quando vai a rileggere a video l'intero file non ci capisci nulla, ma sta a te ricostruire i dati da stampare quando vai a fare un "visualizza file" :)

Oppure un altro modo, metti davanti a quei valori dei simboli o delle parole univoche,

es  
Consumo Attuale CSA1456#
Contatore alto CNA123456#
Contatore basso CNB113455#

ora cerchi tutto quello che è contenuto tra CSA e # ecc ecc, quando legge il file ne troverà tanti, alla chiusura del file le 3 variabili che hanno letto CSA CNA CNB saranno gli ultimi

ciao
no comment

remino

Ti Ringrazio Pablos.
Attueró questa forma, molto piu chiara e snella.

Non ho ancora capito pero come posso far saltare il cursore all'inizio dell'ultima riga, e da li fare la ricerca.
Presumo con il comando seek() ?

Saluti
Remo

pablos

#7
Apr 26, 2013, 09:58 am Last Edit: Apr 26, 2013, 10:10 am by pablos Reason: 1
i comandi della lib SD sono pochi alla fine è sempre un leggere dal char 0 all'ultimo char del file, seek ti restituisce vero-falso se è prensente un char in una determinata pos, non mi sembra che ti possa servire.

Code: [Select]
String ReadLine;
 char charBuf[80];
   
 if(file.open(&root, "miofile.txt", O_READ))  
 {
  int16_t c;
      while ((c = file.read())>0)
      {
        ReadLine += (char)c;
       
          if((char)c=='\n')
          {
             ...
             ...
          }


 


quando l'while (c = file.read()) sarà = 0 ReadLine conterrà l'ultima riga su cui vai a prendere i dati

ReadLine è una stringa quindi dovrai estrarre i dati lavorandola un po' usando
ReadLine.indexOf("....")
ReadLine.substring(a, b);
ecc
cerca di fare le linee del file più corte possibili altrimenti ti ritrovi arduino piantato la ram è poca
no comment

remino

Grazie proveró oggi e ti faro sapere.

Buona giornata.

Remo

nid69ita

Ancora meglio sarebbe separare i dati scritti con ; invece di ,
A questo punto la prima riga potrebbe anche essere i titoli dei campi e il file sarebbe un comodo file csv che puoi leggere con excel.

giorno;mese;anno;ora;minuti;secondi;Consumo attuale;Contatore alto;Contatore basso
18;4,2013;13;25;37;1456;123466;113465
19;4;2013;14;25;37;1466;123476;113475
my name is IGOR, not AIGOR

nid69ita

I comandi Seek(), Position(), Size() sarebbero utili per leggere l'ultima riga ma SOLO se tutte le tue righe hanno la stessa lunghezza.

Con size() chiedi la lunghezza del file. Se ogni riga occupa 10 byte e il file contiene 6 righe dovrebbe essere grande 60 byte.
Con seek() vai al byte 50 e leggi 10 byte ovvero l'ultima riga.

Il file può anche essere un file testo, ma assolutamente devi essere sicuro che ogni riga occupi sempre gli stessi caratteri e tener conto del fine riga.
my name is IGOR, not AIGOR

pablos

#11
Apr 26, 2013, 02:39 pm Last Edit: Apr 26, 2013, 02:42 pm by pablos Reason: 1

I comandi Seek(), Position(), Size() sarebbero utili per leggere l'ultima riga ma SOLO se tutte le tue righe hanno la stessa lunghezza.

Con size() chiedi la lunghezza del file. Se ogni riga occupa 10 byte e il file contiene 6 righe dovrebbe essere grande 60 byte.
Con seek() vai al byte 50 e leggi 10 byte ovvero l'ultima riga.

Il file può anche essere un file testo, ma assolutamente devi essere sicuro che ogni riga occupi sempre gli stessi caratteri e tener conto del fine riga.


Come puoi dedurre non è così, le lunghezze dei records cambiano, comunque qualsiasi sia la funzione utility che offre la libreria è sempre una lettura dal char 0 fino all'ultimo char del file in modo sequenziale (leggi carattere e conta). Tanto vale che faccia una funzione lui dedicata alle sue necessità.
no comment

remino

Vi ringrazio delle info, il raginamento l'ho capito.
useró le funzioni indexof e substring.

Unico dubbio , come faccio a riconvertire questi valori in INT ?
Ho letto qualcosa inerente Atol ma non so se sia la via giusta.

Saluti e grazie
Remo

pablos


come faccio a riconvertire questi valori in INT ?
Ho letto qualcosa inerente Atol ma non so se sia la via giusta.


Purtroppo si, la funzione è atoi(), il purtroppo lo capirai quando la usi :)
esiste anche int(string) ma per numeri a 4-5 cifre mi dava valori sbagliati.

ciao
no comment

nid69ita


Vi ringrazio delle info, il raginamento l'ho capito.
useró le funzioni indexof e substring.

Unico dubbio , come faccio a riconvertire questi valori in INT ?
Ho letto qualcosa inerente Atol ma non so se sia la via giusta.

Saluti e grazie
Remo



atoi per ascii->int
atol per ascii->long

devi fare attenzione però al discorso signed/unsigned

http://www.cplusplus.com/reference/cstdlib/atol/

my name is IGOR, not AIGOR

Go Up