Go Down

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

remino

Ciao Pablo,
non investire ulteriore tempo, mi accontenterò di 3 sole variabili
27,4,2013,16,1,38,2307,0,113165,112972,1

Alla fine mi interessa che il mio arduino abbia lo stesso numero di cicli del misuratore di corrente, che sta fuori casa.

Tutto questo solo in caso di reset , il resto lo visualizzo sul display in REal Time.

Provo ad adattarmelo.

Grazie di tutto al momento !!

Saluti
Remo

remino

#31
Apr 27, 2013, 07:03 pm Last Edit: Apr 28, 2013, 10:04 pm by leo72 Reason: 1
nel mio sketch, se faccio il debug delle righe mi rida dietro i dati, ma non nelle Variabili temporali.

--------------------
Code: [Select]

initialization done.

27,4,2013,18,46,0,113165,112972,1
27,4,2013,18,46,0,113165,112972,1
27,4,2013,18,47,0,113165,112972,2
27,4,2013,18,47,0,113165,112972,3
27,4,2013,18,47,0,113165,112972,1
27,4,2013,18,48,0,113165,112972,2
27,4,2013,18,48,0,113165,112972,3
27,4,2013,18,48,0,113165,112972,4
27,4,2013,18,49,0,113165,112972,5
27,4,2013,18,49,0,113165,112972,6
27,4,2013,18,49,0,113165,112972,7
27,4,2013,18,49,0,113165,112972,8
27,4,2013,18,50,0,113165,112972,9
27,4,2013,18,50,0,113165,112972,10
27,4,2013,18,50,0,113165,112972,11
27,4,2013,18,51,0,113165,112972,12
27,4,2013,18,51,0,113165,112972,13
27,4,2013,18,51,0,113165,112972,14
27,4,2013,18,52,0,113165,112972,1
27,4,2013,18,52,0,113165,112972,2
27,4,2013,18,52,0,113165,112972,3
27,4,2013,18,53,0,113165,112972,4
27,4,2013,18,53,0,113165,112972,5
27,4,2013,18,54,8,113165,112972,1
27,4,2013,18,55,16,113165,112972,2
27,4,2013,18,55,8,113165,112972,1
27,4,2013,18,55,16,113165,112972,2
27,4,2013,18,56,24,113165,112972,3
27,4,2013,18,56,32,113165,112972,4
27,4,2013,18,57,40,113165,112972,5
ultima linea
0
0
0
0
0
0
0
0
0
-------------------------------------------------------

le variabili --> 113165,112972 le ho impostate come long
il resto come int, poiche il valore massimo non supererà mai il 150.

Saluti
Remo

remino

#32
Apr 27, 2013, 07:18 pm Last Edit: Apr 28, 2013, 09:15 am by remino Reason: 1
allego il mio sketch (confusionario)
se riesci a carpirne il problema te ne sarei grato.



Code: [Select]
int result;
int buttonPin = 22;
int buttonPin1 = 24;

int giri = 0;

#include <Wire.h>
#include "RTClib.h"
#include <SD.h>
#include <SPI.h>
#define DEBUG_RIGHE_FILE 1 //0=non legge ... 1=legge
int button = 8;
int start;
int stop_;
int tempo;
RTC_DS1307 RTC;
int flag = 0;
int anno;
int mese;
int giorno;
int ora;
int minuti;
int secondi;
int data;
long contatore_alto =113165;
long contatore_basso = 112972;
int flag_contatore;
int kw_giorno;
int giri_kw;
File contatore;
String ReadLine;
int riavvio = 0;
char charBuf[80];
byte err_sd=1;
Sd2Card card;
SdVolume volume;
SdFile root;
SdFile file;



void setup() {
 Serial.begin(9600);
 Serial1.begin(9600);
   Wire.begin();
   RTC.begin();
   pinMode (button,INPUT);
 pinMode(buttonPin,OUTPUT);
  pinMode(buttonPin1,OUTPUT);
    pinMode(53, OUTPUT);
 leggi_SD(); //vai alla funzione leggi l'ultima riga da sd  
 
 if (! RTC.isrunning()) {
   Serial.println("RTC is NOT running!");
   // following line sets the RTC to the date & time this sketch was compiled
  // RTC.adjust(DateTime(__DATE__, __TIME__));
 }
 sd_init();
 leggi_SD();
}

void sd_init()
{  
  if (!SD.begin(4)) {
   Serial.println("initialization failed!");
   return;
 }
 Serial.println("initialization done.");
 
}

void leggi_SD(){
 String ReadLine;
 char charBuf[50];
contatore = SD.open("valori2.txt",FILE_READ);
   
if(contatore) {
  int16_t c;
      while ((c = contatore.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]);

contatore.close();
}




void loop() {

 DateTime now = RTC.now();
   
   anno = (now.year());
   mese = (now.month());
   giorno =(now.day());
   ora = (now.hour());
   minuti = (now.minute());
   secondi = (now.second());
 
    if (ora > 7 && ora < 21) { flag_contatore = 0;} else {flag_contatore = 1;}
    if (ora == 0 && minuti == 0 && secondi < 20) {giri_kw = 0; kw_giorno = 0;}
 
 
   if (flag == 0) {
  start = (now.unixtime());
  //Serial.println(start);
  }
        flag =1 ;
 
 


 // Se arriva impulso tramite Xbee allora si comincia
 if (Serial.available()) {
   int inByte = Serial.read();
 // Serial1.println( Serial.write(inByte));
 
 
  if (inByte == 'I') {      
     giri = giri + 1;
     kw_giorno = kw_giorno + 8.333333;
 
    if (giri == 120) {
     
      if (flag_contatore == 0) {contatore_alto = contatore_alto + 1;}
      if (flag_contatore == 1) {contatore_basso = contatore_basso + 1;}
      giri = 0;}
     
   
   
     tempo = now.unixtime() - start ;
     flag = 0;
   digitalWrite (buttonPin,HIGH);
   delay(150);
   float z = tempo/3600.000000000;
   float  consumo_mom = 8.333333 / z;
 
 
 // Stampa su monitor
   Serial.print (" secondi passati --> ");
   Serial.print (tempo);
   Serial.print (" consumo attuale --> ");
   Serial.print (consumo_mom);
   Serial.print (" Giri disco al momento --> ");
   Serial.println (giri);
   Serial.println ("****************************************************************");
   Serial.print (" Contatore tariffa alta --> ");
   Serial.print (contatore_alto);
   Serial.print (" Contatore tariffa bassa --> ");
   Serial.print (contatore_basso);
    Serial.print (" Consumo Giornaliero in w/h --> ");
   Serial.println (kw_giorno);
   Serial.print (" DATA: ");
   Serial.print (giorno);
   Serial.print (".");
   Serial.print (mese);
   Serial.print (".");
   Serial.print (anno);
   Serial.print ("   ORA:");
   Serial.print (ora);
   Serial.print (":");
   Serial.print (minuti);
   Serial.print (":");
   Serial.print (secondi);
   Serial.println ();
   Serial.println ();
   Serial.println ();
   
   
//Scrittura su SD  
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(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(",");
             
             //  contatore.print(consumo_mom,0);
               
             //   contatore.print(",");
                  contatore.print(kw_giorno);
                 
                   contatore.print(",");
                    contatore.print(contatore_alto);
                   
                      contatore.print(",");
                       contatore.print(contatore_basso);
                       
                         contatore.print(",");
                          contatore.print(giri);
                           
                           contatore.print("\n");
                         
                       
                         
// close the file:
 contatore.close();
   Serial.println("done.");

 } else {
   // if the file didn't open, print an error:
   Serial.println("apertura file fallita...");
 }
   
   
}

 

 digitalWrite (buttonPin,LOW);


 









 // read from port 1, send to port 0:
// if (Serial1.available()) {
  // int inByte = Serial1.read();
 }
}

pablos

così a occhio nel setup prima leggi la SD poi la inizializzi con sd_init(); ma non dovrebbe essere solo quello il problema
come mai usi 2 seriali? hai qualcosa collegato alla serial1?

ci do un occhiata anche se non ho la rtc.h

ciao
no comment

pablos

non trova il file, aggiungi un controllo nell' if(contatore....

Code: [Select]
if(contatore) {
   int16_t c;
       while ((c = contatore.read())>0){
         ReadLine += (char)c;
           if((char)c=='\n') {                 

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

               if(c > 0) ReadLine="";   
            } 
       } 
   }

else
   
    Serial.println("file non trovato ");//debug
contatore.close();

  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
}


sbagli le istruzioni per aprire il file, inoltre dovresti assicurarti che nel file dopo l'ultima riga non ci siano righe vuote
Mi ero dimenticato nell'esempio di chiudere il file dopo la lettura l'ho aggiunto qui

ciao
no comment

remino

#35
Apr 28, 2013, 07:53 pm Last Edit: Apr 28, 2013, 10:04 pm by leo72 Reason: 1
Ciao Pablos,
infatti, l'errore "file non trovato appare".
Non saprei dove sbaglio a questo punto.
Il file di testo memorizzato sulla SD non presenta righe vuote.

Unico dubbio è l'utilizzo dei comandi per la SD (diverse librerie ? )

Se uso la tua inizializzazione allegata nel codice, nel momento di scrittura l'arduino mi da errore di apertura.

Come detto in post precedenti, uso la Libreria apresente nell'enviroment arduino.

Quello che mi chiedo , come mai mi fa vedre le righe (in debug) se poi mi dice file non trovato ?

Ecco l'output della seriale al momento ...

dimenticavo uso piu Seriali perche sto usando 2 Xbee

Saluti Remo
----------------
Code: [Select]
file non trovato
ultima linea
0
0
0
0
0
0
0
0
0
inizializzazione SD completata.
28,4,2013,19,36,8,113165,112972,2
28,4,2013,19,36,16,113165,112972,3
28,4,2013,19,37,8,113165,112972,2
28,4,2013,19,37,16,113165,112972,3
28,4,2013,19,37,24,113165,112972,4
28,4,2013,19,37,32,113165,112972,5
28,4,2013,19,37,40,113165,112972,6
28,4,2013,19,38,48,113165,112972,7
28,4,2013,19,38,56,113165,112972,8
28,4,2013,19,38,64,113165,112972,9
28,4,2013,19,38,8,113165,112972,2
ultima linea
0
0
0
0
0
0
0
0
0
secondi passati --> 17 consumo attuale --> 1764.71 Giri disco al momento --> 2
****************************************************************
Contatore tariffa alta --> 113165 Contatore tariffa bassa --> 112972 Consumo Giornaliero in w/h --> 8
DATA: 28.4.2013   ORA:19:52:26


apertura file fallita...



remino

#36
Apr 28, 2013, 08:08 pm Last Edit: Apr 28, 2013, 10:04 pm by leo72 Reason: 1
con la Init SD del mio enviroment invece mi trova il file, ma il risultato rimanne invariato :-(
ecco l'output
-------

Code: [Select]
initialization done.
28,4,2013,19,36,8,113165,112972,2
28,4,2013,19,36,16,113165,112972,3
28,4,2013,19,37,8,113165,112972,2
28,4,2013,19,37,16,113165,112972,3
28,4,2013,19,37,24,113165,112972,4
28,4,2013,19,37,32,113165,112972,5
28,4,2013,19,37,40,113165,112972,6
28,4,2013,19,38,48,113165,112972,7
28,4,2013,19,38,56,113165,112972,8
28,4,2013,19,38,64,113165,112972,9
28,4,2013,19,38,8,113165,112972,2
28,4,2013,20,3,8,113165,112972,2
28,4,2013,20,3,16,113165,112972,3
28,4,2013,20,3,8,113165,112972,2
28,4,2013,20,4,16,113165,112972,3
28,4,2013,20,4,8,113165,112972,2
28,4,2013,20,5,8,113165,112972,2
28,4,2013,20,5,16,113165,112972,3
28,4,2013,20,6,8,113165,112972,2
28,4,2013,20,6,16,113165,112972,3
ultima linea
0
0
0
0
0
0
0
0
0

----------

pablos

#37
Apr 28, 2013, 08:52 pm Last Edit: Apr 28, 2013, 08:55 pm by pablos Reason: 1
Ci sto diventando matto :)
scusa ma a me il tuo sketch non inizializza e non legge niente, ho la mega anch'io
se stai usando questo http://arduino.cc/en/Tutorial/ReadWrite a me non funziona e non ha mai funzionato

puoi mettere bene lo sketch che ti fa vedere  il file valori2.txt?

ciao

no comment

nid69ita

@remino  magari invece di mettere il codice dentro al messaggio, allegalo usando "Additional Options..." che vedi in basso a sinistra del rettangolo dove si scrivono i messaggi. Forse è più pratico.
my name is IGOR, not AIGOR

leo72

@remino:
esiste un regolamento che tutti dovremmo rispettare.
Una delle regole dice chiaramente di includere codice e messaggi di terminale negli appositi tag. Ho dovuto editare 6 o 7 tuoi messaggi in questo thread. Ma gli altri utenti che ti rispondevano con il codice incluso non ti facevano scattare nessuna domanda???  :smiley-roll:

pablos

Ti aspettavo Leo ahahahahahahahah mi chiedevo .... ma come mai Leo non ha ancora editato i post? starà poco bene, sarà impegnato  :D :D :D
no comment

remino

Buongiorno a tutti.

@Pablos : Vedró di far rifunzionare il tuo esempio (che all'inizio funzionava)

@Leo72 : Grazie delle delucidazioni, non saprei quali domande avrei dovuto pormi, non saró tanto sveglio !!

Buona giornata a tutti
Remo

leo72


@Leo72 : Grazie delle delucidazioni, non saprei quali domande avrei dovuto pormi, non saró tanto sveglio !!

La domanda del perché tutti includevano il codice in quelle belle finestrelle con la dicitura "code" mentre tu no  ;)

remino

Se ci avrei fatto caso me lo sarei chiesto. 8)

Buona giornata
Remo

pablos

se usi quelle istruzioni ti mancano queste per la scrittura
Code: [Select]
file.open(&root, "miofile.txt", O_APPEND | O_WRITE);
  file.print(..................);
   file.close();


bye
no comment

Go Up