Pages: 1 [2] 3 4   Go Down
Author Topic: Rileggere variabili dalla ultima riga da una SD (Arduino MEga) [RISOLTO]  (Read 1538 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,
ieri sera ho fatto le prime prove (premetto che non conosco la Libreira SD).

Vi espongo un attimo la situazione.

Dopo un Reset, i dati riletti (se riletti) non vengono applicati al processo in corso.

Sono sicuro che cè qualcosa che non va nel mio Code di rilettura, mi sono appoggiato al consiglio di Pablos,adattando alcuni comandi alla Libreria SD.

Per essere piu chiaro, vi posto 3 estratti del mio codice.

Estratto 1 : Codice rilettura dopo Reset (basato su consiglio di Pablos)
Estratto 2 : Formato in cui salvo i dati su SD
Estratto 3 : Presentazione dei dati riletti dalla SD

Vi Ringrazio e abbiate pazienza con la mia confusione.
Buona giornata
Remo

Estratto 1
--------------------------------------
  
Code:
// Rilettura dati in caso di Reset
 
 if (riavvio == 0) {
  
  Serial.println ("Rileggo ultimi valori.....");
   contatore = SD.open("valori2.txt");
   String ReadLine;
  char charBuf[80];
    
  if(contatore)  
  {
   int16_t c;
       while ((c = contatore.read())>0)
       {
         ReadLine += (char)c;
                
           if((char)c=='\n')
           {
int posizioneA = ReadLine.indexOf('A');
int posizioneB = ReadLine.indexOf('B');
int posizioneC = ReadLine.indexOf('C');
int posizioneD = ReadLine.indexOf('D');
int posizioneE = ReadLine.indexOf('E');
int posizioneF = ReadLine.indexOf('F');

String A = ReadLine.substring ((posizioneA+1),(posizioneB-1));
String B = ReadLine.substring ((posizioneB+1),(posizioneC-1));
String C = ReadLine.substring ((posizioneC+1),(posizioneD-1));
String D = ReadLine.substring ((posizioneD+1),(posizioneE-1));
String E = ReadLine.substring ((posizioneE+1), (posizioneF-1));


Serial.println (A);//temporanei
Serial.println (B);//temporanei
Serial.println (C);//temporanei
Serial.println (D);//temporanei
Serial.println (E);//temporanei
           }

    riavvio = 1;
    contatore.close();
  Serial.println ("ultimi valori riletti.....Done");
 }

   }}
------------------------------------------------

Estratto 2:
-------------------------------------------------
Code:
 contatore = SD.open("valori2.txt", FILE_WRITE);
      // if the file opened okay, write to it:
  if (contatore) {
    Serial.print("scrivo valori...");
    delay(250);
   contatore.print("#");
    contatore.print(giorno);
     contatore.print(";");
     contatore.print(mese);
      contatore.print(";");
       contatore.print(anno);
         contatore.print(";");
      
         contatore.print(ora);
          contatore.print(";");
           contatore.print(minuti);
            contatore.print(";");
             contatore.print(secondi);
            
              contatore.print("A");
                contatore.print(consumo_mom,1);
                
                  contatore.print("B");
                   contatore.print(kw_giorno);
                  
                    contatore.print("C");
                     contatore.print(contatore_alto,0);
                    
                       contatore.print("D");
                        contatore.print(contatore_basso,0);
                        
                          contatore.print("E");
                           contatore.print(giri);
                            contatore.print("F");
                             contatore.println("\n");
                          
                        
                          
// close the file:
    contatore.close();
    Serial.println("done.");
------------------------------------------------------

Estratto 3:
------------------------------------------------------
Code:
#27;4;2013;6;14;10A219.0B7.77C113165D112981E10F

#27;4;2013;6;16;10A252.1B7.78C113165D112981E11F

#27;4;2013;6;17;50A303.0B7.79C113165D112981E12F

#27;4;2013;6;19;33A291.3B7.80C113165D112981E13F

#27;4;2013;6;21;12A306.1B7.81C113165D112981E14F

#27;4;2013;6;22;57A288.5B7.82C113165D112981E15F

#27;4;2013;6;24;38A300.0B7.82C113165D112981E16F
-----------------------------------------------------------------
« Last Edit: April 28, 2013, 03:02:17 pm by leo72 » Logged

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

Una prima cosa:   contatore.println("\n");
Ti trovi poi le righe separate con una riga vuota.   Println mette già un a capo
contatore.println("");       
oppure
contatore.print("\n");
Logged

my name is IGOR, not AIGOR

Genova
Offline Offline
Faraday Member
**
Karma: 17
Posts: 2745
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

io intendevo qualcosa di meno laborioso, ma forse non molto più semplice

allora ipotizziamo che i tuoi record nel file sia fatto così, ci sono dei numeri che superano il 65*** quindi l' int non basta più ci vuole il long
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
quindi hai 9 valori per linea

imposti tutte le tue cose nel setup
Code:
void setup() {
 ...
 ...
 dichiari qui i pin e quello che ti serve
 ...
 ...
  leggi_SD(); //vai alla funzione leggi l'ultima riga da sd
}


Funzione che legge il file tenendoci l'ultima linea del file come buona
Code:
void leggi_SD(){
  String ReadLine;
  char charBuf[50];
    
  if(file.open(&root, "miofile.txt", O_READ)) {
   int16_t c;
       while ((c = file.read())>0){
         ReadLine += (char)c;
           if((char)c=='\n') {                

                 #if DEBUG_RIGHE_FILE              
                 Serial.print(ReadLine);//debug
                 #endif

               if(c > 0) ReadLine="";  
            }  
       }  
   }
  Serial.print("ultima linea ");//debug
  Serial.println(ReadLine);//debug  //questa è l'ultima linea
  ReadLine.toCharArray(charBuf, 50); //metto i singoli caratteri in un array di char
  estrai_valori(charBuf);//vai alla funzione estrai dati
}

Adesso che abbiamo l'ultima linea andiamo ad estrarre i 9 valori usando la "," come separatore
Code:
void estrai_valori(char *charBuffer){
  unsigned long temp[]= {0,0,0,0,0,0,0,0,0};
  char *p = charBuffer;  
  byte i = 0;

  while (*p != '\0')
  {
    if (*p == ',') { ++i;  ++p;  continue;}
    if (isdigit(*p))
    {
         temp[i] *= 10;
         temp[i] += (*p - '0');            
    }    
     ++p;
  }  

Serial.println(temp[0]);Serial.println(temp[1]);Serial.println(temp[2]);Serial.println(temp[3]);Serial.println(temp[4]);
Serial.println(temp[5]);Serial.println(temp[6]);Serial.println(temp[7]);Serial.println(temp[8]);
}

void loop() { }

questa è l'output sul serial .... i tuoi valori ora sono dentro l'array temp[n] in formato long
Code:
ultima linea 22,4,2013,17,25,37,1496,123506,113505

22
4
2013
17
25
37
1496
123506
113505

ciao
« Last Edit: April 27, 2013, 05:52:18 am by pablos » Logged

Meglio imparare dalle cose inutili piuttosto che non imparare niente.   [Arduino Mega R3 + Ethernet shield W5100 + SD card 8Gb FAT32]

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

Grazie delle Info,
provo e vi informero.

Buona Giornata
Remo
Logged

Genova
Offline Offline
Faraday Member
**
Karma: 17
Posts: 2745
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Non sono info, te l'ho proprio fatto il programma  smiley-grin smiley-grin smiley-grin e l'ho testato
Logged

Meglio imparare dalle cose inutili piuttosto che non imparare niente.   [Arduino Mega R3 + Ethernet shield W5100 + SD card 8Gb FAT32]

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

Code:
if(file.open(&root, "miofile.txt", O_READ))
Scusami Pablos, quale Libreria utilizzi per la SD ?
Con il comando sopra citato mi da errore di compilazione (class File has no member named 'Open'.

Al momento ho impostato in questa maniera
----
Code:
void leggi_SD(){
  String ReadLine;
  char charBuf[50];
  contatore = SD.open("valori2.txt",FILE_READ);
    
  if(contatore) {
   int16_t c;
ecc.....
------

Mi da ancora 0 come valori (ho riimpostato la struttura della scrittura come nel tuo esempio con le "," senza "#" all'inizio.

« Last Edit: April 28, 2013, 03:02:47 pm by leo72 » Logged

Genova
Offline Offline
Faraday Member
**
Karma: 17
Posts: 2745
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Tutto chiaro ora?
Logged

Meglio imparare dalle cose inutili piuttosto che non imparare niente.   [Arduino Mega R3 + Ethernet shield W5100 + SD card 8Gb FAT32]

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

Grazie Pablos,

in allegato i risultati + il tuo Sketch

Sketch :
----------
Code:
#include <SPI.h>
#include <SD.h>
#define DEBUG_RIGHE_FILE 0 //0=non legge ... 1=legge
byte err_sd=1;
Sd2Card card;
SdVolume volume;
SdFile root;
SdFile file;

void setup() {
delay(1000);
  Serial.begin(9600);//debug
  pinMode(4, OUTPUT);       // Set the SDcard CS pin as an output
  digitalWrite(4, 1); // Turn off the SD card! (wait for configuration)
  sd_init();
  leggi_SD();
   pinMode(53, OUTPUT);
}

void sd_init()
{  
  err_sd=0;
  if (!card.init(SPI_FULL_SPEED, 4)) err_sd=1;
  if (!volume.init(&card)) err_sd=1;
  if (!root.openRoot(&volume)) err_sd=1;
  
  if (err_sd==0)
  Serial.println("inizializzazione SD completata.");//debug  
  else //debug
  Serial.println("inizializzazione SD fallita.");//debug
}

void leggi_SD(){
  String ReadLine;
  char charBuf[50];
    
  if(file.open(&root, "valori2.txt", O_READ)) {
   int16_t c;
       while ((c = file.read())>0){
         ReadLine += (char)c;
           if((char)c=='\n') {                

                 #if DEBUG_RIGHE_FILE              
                 Serial.print(ReadLine);//debug
                 #endif

               if(c > 0) ReadLine="";  
            }  
       }  
   }
  Serial.print("ultima linea ");//debug
  Serial.println(ReadLine);//debug  //questa è l'ultima linea
  ReadLine.toCharArray(charBuf, 50); //metto i singoli caratteri in un array di char
  estrai_valori(charBuf);//vai alla funzione estrai dati
}


void estrai_valori(char *charBuffer){
  unsigned long temp[]= {0,0,0,0,0,0,0,0,0};
  char *p = charBuffer;  
  byte i = 0;

  while (*p != '\0')
  {
    if (*p == ',') { ++i;  ++p;  continue;}
    if (isdigit(*p))
    {
         temp[i] *= 10;
         temp[i] += (*p - '0');            
    }    
     ++p;
  }  

Serial.println(temp[0]);Serial.println(temp[1]);Serial.println(temp[2]);Serial.println(temp[3]);Serial.println(temp[4]);
Serial.println(temp[5]);Serial.println(temp[6]);Serial.println(temp[7]);Serial.println(temp[8]);
}

void loop() { }
-----------------------

Dati sulla SD :
--------------------
Code:
27,4,2013,14,8,6,909.1,0.01,113165,112972,1
27,4,2013,14,8,58,588.2,0.02,113165,112972,2
27,4,2013,14,9,45,652.2,0.02,113165,112972,3
27,4,2013,14,10,33,638.3,0.03,113165,112972,4
27,4,2013,14,11,29,545.5,0.04,113165,112972,5
27,4,2013,14,12,33,476.2,0.05,113165,112972,6
27,4,2013,14,13,30,1304.3,0.01,113165,112972,1
---------------------

Output SEriale :
------------------------
Code:
inizializzazione SD completata.
ultima linea
0
0
0
0
0
0
0
0
0
---------------------

Saluti
Remo
« Last Edit: April 28, 2013, 03:03:26 pm by leo72 » Logged

Genova
Offline Offline
Faraday Member
**
Karma: 17
Posts: 2745
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Non mi sembra che vada bene!!!
scusa ma se questa è di 9  unsigned long temp[]= {0,0,0,0,0,0,0,0,0};
perchè inserisci dei punti e aumenti le quantita delle variabili?

se cambi il formato delle linee non funziona più nulla

hai provato a usare il mio esempio con il file fatto in quel modo? funziona?

Ps i codici vanno messi tra i tag (insert code simbolo #)
« Last Edit: April 27, 2013, 07:53:17 am by pablos » Logged

Meglio imparare dalle cose inutili piuttosto che non imparare niente.   [Arduino Mega R3 + Ethernet shield W5100 + SD card 8Gb FAT32]

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

appena rientro a casa provo con il tuo esempio.(fra 1 oretta)

Grazie al momento ...

Saluti
Remo
Logged

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

Il tuo Esempio funziona alla perfezione.
 Cosa fare adesso ? se a me interessano i valori qui sotto marcati in rosso ?
Che avranno sicuramente un altro formato


21,4,2013,16,25,37,1486,123496,113495 <---- Dal tuo Esempio
27,4,2013,16,1,38,2307.7,0.01,113165,112972,1 <--- Cio di cui avrei bisogno
 

Saluti
Remo
Logged

Genova
Offline Offline
Faraday Member
**
Karma: 17
Posts: 2745
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

il punto viene eliminato nello sketch, non avevi parlato inizialmente di variabili float se è un float

questo è quello che ti serviva
Quote
17.4.2013 ORE: 12:25:37 Consumo Attuale 1456 watt Contatore alto 123456 Kwh Contatore basso 113455 ecc......

... cosè quello 0.01 e 2307.7?
« Last Edit: April 27, 2013, 09:15:53 am by pablos » Logged

Meglio imparare dalle cose inutili piuttosto che non imparare niente.   [Arduino Mega R3 + Ethernet shield W5100 + SD card 8Gb FAT32]

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

lo 0.01 sarebbe il consumo giornaliero accumulato a partire dalla mezzanotte in kw , potrei farne un intero in watt
il 2307.7 sarebbe il consumo momentaneo , ma anche li potrei farne un intero.

Grazie per l'aiuto

Remo
Logged

Genova
Offline Offline
Faraday Member
**
Karma: 17
Posts: 2745
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

se li fai tutti interi questa linea da un array di 9
Code:
unsigned long temp[]= {0,0,0,0,0,0,0,0,0};
diventa di 11 elementi
Code:
unsigned long temp[]= {0,0,0,0,0,0,0,0,0,0,0};

per visualizzare i dati temporanei dovrai aggiungere
Code:
Serial.println(temp[9]);Serial.println(temp[10]);
per adattare i float ci dovrei studiare un po'


Logged

Meglio imparare dalle cose inutili piuttosto che non imparare niente.   [Arduino Mega R3 + Ethernet shield W5100 + SD card 8Gb FAT32]

Genova
Offline Offline
Faraday Member
**
Karma: 17
Posts: 2745
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Per poter inserire numeri float dovresti spostare durante la scrittura i valori con il punto in fondo alla stringa e cambiare separatore
così

27,4,2013,16,1,38,113165,112972,1;2307.7,0.01

Ora si dovrebbe procedere a spezzare la stringa in 2 parti data dal separatore ";" ottenendone 2
String_a 27,4,2013,16,1,38,113165,112972,1
String_b 2307.7,0.01

adesso una stringa può essere memorizzata dentro 2 array, una con i long e l'altra con i float
« Last Edit: April 27, 2013, 09:50:18 am by pablos » Logged

Meglio imparare dalle cose inutili piuttosto che non imparare niente.   [Arduino Mega R3 + Ethernet shield W5100 + SD card 8Gb FAT32]

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