Show Posts
Pages: 1 2 [3] 4 5 ... 9
31  International / Software / Re: Rileggere variabili dalla ultima riga da una SD (Arduino MEga) on: April 27, 2013, 12:18:44 pm
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();
  }
}
 
32  International / Software / Re: Rileggere variabili dalla ultima riga da una SD (Arduino MEga) on: April 27, 2013, 12:03:24 pm
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
33  International / Software / Re: Rileggere variabili dalla ultima riga da una SD (Arduino MEga) on: April 27, 2013, 09:50:14 am
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
34  International / Software / Re: Rileggere variabili dalla ultima riga da una SD (Arduino MEga) on: April 27, 2013, 09:29:49 am
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
35  International / Software / Re: Rileggere variabili dalla ultima riga da una SD (Arduino MEga) on: April 27, 2013, 09:07:15 am
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
36  International / Software / Re: Rileggere variabili dalla ultima riga da una SD (Arduino MEga) on: April 27, 2013, 07:52:48 am
appena rientro a casa provo con il tuo esempio.(fra 1 oretta)

Grazie al momento ...

Saluti
Remo
37  International / Software / Re: Rileggere variabili dalla ultima riga da una SD (Arduino MEga) on: April 27, 2013, 07:17:27 am
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
38  International / Software / Re: Rileggere variabili dalla ultima riga da una SD (Arduino MEga) on: April 27, 2013, 06:19:08 am
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.

39  International / Software / Re: Rileggere variabili dalla ultima riga da una SD (Arduino MEga) on: April 27, 2013, 05:53:10 am
Grazie delle Info,
provo e vi informero.

Buona Giornata
Remo
40  International / Software / Re: Rileggere variabili dalla ultima riga da una SD (Arduino MEga) on: April 27, 2013, 12:19:41 am
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
-----------------------------------------------------------------
41  International / Software / Re: Rileggere variabili dalla ultima riga da una SD (Arduino MEga) on: April 26, 2013, 07:46:36 am
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
42  International / Software / Re: Rileggere variabili dalla ultima riga da una SD (Arduino MEga) on: April 26, 2013, 03:06:08 am
Grazie proveró oggi e ti faro sapere.

Buona giornata.

Remo
43  International / Software / Re: Rileggere variabili dalla ultima riga da una SD (Arduino MEga) on: April 26, 2013, 02:34:45 am
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
44  International / Software / Re: Rileggere variabili dalla ultima riga da una SD (Arduino MEga) on: April 26, 2013, 02:04:48 am
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

45  International / Software / Re: Rileggere variabili dalla ultima riga da una SD (Arduino MEga) on: April 26, 2013, 01:41:38 am
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
Pages: 1 2 [3] 4 5 ... 9