Pages: [1]   Go Down
Author Topic: SD card logfile name time stamp  (Read 2025 times)
0 Members and 1 Guest are viewing this topic.
Holland
Offline Offline
Jr. Member
**
Karma: 0
Posts: 81
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Code:
Hello,

I like to log the data from a SHT075,BMP085, and a RTCDS3234 on a SD card. This all works fine.
Bud the file is marked only logfilexx.csv.
Every new file is incremented till 99.
Bud what I like to realise is to close the file at midnight 23;59;59 and opend a new file with day and month time stamp in the file name
like 0812.csv
Any help is welcome.

Theo

ps shis is teh last part of my code inwhich i like to have the filename code.

[code
void loop()
  
{
    char cmd;                  
    int humidVal;              
    int tempVal ;              
    unsigned char statusVal;  
    float fHumidity;            
    float fTemperature;        
    float dewPoint;            
    unsigned char error;        
    unsigned int port;        
    float Temperature;        
    float Humidity;          
    float logEx;              
    float Dauwpunt;            
    float t;                  
    float rhLin;              
    float rhTrue;              
    float tC;                
    float rh;                
    int dag;
    int maand;

    Serial.begin(9600);
 delay(30000);
    port=5;
                                  
                sMeasure ((unsigned char *)&tempVal, MEASURE_TEMP, 0, port);   // leest de temp waarde grof uit de SHT
                sMeasure ((unsigned char *)&humidVal, MEASURE_HUMI, 0, port);  
                
#define         C1      -2.0468
#define         C2      +0.0367
#define         C3      -0.0000015955

    /* Constants for temperature-compensated relative humidity */
#define         T1      +0.01
#define         T2      +0.00008
    /* Constants for conversion of temperature reading to Centigrade */
//#define         D1      -40.10 //5.0V operation
#define         D1     -39.651 //3.3V operation  geinterpoleerd uit data sheet
#define         D2      +0.01
                
                t = float(tempVal);                                  // ruwe SHT temp waarde omzetten naar float
                tC = ( t / 100 ) - 39.651;                            /* Linear conversion of temperature  geeft te lage waardes met deze wijze van berekening*/
                
                rh = float(humidVal);                                 // ruwe SHT humid waarde omzetten naar float
                rhLin =  C1 + ( C2 * rh ) + ( C3  *  rh * rh );       /* "ticks" to relative H  geeft denk ik de juiste waardes met deze wijze van berekening */
                rhTrue = ( tC - 25 ) * ( T1 +  ( T2 * rh )) + rhLin;  // is compensatie voor als als temp veel afwijkt van 25 graden
            //  rhLin =  -2.0468 +( +0.0367  *  rh ) + ( -0.0000015955  *  rh * rh ); //   waarde volgens datasheet ruwe waarde omrekenen naar werkelijke waarde
            //  Tn = 243.12    constante voor berekening 0 - 50 Dgr above water
            //  m = 17.62  constante voor berekening 0 - 50 dgr boven water
                Dauwpunt = 243.12 * ( log ( rhLin / 100 )  + (( 17.62 * tC) / ( 243.12 + tC ))) /
                           ( 17.62 - ((log( rhLin / 100 )) - ( 17.62 * tC ) / ( 243.12 + tC )));   //  nieuwe berekening volgend de data sheet met rhLin.  
                                      
               char tCValue = tC;
               char rhTrueValue = rhTrue;
               char DauwpuntValue = Dauwpunt;
    
               Serial.print(ReadTimeDate());
               Serial.print(",");
               Serial.print(tCValue,DEC);
               Serial.print(",");
               Serial.print(rhTrueValue, DEC);
               Serial.print(",");
               Serial.print(DauwpuntValue, DEC);
               Serial.print(",");
                    
               port=-0;                   // zet de port weer uit i.v.m. opwarmen sensor  < 10% in tijd spanning erop
            
               delay(100);             // vertraging om port 10 sec uit te schakelen i.v.m. opwarmen. Dus elke 10 sec. een meting.    

               int temperature = 0;
               long pressure = 0;
               b.oss=3;
               long datum;
               bmp085_read_sensors(&b);

               delay(100);
               Serial.print(b.t,1);
               Serial.print(",");
               Serial.println(b.ppa);

               delay(500);

                        {

                        
     File dataFile = SD.open("test0.csv", FILE_WRITE);
    // if the file is available, write to it:
       if (q==0){
                  dataFile.println("DATE        ,TIME        ,Temp        ,Humid       ,Dauwp       ,temp,luchtdr. ");
                       if (dataFile)       {// 00/00/00,00:00:00,23.52,53.67,11.31,12.56, Temp    ,
    
                                  
                                         q=1;
                                          
                                         dataFile.close();
                                          }  
  
 else        
                 {
                    Serial.println("error opening datalog.csv"); // if the file isn't open, pop up an error:
                    
                 }
             }
 else    
                                        {
                                        dataFile.print(ReadTimeDate());
                                        dataFile.print(",");
                                        dataFile.print(tC,2);
                                        dataFile.print(",");
                                        dataFile.print(rhTrue,2);
                                        dataFile.print(",");
                                        dataFile.print(Dauwpunt,2);
                                        dataFile.print(",");
                                        dataFile.print(b.t,1);
                                        dataFile.print(" ,");
                                        dataFile.println(b.ppa);
                                        dataFile.close();
 
                                      }
  
                    }

  }


//=====================================
int RTC_init(){
 pinMode(cs,OUTPUT); // chip select
 // start the SPI library:
 SPI.begin();
 SPI.setBitOrder(MSBFIRST);
 SPI.setDataMode(SPI_MODE3); // both mode 1 & 3 should work
 //set control register
 digitalWrite(cs, LOW);  
 SPI.transfer(0x8E);
 SPI.transfer(0x60); //60= disable Osciallator and Battery SQ wave @1hz, temp compensation, Alarms disabled
 digitalWrite(cs, HIGH);
 delay(10);
}
//=====================================
int SetTimeDate(int d, int mo, int y, int h, int mi, int s){
int TimeDate [7]={s,mi,h,0,d,mo,y};
for(int i=0; i<=6;i++){
if(i==3)
i++;
int b= TimeDate[i]/10;
int a= TimeDate[i]-b*10;
if(i==2){
if (b==2)
b=B00000010;
else if (b==1)
b=B00000001;
}
TimeDate[i]= a+(b<<4);
 
digitalWrite(cs, LOW);
SPI.transfer(i+0x80);
SPI.transfer(TimeDate[i]);        
digitalWrite(cs, HIGH);
  }
}
//=====================================
String ReadTimeDate(){
String temp;
int uur;
int minu;
int sec;
int var;
int ver;
pinMode(7, OUTPUT);

        int TimeDate [7]; //second,minute,hour,null,day,month,year
for(int i=0; i<=6;i++){
if(i==3)
i++;
digitalWrite(cs, LOW);
SPI.transfer(i+0x00);
unsigned int n = SPI.transfer(0x00);        
digitalWrite(cs, HIGH);
int a=n & B00001111;    
if(i==2){
int b=(n & B00110000)>>4; //24 hour mode
if(b==B00000010)
b=20;        
else if(b==B00000001)
b=10;
TimeDate[i]=a+b;
}
else if(i==4){
int b=(n & B00110000)>>4;
TimeDate[i]=a+b*10;
}
else if(i==5){
int b=(n & B00010000)>>4;
TimeDate[i]=a+b*10;
}
else if(i==6){
int b=(n & B11110000)>>4;
TimeDate[i]=a+b*10;
}
else{
int b=(n & B01110000)>>4;
TimeDate[i]=a+b*10;
}
}
temp.concat(TimeDate[4]);
        var=TimeDate[4];   // dit zijn de dagen
        temp.concat("/") ;
temp.concat(TimeDate[5]);
        ver=TimeDate[5];  // dit zijn de maand
temp.concat("/") ;
temp.concat(TimeDate[6]);
temp.concat("     ,") ;
temp.concat(TimeDate[2]);
        uur=TimeDate[2];  // dit zijn de uren
temp.concat(":") ;
temp.concat(TimeDate[1]);
        minu=TimeDate[1];  // dit zijn de minuten
       temp.concat(":") ;
temp.concat(TimeDate[0]);
        sec=TimeDate[0];   // dit zijn de seconden
        temp.concat("      ");
    
        if(uur==23){
          if(minu==59){
            if(sec==58){
              z=1;
            }
          }
        }
    
     if(z==1){   digitalWrite(7,HIGH);  // test of het werkt schakelen op 23 uur 59 minuten en 58 seconden het werkt.
     delay(1000); // hou het signaal 1 seconde hoog

     z=0 ;
     digitalWrite(7, LOW);
    
  
     }


  return(temp);

}
]
Logged

Seattle, WA USA
Online Online
Brattain Member
*****
Karma: 610
Posts: 49016
Seattle, WA USA
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Why are all those #define statements in loop(). They don't need to be there, and they clutter up loop.

You already have code that manipulates time data to produce a String (ugh!). Is there some part of that that you don't understand? Why can't you use the same approach (and data) to construct the file name?
Logged

Holland
Offline Offline
Jr. Member
**
Karma: 0
Posts: 81
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hi,

Pauls,

Thanks for your replay.

Indeed now I think it over the #define belongs to the set-up part.
The original code is from the SHT script. I copied and was happy it works so far.
I will clean up my code and will follow the same aproch to the data stamp issue.

Kind regards,

ilioSS
Logged

Holland
Offline Offline
Jr. Member
**
Karma: 0
Posts: 81
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hello,

Finaly I found what I want and that is the following program line for filename


   char filename[]="";
        sprintf(filename,"%02d-%02d.csv",var,ver);
        Serial.println(filename);
       
               dataFile=SD.open(filename,FILE_WRITE);
Each day i get a file with day-month.

Thanks for all support.

ilioSS

( solved )
               
Logged

Seattle, WA USA
Online Online
Brattain Member
*****
Karma: 610
Posts: 49016
Seattle, WA USA
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
( solved )
No, it isn't.

Code:
   char filename[]="";
You have provided 1 initializer (the NULL), so you have an array capable of holding one character.

Code:
        sprintf(filename,"%02d-%02d.csv",var,ver);
There is no way that 2 + 1 + 2 + 4 +1 characters will fit in a one element array.
Logged

Holland
Offline Offline
Jr. Member
**
Karma: 0
Posts: 81
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hello PaulS,

Thanks for ypur reply.

Sorry to say but my C++ program skills are poor. Nevertheless I have funn to find my way to learn and find solutions for my problems.
One of the problem was the data logging of my humidity, dewpoint temp and barometric press.
I like to log them on a SD card and I like to have it on the card every day a file.
As far as I have it programmed now it is working.

In basic I have the date nd time in the array TimeDate[4] from which I read the var and ver data this I put in the file name by %02d
with the help of sprintf.

enclosed a part of my program and the file as write on the SD card
Code:

 String temp;
        pinMode(7, OUTPUT);
        int TimeDate [7]; //second,minute,hour,null,day,month,year
for(int i=0; i<=6;i++){
                  if(i==3)
        i++;
                digitalWrite(cs, LOW);
                SPI.transfer(i+0x00);
                unsigned int n = SPI.transfer(0x00);       
                digitalWrite(cs, HIGH);
                int a=n & B00001111;   
                if(i==2){
                 int b=(n & B00110000)>>4; //24 hour mode
                 if(b==B00000010)
         b=20;       
                 else if(b==B00000001)
         b=10;
                 TimeDate[i]=a+b;
                        }
else if(i==4){
      int b=(n & B00110000)>>4;
      TimeDate[i]=a+b*10;
             }
else if(i==5){
      int b=(n & B00010000)>>4;
      TimeDate[i]=a+b*10;
             }
else if(i==6){
      int b=(n & B11110000)>>4;
      TimeDate[i]=a+b*10;
             }
  else
                             {
      int b=(n & B01110000)>>4;
      TimeDate[i]=a+b*10;
     }
                   }
        temp.concat(TimeDate[4]);
        var=TimeDate[4];   // dit zijn de dagen
        temp.concat("/") ;
temp.concat(TimeDate[5]);
        ver=TimeDate[5];  // dit zijn de maand
temp.concat("/") ;
temp.concat(TimeDate[6]);
temp.concat("     ,") ;
temp.concat(TimeDate[2]);
        uur=TimeDate[2];  // dit zijn de uren
temp.concat(":") ;
temp.concat(TimeDate[1]);
        minu=TimeDate[1];  // dit zijn de minuten
        temp.concat(":") ;
temp.concat(TimeDate[0]);
        sec=TimeDate[0];   // dit zijn de seconden
        temp.concat("      ");

               delay(100);
               Serial.print(b.t,1);
               Serial.print(",");
               Serial.println(b.ppa);
               Serial.println(ReadTimeDate());
               delay(500);
 
        char filename[]="";
        sprintf(filename,"%02d-%02d.csv",var,ver);
        Serial.println(filename);
          dataFile=SD.open(filename,FILE_WRITE);
          if (q==0)
        {
        dataFile.println("DATE        ,TIME        ,Temp        ,Humid       ,Dauwp       ,temp,luchtdr. ");
                       
                           if (dataFile)       {// 00/00/00,00:00:00,23.52,53.67,11.31,12.56, Temp    ,
                                           q=1;
                                           dataFile.close();
                                           
                                               } 
 else       
                 {
                    Serial.println("error opening datalog.csv"); // if the file isn't open, pop up an error:
                   
                 }
             }

 else     
                                        {
   
                                        dataFile.print(ReadTimeDate());
                                        dataFile.print(",");
                                        dataFile.print(tC,2);
                                        dataFile.print(",");
                                        dataFile.print(rhTrue,2);
                                        dataFile.print(",");
                                        dataFile.print(Dauwpunt,2);
                                        dataFile.print(",");
                                        dataFile.print(b.t,1);
                                        dataFile.print(" ,");
                                        dataFile.println(b.ppa);
                                        dataFile.close();   
                                        } 
       

        if(uur==23){
                    if(minu==59){
                                 if(sec==58){
                                             z=1;
                                            }
                                }
                   }
     
     if(z==1){
              digitalWrite(7,HIGH); 
              delay(1000);
              z=0 ;
              digitalWrite(7, LOW);
              }
 }
Still I have to clean up my script.

ilioSS
Logged

Seattle, WA USA
Online Online
Brattain Member
*****
Karma: 610
Posts: 49016
Seattle, WA USA
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Code:
        char filename[]="";
        sprintf(filename,"%02d-%02d.csv",var,ver);
There is still only room in this array for 1 character, and that character is a NULL.

The sprintf() function will take your word for the fact that the data it creates will fit in the array. You are, of course, lying to it, since your data will NOT fit in the array.

Code:
        char filename[12];
        sprintf(filename,"%02d-%02d.csv",var,ver);
will work, because the 10 characters created by the sprintf() function, and the trailing NULL WILL fit in the 12 element array WITHOUT running out of the defined bounds of the array.

Your data will NOT fit in your array without running out of the defined bounds of the array.
Logged

Pages: [1]   Go Up
Jump to: