problem float to string

hello everybody,

(before hand sorry for my bad english, i am from the netherlands)

I have a problem in a program with a floatingpoint value what i want to store to a sd-card in a string.

here is the program:

// eerste versie van de versnellingslogger voor de ADXL 335.
// deze stuurt de g-kracht waardes via serial uit en slaat deze op in de sd kaart. 

#include <SD.h>
#include<stdlib.h>

int x, y, z;

const int chipSelect = 8;   // de chipslect pin is 8 op sparkfun micro sd shield.


#define ADC_ref 2.56

#define zero_x 1.327  // hiermee kreeg ik -1 g bij vlak op de x kant liggen.

#define zero_y 1.327  // hiermee kreeg ik -1 g bij vlak op kant liggen op y kant.

#define zero_z 1.339  // hiermee kreeg ik -1 g bij plat liggen (aarde is 1g dus klopt).

#define sensitivity_x 0.3

#define sensitivity_y 0.3

#define sensitivity_z 0.3

float xv;
float yv;
float zv;





void setup()
{
  Serial.begin(9600);      // serial snelheid naar 9600 zetten
  
  pinMode(10, OUTPUT);     // nodig om sd library te laten werken
  
  
    // kijken of kaart geinstalleerd is en kan worden gebruikt:
  if (!SD.begin(chipSelect)) {
    Serial.println("SD fout, of niet aanwezig");
    // niets anders meer doen:
    return;
  }
  Serial.println("SD klaar.");
  

}



void loop()
{
 
  
  x = analogRead(0);       // lees analoge input pin0
  y = analogRead(1);       // lees analoge input pin1
  z = analogRead(2);       // lees analoge input pin2
  
  
 Serial.print("analoog van x, y, z: ");
 
 Serial.print(x, DEC);    // print de acceleratie van de x as
 Serial.print(" ");       // print een spatie tussen de nummers

  
 Serial.print(y, DEC);    // print de acceleratie van de y as
 Serial.print(" ");       // print een spatie tussen de nummers

  
 Serial.println(z, DEC);  // print de acceleratie van de Z as
 Serial.print(" ");       // print een spatie tussen de nummers
 

  
  
  Serial.print("g-krachten van x, y, z: ");
  
  Serial.print (xv);
  Serial.print(" g ");
  Serial.print(" ");       // print een spatie tussen de nummers
  Serial.print (yv);
  Serial.print(" g ");
  Serial.print(" ");       // print een spatie tussen de nummers
  Serial.print (zv);
  Serial.print(" g "); 
  

  
  xv=(x/1024.0*ADC_ref-zero_x)/sensitivity_x;
  
  yv=(y/1024.0*ADC_ref-zero_y)/sensitivity_y;
  
  zv=(z/1024.0*ADC_ref-zero_z)/sensitivity_z;
  
  
  // hier komt het sd kaart gedeelte voor wegschrijven van de analoge waarde van de versnellingsmeter.
  
  String analoogString = ""; //de string analoogString aanmaken 
  
  for (int analogPin = 0; analogPin < 3; analogPin++) {
    int sensor = analogRead(analogPin);
    analoogString += String(sensor);
    if (analogPin < 2) {
      analoogString += ","; 
    }
  }
  
  File AnaloogFile = SD.open("datalog.txt", FILE_WRITE);  // een bestand openen, pas op kan er maar 1 tegelijk open hebben, moet dan eerst de andere sluiten
  
  // als het bestand er is ernaar schrijven:
  if (AnaloogFile) {
    AnaloogFile.println(analoogString);
    AnaloogFile.close();

    Serial.println(analoogString);
    
    delay(2); 
    
 
  } 


  else {
    Serial.println("fout AnaloogFile.txt"); // als het bestand niet open is dan error melding tonen.


  }
  
  

  
  
// ---------------------------------------------------------------------------------------------------  
  
  
// hier het gedeelte voor het opslaan van de digitale waardes van de g krachten (moet nog afmaken)

String DigiString = ""; //de string DigiString aanmaken

// hier het gedeelte code om de data in een string met de naam DigiString te zetten.


String digixgString = ""; //de string digixgString aanmaken om de g krachten op de x-as in op te slaan
String digiygString = ""; //de string digiygString aanmaken om de g krachten op de y-as in op te slaan
String digizgString = ""; //de string digizgString aanmaken om de g krachten op de z-as in op te slaan


// de variable xv in een de string digixgString zetten
  digixgString += (xv);  // wodt nu gerond op 10 maar moet een commagetal krijgen 1,... weet nog niet hoe!!!

// de variable yv in een de string digiygString zetten
  digiygString += (yv);
  
// de variable zv in een de string digivgString zetten
  digizgString += (zv);
  


DigiString = (digixgString+":"+digiygString+":"+digizgString);  // hier de stringen samenvoegen



File digiFile = SD.open("digilog.txt", FILE_WRITE);  // een bestand openen, pas op kan er maar 1 tegelijk open hebben, moet dan eerst de andere sluiten
  
  // als het bestand er is ernaar schrijven:
  if (digiFile) {
    digiFile.println(DigiString);
    digiFile.close();

    Serial.println(DigiString);
    
    delay(5); 
  } 


  else {
    Serial.println("fout DigiFile.txt"); // als het bestand niet open is dan error melding tonen.


  }
  
  
}

when i let the IDE check the code i get the error 'ambiguous overload for operator += in digixgString += xv'

the problem in in this part of the code:

String DigiString = ""; //de string DigiString aanmaken



String digixgString = ""; //de string digixgString aanmaken om de g krachten op de x-as in op te slaan
String digiygString = ""; //de string digiygString aanmaken om de g krachten op de y-as in op te slaan
String digizgString = ""; //de string digizgString aanmaken om de g krachten op de z-as in op te slaan


// de variable xv in een de string digixgString zetten
  digixgString += (xv);  // wodt nu gerond op 10 maar moet een commagetal krijgen 1,... weet nog niet hoe!!!

// de variable yv in een de string digiygString zetten
  digiygString += (yv);
  
// de variable zv in een de string digivgString zetten
  digizgString += (zv);
  

DigiString = (digixgString+":"+digiygString+":"+digizgString);  // hier de stringen samenvoegen

then i tried to do this: digixgString += (xv,DEC); but the result on the sd-card is than 10 as result, and i want 1.142 enz......

when that did not work i found the dtostrf function but that didnt work (my fault???), i got 10:10 enz...

static char xvgoed[15];
dtostrf(xv,5,2,xvgoed);

DigiString = (xvgoed[15]+":"+digiygString+":"+digizgString);

thanks in advance.

kind regards,

LordP

thanks will try it........

i have problems with emplementing it in my code, could somebody show me?

Thanks,

LordP

i have seen it and experimented with it but i dont understand it.

could you show me how i must do it with my code?

sorry i am an arduino noob...

thanks in advance,

Lordp

Does the example work?

the example puts out the folowing serial data:

+Inf
+Inf
NaN

-0.d: -0.5 4
0.d: 0.5 3
-d.0: -1.0 4
d.0: 1.0 3
-d.d: -1.5 4
d.d: 1.5 3
-dd.d:-30.0 5
dd.d: 30.0 4

-0.0: 0.0 3
0.0: 0.0 3
-d.0: -1.0 4
d.0: 1.0 3
-d.0: -1.0 4
d.0: 1.0 3
-dd.0:-30.0 5
dd.0: 30.0 4

-0.d0: -0.50 5
0.d0: 0.50 4
-d.00: -1.00 5
d.00: 1.00 4
-d.d0: -1.50 5
d.d0: 1.50 4
-dd.d0:-30.00 6
dd.d0: 30.00 5

sorry but i barely understand strings, so this problem is to big for me alone...

or is there an other wat to save the value's from xv yv and zv ??

the analoge value's are saved correctly.

Lordp

There is NO reason to stuff all the information into strings or Strings before writing to the SD card. Using multiple print(), println() and/or write() calls to write to the SD card will not result in a larger sketch, slower operation, or increased memory utilization. So, just print() each string or value to the file as needed. The print() function KNOWS how to convert a float to a string.

like so ?:

File digiFile = SD.open("digilog.txt", FILE_WRITE);  // een bestand openen, pas op kan er maar 1 tegelijk open hebben, moet dan eerst de andere sluiten
  
  // als het bestand er is ernaar schrijven:
  if (digiFile) {
    digiFile.println(xv);
    digiFile.print(yv);
    digiFile.print(zv);
    digiFile.close();

i am new to sd-cards and arduino and dont understand everthing yet.

kind regards,

Lordp

thanks that worked for me.....

Kind Regards,

Lordp