Ich möchte für eine Ausgabe auf dem LCD einen Wert auf eine Nachkommastelle begrenzen.
Damit der nachfolgende Text nicht verschoben wird, wenn sich die Zehnerstelle erhöht, gebe ich ein Leerzeichen aus wenn der Wert <10 ist.
Ich habe aber das Problem, dass Werte bis 10.04 als < 10 erkannt werden.
Bei serieller Ausgabe ist das Verhalten gleich:
Dein Code Schnippsel ist auch nicht korrekt, da fehlt schon einmal mindestens eine ‘(’. Desweiteren sehe ich hier auch keine Variablendeklartionen und vermutlich wieder einmal einen unnötigen Einsatz von floats.
Sinnvoller wäre es bei der ganzen Sache vermutlich, auf floats gänzlich zu verzichten. Fressen auf einem 8Bitter unnötig Speicher. Wie sieht deine Berechnung fürs float aus?
sschultewolter:
Dein Code Schnippsel ist auch nicht korrekt, da fehlt schon einmal mindestens eine ‘(’. Desweiteren sehe ich hier auch keine Variablendeklartionen und vermutlich wieder einmal einen unnötigen Einsatz von floats.
Ansonsten könnte
if(Wert < 10.0)
abhilfe schaffen
Stimmt, die Klammer habe ich jetzt oben eingefügt. Das war ein Kopierfehler.
Jetzt auch schon mit “if (Wert < 10.0)” probiert, mit dem gleichen Ergebnis.
In der Endanwendung ist float notwendig, weil mit Nachkommastellen gerechnet werden muss.
Mit wieviel Nachkommenstellen muss gerechnet werden? Bei 2 oder 3 Nachkommastellen würde ich darauf verzichten und den Wert entsprechend mit 10^n multiplizieren.
Alternativ teste mal
// Main Loop
void loop() {
Wert = Wert + 0.01;
if ((int)Wert < 10) Serial.print(" ");
Serial.println(Wert,1);
}
Sicher könnte man float umgehen. Allerdings wird der Wert aus vielen float Werten berechnet, welche ebenfalls am Display angezeigt werden sollen.
Ich könnte natürlich alles ganzzahlig rechnen, muss aber dann für die Darstellung am Display mehr Aufwand treiben.
Die ganzen anderen Werte haben 2 Nachkommastellen und die machen bei der Darstellung am Display dann auch kein Problem.
Mit “((int)Wert < 10)” ändert es leider auch nichts.
Danke für die bisherigen Vorschläge.
Ich werde mir den Vorschlag von Michael jetzt genauer anschauen.
Vielen Dank für eure Hilfe. Mit der dtostrf funktion funktioniert es.
Wieder was gelernt.
Wobei es für mich trotzdem ein Rätsel bleibt wieso das nur auftritt wenn man die Nachkommastellen mit " Serial.print(Wert,1);" begrenzt.
Wenn man es einfach mit Serial.print(Wert); raus schreibt, funktioniert es. Es werden halt dann 2 Nachkommastellen angezeigt.
Wobei es für mich trotzdem ein Rätsel bleibt wieso das nur auftritt wenn man die Nachkommastellen mit " Serial.print(Wert,1);" begrenzt.Wenn man es einfach mit Serial.print(Wert); raus schreibt, …
…werden halt 2 Nachkommastellen angezeigt. Funktioniert aber auch nicht immer.
Da ist der Übergang von 4 Ziffern (9.99) auf 5 Ziffern (10.00) bei 9.995
Deinen Fehler siehst du also z.B. bei 9.997 : LCD braucht 5 Zeichen, obwohl (x < 10.0)
Fehler findet man viel leichter, wenn man sie absichtlich einbaut
Wobei es für mich trotzdem ein Rätsel bleibt wieso das nur auftritt wenn man die Nachkommastellen mit " Serial.print(Wert,1);" begrenzt.
Die Print Klasse ist oft schön, aber auch limitiert. print(float) formatiert Nachkommastellen. Und nur das. Sie berücksichtigt nicht was vor dem Komma steht. Mit dtostrf() kannst du den gesamten String auf eine konstante Breite formatieren. Vorzeichen, Vorkommastellen und der Punkt werden dabei auch gezählt.
sprintf() macht das gleiche für Integer. Wobei man sowas für Integer auch leicht selbst schreiben kann. Hier hatte ich das mal für Integer gemacht: