Probleme mit float und erste Nachkommastelle 0

Hallo Zusammen,

ich habe da ein kleines Problem und finde den Fehler nicht.

Ich lese von einem ADC die Spannung eines Sensors aus. Das funktioniert auch wunderbar.
Diesen lese ich wie folgt aus:

double ADC1;
char float_str[20];

int value1 = ads.readADC_SingleEnded(0);

ADC1 = value1;

//4-20mA
ADC1 = (ADC1 * 0.1875) / 1000; //nach Spannung umrechnen
ADC1 = (ADC1 * 6.82) - 0.0149; //Spannung nach mA umrechnen

PRINT_CSTSTR("%s", "ADC1 is ");
PRINT_VALUE("%f", ADC1);
PRINTLN;

Der Wert wird korrekt als z.B. 8.07 angezeigt. (Klar kann man diese konvertriererei besser machen. Ist aber derweil nur zum Spielen). Nun ist es so, wenn ich einen Float to String haben möchte, mache ich dies so:

ftoa(float_str, ADC1, 4);

Serial.print("ADC1 is ");
Serial.println(ADC1); //Hier werden die 8,07 korrekt angezeigt
Serial.println(float_str); // Und hier kommt mein Problem

Beim Float bekomme ich ein riesen Problem. Der berechnete Wert um vier Nachkommastellen ist 8.0678 (Wird ja auf 8.07 gerundet). Gebe ich den float_str allerdings aus, kommt hier 8.6788 raus. Er verschluckt also nach der Dezimalstelle die 0. Dies macht er allerdings immer, wenn der Wert X.0X wäre.

Alles was über 0 ist, wird korrekt ausgegeben. Nun meine Frage. Was ist hierbei der Fehler?

Wäre schön, wenn mir hier jemand helfen könnte. Ich habe leider keine Idee.

Liebe Grüße

Frannek

Du suchst dtostrf anstelle von atof.

Gruß Tommy

Hmmm... bedeutet, dass ich hier ein Problem habe?:

char *ftoa(char *a, double f, int precision)
{
long p = {0, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000};

char *ret = a;
long heiltal = (long)f;
itoa(heiltal, a, 10);
while (*a != '\0') a++;
*a++ = '.';
long desimal = abs((long)((f - heiltal) * p[precision]));
itoa(desimal, a, 10);
return ret;
}

Hmmm... bedeutet, dass ich hier ein Problem habe?:

-->Genau, wollte gerade schreiben, dass es ftoa() so gar nicht gibt, und dass er nen Fehler ausgeben müsste.... nun hast ja den Rest angeliefert^^
Kannst es ja mal mit dieser selbstgeschrieben Funktion versuchen

Danke. Oh je, so langsam verzweifle ich. Wenns nicht so ein komplexes Programm wäre, wäre es sicher einfacher g. Es war eine Vorlage für nen Datenfunk und habs extrem angepasst und jetzt macht das Float ein Problem g

Also, jetzt bekomme ich jedenfalls nen Fehler:

cannot convert 'char*' to 'float' for argument '1' to 'char* ftoa(float, char*, uint8_t)'

ftoa(float_str, ADC1, 4);

Hast du zufällig eine Idee?

Deutlicher kann ein Fehler doch nicht werden. Schau dir die Parameter-Liste in der Fehlermeldung an. Die stimmt nicht mit deiner Funktion oben überein

Auch das ist eindeutig:

cannot convert ‘char*’ to ‘float’ for argument ‘1’ to 'char*

Auf den AVR Prozessoren gibt es dazu wie gesagt dtostrf() weil printf() da nicht mit Floats arbeitet:
http://www.atmel.com/webdoc/avrlibcreferencemanual/group__avr__stdlib_1ga060c998e77fb5fc0d3168b3ce8771d42.html