Pages: 1 2 [3] 4   Go Down
Author Topic: Rileggere variabili dalla ultima riga da una SD (Arduino MEga) [RISOLTO]  (Read 1799 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

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
Logged

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

nel mio sketch, se faccio il debug delle righe mi rida dietro i dati, ma non nelle Variabili temporali.

--------------------
Code:
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
« Last Edit: April 28, 2013, 03:04:01 pm by leo72 » Logged

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

allego il mio sketch (confusionario)
se riesci a carpirne il problema te ne sarei grato.



Code:
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();
  }
}
 
« Last Edit: April 28, 2013, 02:15:10 am by remino » Logged

Genova
Offline Offline
Faraday Member
**
Karma: 38
Posts: 3245
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

no comment

Genova
Offline Offline
Faraday Member
**
Karma: 38
Posts: 3245
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Code:
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
Logged

no comment

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

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


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

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

con la Init SD del mio enviroment invece mi trova il file, ma il risultato rimanne invariato :-(
ecco l'output
-------

Code:
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
----------
« Last Edit: April 28, 2013, 03:04:48 pm by leo72 » Logged

Genova
Offline Offline
Faraday Member
**
Karma: 38
Posts: 3245
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ci sto diventando matto smiley
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

« Last Edit: April 28, 2013, 01:55:46 pm by pablos » Logged

no comment

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

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

my name is IGOR, not AIGOR

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 325
Posts: 22498
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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


Genova
Offline Offline
Faraday Member
**
Karma: 38
Posts: 3245
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ti aspettavo Leo ahahahahahahahah mi chiedevo .... ma come mai Leo non ha ancora editato i post? starà poco bene, sarà impegnato  smiley-grin smiley-grin smiley-grin
Logged

no comment

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

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
Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 325
Posts: 22498
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

@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  smiley-wink
Logged


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

Se ci avrei fatto caso me lo sarei chiesto. smiley-cool

Buona giornata
Remo
Logged

Genova
Offline Offline
Faraday Member
**
Karma: 38
Posts: 3245
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

bye
Logged

no comment

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