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:
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:
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); //1000msand comment contribute anything?
Arduino Forum > Using Arduino > Programming Questions > Datafile.print: Print string problem
arduino
Comments
Post a Comment