Pages: [1] 2 3 4   Go Down
Author Topic: Rileggere variabili dalla ultima riga da una SD (Arduino MEga) [RISOLTO]  (Read 1786 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Full Member
***
Karma: 0
Posts: 128
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
« Last Edit: May 01, 2013, 12:51:35 am by remino » Logged

Fidenza (PR)
Offline Offline
Full Member
***
Karma: 3
Posts: 143
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Offline Offline
Full Member
***
Karma: 0
Posts: 128
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
« Last Edit: April 26, 2013, 01:43:12 am by remino » Logged

Genova
Offline Offline
Faraday Member
**
Karma: 37
Posts: 3239
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

no comment

Offline Offline
Full Member
***
Karma: 0
Posts: 128
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Logged

Genova
Offline Offline
Faraday Member
**
Karma: 37
Posts: 3239
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
#,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" smiley

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
« Last Edit: April 26, 2013, 03:12:38 am by pablos » Logged

no comment

Offline Offline
Full Member
***
Karma: 0
Posts: 128
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Genova
Offline Offline
Faraday Member
**
Karma: 37
Posts: 3239
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
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
« Last Edit: April 26, 2013, 03:10:41 am by pablos » Logged

no comment

Offline Offline
Full Member
***
Karma: 0
Posts: 128
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Grazie proveró oggi e ti faro sapere.

Buona giornata.

Remo
Logged

ivrea (to)
Offline Offline
Faraday Member
**
Karma: 76
Posts: 4607
miaaao ^-^
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

my name is IGOR, not AIGOR

ivrea (to)
Offline Offline
Faraday Member
**
Karma: 76
Posts: 4607
miaaao ^-^
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

my name is IGOR, not AIGOR

Genova
Offline Offline
Faraday Member
**
Karma: 37
Posts: 3239
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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à.
« Last Edit: April 26, 2013, 07:42:01 am by pablos » Logged

no comment

Offline Offline
Full Member
***
Karma: 0
Posts: 128
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Genova
Offline Offline
Faraday Member
**
Karma: 37
Posts: 3239
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 smiley
esiste anche int(string) ma per numeri a 4-5 cifre mi dava valori sbagliati.

ciao
Logged

no comment

ivrea (to)
Offline Offline
Faraday Member
**
Karma: 76
Posts: 4607
miaaao ^-^
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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/

Logged

my name is IGOR, not AIGOR

Pages: [1] 2 3 4   Go Up
Jump to: