Forum: Mikrocontroller und Digitale Elektronik stm32 LCD Float-Wert runden und Nachkommastellen kürzen


von Har (Gast)


Lesenswert?

Hallo liebes Forum,

ich programmiere mit einem stm32f3discovery (auf welchem sich ein 
STM32F303 befindet) und verwende die standard peripheral library von 
STMikroelectronics. An diesem habe ich ein 2004-LCD über eine 
I2C-Schnittstelle angeschlossen.
Ich möchte nun Float-Werte an diesem Display anzeigen lassen.
Dafür habe ich mir eine Funktion geschrieben, welche mir den Float-Wert 
auf beliebige Nachkommastellen rundet. Anschließend wird dieser 
Float-Wert in Char-Werte umgewandelt und in ein Array geschrieben 
(mittels sprintf).

Das Runden und Anzeigen funktioniert, allerdings werden mir nach diesen 
Nachkommastellen weitere Nullen angezeigt.
Ein Beispiel mit 2 Nachkommastellen: Der float-wert -1.2355678 wird am 
LCD als -1.240000 angezeigt. Stattdessen möchte ich, dass am LCD nur 
-1.24 angezeigt wird.

Welche Tipps habe ihr, damit ich mein Problem möglichst effektiv lösen 
kann?
Der Code zum Runden sieht wie folgt aus:


1
void lcd_convert_float(float fvalue, uint8_t decimal_points)
2
{
3
  char string_value[16]={};        // hier wird der in char-umgewandelte Sensorwert gespeichert
4
  float factor = 1;
5
  uint8_t decimal_counter = decimal_points;
6
7
  if (decimal_counter > 2)    // maximal erlaubte Anzahl an Nachkommastellen: 2
8
    decimal_counter = 2;
9
10
  while(decimal_counter)
11
  {
12
    fvalue *= (float)10;
13
    factor *= 10;
14
    decimal_counter--;
15
  }
16
17
  int16_t runden = roundf(fvalue);
18
  fvalue = (float)runden / factor;
19
20
  sprintf(string_value,"%f", fvalue );    // umwandlung von float in char (char-wert wird ins Array geschrieben)
21
  lcd_print(string_value);                       // Wert auf LCD anzeigen
22
}

von fop (Gast)


Lesenswert?

Les Dich mal in die Möglichkeiten von ((s)n)printf ein. Z.B. unter 
https://www.cplusplus.com/reference/cstdio/printf/

Für Dich interressant : die Beschreibung zu .*

von Stefan F. (Gast)


Lesenswert?

Printf kann das doch schon mit "%.2f".

von fop (Gast)


Lesenswert?

Stefan ⛄ F. schrieb:
> Printf kann das doch schon mit "%.2f".

Aber er will ja keine feste 2, also "%.*f".

von Zeno (Gast)


Lesenswert?

fop schrieb:
> Stefan ⛄ F. schrieb:
>> Printf kann das doch schon mit "%.2f".
>
> Aber er will ja keine feste 2, also "%.*f".

Kann man die 2 nicht als Variable definieren? Bei Pascal wäre das kein 
Problem.

von dummschwaetzer (Gast)


Lesenswert?

snprintf(string_value,15,"%.*f", decimal_points,fvalue );
oder
sprintf(string_value,"%.*f", decimal_points,fvalue );
das vorher runden kannst du dir wahrscheinlich ersparen.
kann auch sein, dass decimal_points,fvalue getauscht sen müssen
https://www.tutorialspoint.com/c_standard_library/stdio_h.htm

von Stefan F. (Gast)


Lesenswert?

Zeno schrieb:
> Kann man die 2 nicht als Variable definieren? Bei Pascal wäre das kein
> Problem.

Das wäre mir neu. Auf jeden Fall hindert dich niemand daran, diesen 
Format-String dynamisch (wiederum mit sprintf) zu generieren bevor du 
die Zahl formatierst.

von Zeno (Gast)


Lesenswert?

Stefan ⛄ F. schrieb:
> Das wäre mir neu. Auf jeden Fall hindert dich niemand daran, diesen
> Format-String dynamisch (wiederum mit sprintf) zu generieren bevor du
> die Zahl formatierst.

Den String mit strcat zusammensetzen sollte doch auch möglich sein.
Naja hier zeigen sich wieder mal die Unzulänglichkeiten von C bei 
Stringverarbeitung.
Bei Pascal(Delphi) gibt es da eine einfache Funktion (FloatToStrF()), 
die macht genau das was der TO haben will in einem Rutsch.

von dummschwaetzer (Gast)


Lesenswert?


Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.