Due - float to String

Moin

Mein Problem ist, wie kann ich auf einem Due eine float zu einem String umbauen? Genauigkeit brauch ich auf 2 Nachkommastellen. Die Zahlen bewegen sich zwischen 6.00 und 8.40 und die sollen auf dem TFT ausgegeben werden.

Code ist aussm Kopf geschrieben, glaube aber so sieht das aus:

float UAkt;

void setup() {
  analogReadResolution(12);
}

void loop() {
  UAkt = ((analogRead(A7)*(2,96/4096))*5100)/1800;
}

Ich habe schon mehrere Ansätze probiert aber irgendwie scheint das alles nicht für den Due zu taugen.

  • floatToString als Funktion kennt er nicht;
  • dtostrf kennt er nicht;
  • selbst wenn ich manuell "#include<stdlib.h>" hinzufüge findet er dtostrf nicht;
  • hatte was mit händischem zu Int gefunden aber funktionierte auch nicht.

Langsam bin ich mit meinem Latein am Ende. Hat jemand ne brauchbare Lösung für mich, bitte?

Danke und Grüße

Sijjim:
Ich habe schon mehrere Ansätze probiert aber irgendwie scheint das alles nicht für den Due zu taugen.

Beim Due funktioniert die Formatierung mit sprintf/snprintf mit %f Parameter.

Z.B.:

  snprintf(buffer,sizeof(buffer),"%6.2f",f);
  Serial.println(buffer);

Der DUE hat viel mehr RAM-Speicher als die 8-Bit AVRs, so dass die %f-Gleitkommaformatierung für dieses Board nicht deaktiviert ist, sondern normal funktioniert.

Perfekt, vielen Dank.
Kann allerdings erst heute abend testen.

Auch heute Abend funktionierts noch :wink: :wink: :wink:
Grüße Uwe

Genauigkeit brauch ich auf 2 Nachkommastellen. Die Zahlen bewegen sich zwischen 6.00 und 8.40

Da sehe ich überhaupt keine Notwendigkeit für float. Arbeite mit int und dem Bereich von 600-840 und teile für die Ausgabe einfach durch 100. (Nachkommestellen (=Rest) mit modulo berechnen (%))
Wenn Zahlen außerhalb von 6-8.4 tatsächlich nicht vorkommen kannst du mit einem Offset von 6 sogar mit einem einzigen Byte auskommen. Falls der Speicher auf dem Due mal zu knapp wird. :wink:

Stimmt, ist natürlich auch eine Variante, Dankeschön.

Als Entschuldigung, das ist ein älteres Projekt auf einem Mega, was in laufe der Zeit extrem gewachsen ist. Die Spannungsanzeige war eines der ersten Module und da dies problemlos lief hab ich das nie angefasst. Jetzt beim "übersetzen" auf Due kommen halt diese ganzen alten Dinger wieder hervor.

gsezz:
Wenn Zahlen außerhalb von 6-8.4 tatsächlich nicht vorkommen

Das ist für die Spannungsanzeige des Stromliefernden Lipos. Wenn da über 8,4 stehen sollten herrscht akute Brandgefahr und wenn weniger steht mach ich mir um die Stabilität das Arduinos mehr sorgen als um die Anzeige.

Aber ich denke mal, so schnell wird der Speicher nicht knapp.

jurs:
Der DUE hat viel mehr RAM-Speicher als die 8-Bit AVRs, so dass die %f-Gleitkommaformatierung für dieses Board nicht deaktiviert ist, sondern normal funktioniert.

Der Grund weshalb die nicht implementiert ist, ist glaube ich eher Flash Speicher. Man braucht zwar auch einiges an RAM um die var_args zu übergeben und zu parsen, aber das ist für alle Parameter gleich. Die Float Formatierung frisst aber viel Flash.

Oh Mann.... manchmal könnte ich so... Kopf -> Tisch hin&her

Ich nutze zur Anzeige ein 5" TFT mit der Lib UFTF. Dort hab ich immer das

print(st, x, y);

genutzt. Jetzt sehe ich durch zufall, es gibt auch ein

printNumF(num, dec, x, y[, divider[, length[, filler]]]);

Ok, aber snprintf hat auch funktioniert, Danke nochmal

Auf dem Due verwendet printfNumF() auch sprintf() mit dem Umweg über eine _convert_float() Funktion:

void UTFT::_convert_float(char *buf, double num, int width, byte prec)
{
 char format[10];
 
 sprintf(format, "%%%i.%if", width, prec);
 sprintf(buf, format, num);
}

Auf dem AVR wird das sparsamere dtostrf() verwendet