Datafile.print: Print string problem


dear,

i'am making test station detection of crash. getting al data, use sd-slot on wireless shield. @ moment have working program, store mine data putting every variable whit datafile.print on sd card. (see original program). void loop 40 ms , "datafile.print" need 30ms. moment long.

original program:
code: [select]

 file datafile = sd.open(filename,file_write);         // datafile word geopend en de volgende variabelen worden er in weg geschreven.
 if (datafile){
  datafile.print(sensor1reading);
  datafile.print(",");
  datafile.print(volt);
  datafile.print(",");
  datafile.print(afstand);
  datafile.print(",");
  datafile.print(acceleratiefactor);
  datafile.print(",");
  datafile.print(led1state);
  datafile.print(",");
  datafile.print(led2state);
  datafile.print(",");
  datafile.print(seaftystate);
  datafile.print(",");
  datafile.println(tijd);
  datafile.close();
 
  serial.print(sensor1reading);                       // deze tekst word op de serial monitor afgedrukt.
  serial.print(",");
  serial.print(volt);
  serial.print(",");
  serial.print(afstand);
  serial.print(",");
  serial.print(acceleratiefactor);
  serial.print(",");
  serial.print(led1state);
  serial.print(",");
  serial.print(led2state);
  serial.print(",");
  serial.print(seaftystate);
  serial.print(",");
  serial.println(tijd);
  serial.println(filename);
 
  //delay (500); //500ms
  }
   
 else {serial.println("error opening datalog.txt (controleer sd kaart)");
 serial.println(filename);                           //lukt het niet om weg te schrijven word volgende melding gegeven.
 delay (1000); //1000ms
 }
}



the solution not use many "datafile.print". , have been trying putting first variable in datastring. here problem. use different variables (char, string, time, etc.) , char can't use "+ opperator".

program can find under here.

but have tips or tricks type best declare variables or convert them. can put them  in 1 string need 1 or 2 "datafile.print".

thank time , effort.

tim matthijs

program:
code: [select]
//ultrasoon

#include <string.h>                                        // #include => oproepen van bibliotheek
#include <stdlib.h>
#include <sd.h>
#define aref_voltage 5.0                                   // de 5v word met de aref verbonden en gedefineerd

//pin deffinitie
const int sensor1pin = a15;                                // de 1e sensor word aan de analoge pin 15 verbonden
const int chipselect = 4;                                  // pin voor comunicatie sd kaart
const int seaftypin = 49;                                  // pin die triggert wanneer de robot moet stil vallen
const int led1pin = 48;                                    // pin verbonden met led voor voltage.
const int led2pin = 47;                                    // pin verbonden met led voor acceleratiefactor

//globel variabelen
int sensor1reading = 0;                                    // de waarde van het analoog lezen
float voltage;                                             // de waarde van voltage (moet global om acceleratie te kunnen uitrekenen)
unsigned long tijd;                                        // tijd
char filename[] = "ultson00.txt";                          // naam van text bestand op sd kaart
file logfile;
string seaftystate = "0";
string datafilestring = "";

void setup() {                                             // deze loop word alleen maar doorlopen bij het opstarten.
   serial.begin(9600);                                    // start de serieĆ«le communicatie op aan 9600bits per seconde.
   analogreference(external);                             // voor de analoge uitlezing zal de referentie extern worden aangelegt
   serial.print("initializing sd card...");               // deze tekst word op de serial monitor afgedrukt.
   
   pinmode(10,output);                                    // definitie welk soort de pin is. (input/output)
   pinmode(led1pin,output);
   pinmode(led2pin,output);
   pinmode(seaftypin,output);
           
   if (!sd.begin(chipselect)) {                           // als de sd kaart niet kunnen opstarten. dit melden en opnieuw testen.
   serial.println ("card failed, or not present");
   return;
   }
   
   serial.println("card initialized.");  
 
   
   for (uint8_t = 0; < 100; i++) {                   // in de fillename worden de 2 nullen in de char variabele gedefineert als
   filename[6] = i/10 + '0';                             // een 2 digit getal dat kan optellen van 0 tot 99.
   filename[7] = i%10 + '0';
   if (! sd.exists(filename)) {                          // op de sd kaart word er gecontroleerd op de fille al bestaat. bestaat de
   logfile = sd.open(filename, file_write);              // file niet. maar het aan en open.
   break;
   }
 }  
   file datafile = sd.open(filename,file_write);        
 if (datafile){
  datafile.println("sensor lezen,voltage(v),afstand(mm),acceleratiefactor ,led status,tijd (ms)"); // schrijf deze tekst weg op de sd kaart in de datafile.
  datafile.close();  
  serial.println("sensor lezen,voltage(v),afstand(mm),acceleratiefactor ,led status,tijd (ms)");
}    
digitalwrite(seaftypin,low);                              // zet de uitgang "seaftypin" laag.
 
}

void loop()                                               // het programma
{
 // locale variabelen:
 float versnelling1;
 float versnelling2;
 float acceleratiefactor;
 tijd = millis();                                         //de variabele tijd zal aan duiden hoelang het programa al draait in ms
 string led1state = "0";                                   // declareer de variabel led1state.
 string led2state = "0";                                   // declareer de variabel led2state.

 versnelling2 = voltage;
 
 int sensor1reading = analogread(sensor1pin);            // de analoge input word gelezen en in een waarde omgezet tussen 1024 en 0 (10bit resolutie) gegeven.
                                                         // aref word als hoogste waarde bekeken en dan word er een verdeling van 1024 delen gemaakt.
                                                         // dit geeft een naukeurigheid van 0.00488v bij een aref van 5v.
 
 voltage = sensor1reading * aref_voltage / 1024;         // zet de analoge waarde om naar voltage. geberuik de referentie voltage
 char volt[8] = "";
 dtostrf(voltage,6,2,volt);                              // zet de string voltage om naar een karakteristiek variabel.
//dtostrf(float,width,precsision,buffer)
 
 float distance = (voltage / aref_voltage * 10)+5;                    // bepaal via de spanning de afstand tussen sensor en breekplaat.
 char afstand [8] = "";
 dtostrf(distance,6,2,afstand);
 
 if(voltage > 2 && voltage < 3)  {                       // zolang de spanning tussen bepaalde waarde blijft zal de uitgang laag blijven
   digitalwrite(led1pin,low);
   led1state = 0;
 }
 else {digitalwrite(led1pin,high);                        // zo niet word de uitgang hoog.
   led1state = "1";
   digitalwrite(seaftypin,high);
   seaftystate = "1";
 }
 
 versnelling1 = voltage;                                
 if(tijd > 500) {                                       // om er vroeg tijdig te schakelen word pas na 500ms gekeken naar deze vergelijking.
   acceleratiefactor = versnelling1 - versnelling2;     // de acceleratiefactor word uitgerekend. zo lang dat hij onder de 0.5 blijft word er niet geschakeld.
   if(acceleratiefactor >= -0.5 && acceleratiefactor <= 0.5){
     digitalwrite(led2pin,low);
     led2state = "0";      
   }
   
   else {digitalwrite(led2pin,high);
      led2state = "1";
      digitalwrite(seaftypin,high);
      seaftystate = "1";
 }
}
 datafilestring = sensor1reading+","+volt+","+afstand+","+acceleratiefacotr+","+led1state+","+led2state+","+seaftystate+",";
 file datafile = sd.open(filename,file_write);         // datafile word geopend en de volgende variabelen worden er in weg geschreven.
 if (datafile){
   datafile.print(datafilestring);
   datafile.println(tijd);
     
  serial.print(datafilestring);                       // deze tekst word op de serial monitor afgedrukt.
  serial.println(tijd);
 
  //delay (500); //500ms
  }
   
 else {serial.println("error opening datalog.txt (controleer sd kaart)");
 serial.println(filename);                           //lukt het niet om weg te schrijven word volgende melding gegeven.
 delay (1000); //1000ms
 }
}

quote
but have tips or tricks type best declare variables or convert them. can put them together  in 1 string need 1 or 2 "datafile.print".

you can create character array, , use sprintf() populate array kinds of data.

quote
the void loop 40 ms , "datafile.print" need 30ms. moment long.

how did measure this? why keeping write time under 30ms important when have this:
code: [select]
  delay (1000); //1000ms
and comment contribute anything?


Arduino Forum > Using Arduino > Programming Questions > Datafile.print: Print string problem


arduino

Comments

Popular posts from this blog

Thread: PKI Client 5.00 install (for eToken Pro)

ATmega2560-Arduino Pin Mapping

Crossfader Arduino Tutorial