Go Down

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

remino

#15
Apr 27, 2013, 07:19 am Last Edit: Apr 28, 2013, 10:02 pm by leo72 Reason: 1
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: [Select]
// 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: [Select]

 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: [Select]

#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

-----------------------------------------------------------------

nid69ita

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");
my name is IGOR, not AIGOR

pablos

#17
Apr 27, 2013, 12:46 pm Last Edit: Apr 27, 2013, 12:52 pm by pablos Reason: 1
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: [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

quindi hai 9 valori per linea

imposti tutte le tue cose nel setup
Code: [Select]
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: [Select]
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: [Select]
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: [Select]
ultima linea 22,4,2013,17,25,37,1496,123506,113505

22
4
2013
17
25
37
1496
123506
113505


ciao
no comment

remino

Grazie delle Info,
provo e vi informero.

Buona Giornata
Remo

pablos

Non sono info, te l'ho proprio fatto il programma  :D :D :D e l'ho testato
no comment

remino

#20
Apr 27, 2013, 01:19 pm Last Edit: Apr 28, 2013, 10:02 pm by leo72 Reason: 1
Code: [Select]
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: [Select]
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.



remino

#22
Apr 27, 2013, 02:17 pm Last Edit: Apr 28, 2013, 10:03 pm by leo72 Reason: 1
Grazie Pablos,

in allegato i risultati + il tuo Sketch

Sketch :
----------
Code: [Select]
#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: [Select]
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: [Select]

inizializzazione SD completata.
ultima linea
0
0
0
0
0
0
0
0
0

---------------------

Saluti
Remo

pablos

#23
Apr 27, 2013, 02:50 pm Last Edit: Apr 27, 2013, 02:53 pm by pablos Reason: 1
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 #)
no comment

remino

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

Grazie al momento ...

Saluti
Remo

remino

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

pablos

#26
Apr 27, 2013, 04:13 pm Last Edit: Apr 27, 2013, 04:15 pm by pablos Reason: 1
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?
no comment

remino

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

pablos

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

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


no comment

pablos

#29
Apr 27, 2013, 04:47 pm Last Edit: Apr 27, 2013, 04:50 pm by pablos Reason: 1
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
no comment

Go Up