In diesem Beitrag möchte ich dir gerne zeigen, wie du effektiv Zahlen formatieren kannst. Damit knüpfe ich an den Beitrag Arduino Programmierung: Ausgabe formatierter Strings / Zeichenketten an, wo ich dir bereits ausführlich gezeigt habe, wie du Strings formatierst.
Inhaltsverzeichnis
- Wann muss ich Zahlen formatieren?
- Formatieren von Gleitkommazahlen
- Formatieren von natürliche Zahlen
- Fazit – Formatierung von Zahlen am Arduino
Wann muss ich Zahlen formatieren?
Wenn du Sensordaten auf einem Display anzeigen möchtest, dann hast du nur begrenzten Platz somit musst du diese Werte auf ein bestimmtes Format einschränken. Zumeist wirst du hier die Nachkommastellen manipulieren.
Bei der Kommunikation zwischen verschiedenen Geräten, sei es über serielle Verbindungen oder drahtlose Protokolle, ist die richtige Formatierung der Zahlen wichtig, um sicherzustellen, dass die Daten korrekt interpretiert werden können. Dies könnte die Verwendung von festen Breitendaten oder das Senden von Zahlen als Teil von Zeichenketten umfassen.
Wenn du Benutzereingaben in deinem Arduino-Programm verarbeitest, musst du sicherstellen, dass die eingegebenen Zahlen im erwarteten Format sind. Dies könnte die Umwandlung von Zeichenketten in numerische Werte und die Berücksichtigung von Dezimalstellen oder negativen Zahlen umfassen.
Formatieren von Gleitkommazahlen
Zunächst zeige ich dir, wie du Gleitkommazahlen formatieren kannst. Diese Zahlen können zum Beispiel von einem Sensor kommen und die Ausgabe könnte dann auf einem kleinen OLED-Display erfolgen.
Funktion zum Generieren von Zufallszahlen
Damit wir die nachfolgenden Beispiele ohne eine Schaltung ausprobieren können, habe ich eine kleine Funktion zum Generieren von Zufallszahlen erstellt.
long zufallszahl; void setup() { Serial.begin(9600); randomSeed(analogRead(0)); } double findRandomFloatpointNumber() { zufallszahl = random(100); return zufallszahl * 0.835; } void loop() { double value = findRandomFloatpointNumber(); Serial.print("Zufallszahl: "); Serial.println(value); delay(500); }
Diese Funktion liefert Zufallszahlen mit zwei Nachkommastellen, mit welchen wir nun arbeiten können.
Runden von Gleitkommazahlen
Mit der Funktion round kannst du eine Gleitkommazahl kaufmännisch auf und abrunden lassen. Dazu musst du deinen Wert lediglich als Parameter übergeben und erhältst als Rückgabewert den gerundeten Wert.
double value = findRandomFloatpointNumber(); Serial.print("Zufallszahl: "); Serial.print(value); Serial.print(" > gerundet: "); Serial.println(round(value));
Im seriellen Monitor geben wir jetzt die ermittelte Zufallszahl sowie die gerundete Zahl aus.
Formatieren einer Gleitkommazahl auf eine Nachkommastelle
Wenn wir nur eine Nachkommastelle benötigen, dann müssen wir den Gleitkommawert auf eine Stelle nach dem Komma manipulieren. Dazu habe ich mir eine kleine Funktion geschrieben, welche dieses für mich universal erledigt.
Dieser Funktion werden zwei Parameter übergeben, zum einen die Gleitkommazahl und die gewünschte Anzahl der Nachkommastellen.
//Funktion zum runden einer Gleitkommazahl //auf eine Stelle nach dem Komma. double roundWithDigits(double value, int digits) { return floor(value * pow(10, digits)) / pow(10, digits); }
Mit dieser Funktion können wir jetzt sehr einfach die Zufallszahl auf eine Stelle nach dem Komma kürzen.
double gekuerzteZahl = roundWithDigits(value, 1); Serial.print(" > gekürzte Zahl: "); Serial.println(gekuerzteZahl);
In der Ausgabe sehen wir jetzt, dass nicht gerundet wird, sondern zweite Stelle nach dem Komma hart abgeschnitten wird.
Alternative Lösung mit truncf
Auf Stackoverflow habe ich eine Lösung gefunden, welche eine Gleitkommazahl mit der Funktion truncf auf eine Stelle nach dem Komma kürzt.
double gekuerzteZahl = truncf(value * 10) / 10;
Formatieren von Zahlen mit dtostrf
In diesem Beispiel wird dtostrf
verwendet, um die Gleitkommazahl in einen char-Array zu konvertieren und dabei die gewünschte Anzahl von Nachkommastellen zu berücksichtigen.
Du musst jedoch darauf achten das, das char Array für den Wert groß genug sein muss!
//char Array für den späteren formatierten Wert char buffer[5]; //Konstanten für die Parameter der Funktion dtostrf const int stellenVorDemKomma = 4; const int stellenNachDemKomma = 1; //erster Parameter, der Gleitkommawert welcher formatiert werden soll //zweiter Parameter, wieviele Stelle maximal vor dem Komma sein sollen, //dritter Parameter, wieviele Stellen maximal nach dem Komma sein sollen, //vierter Parameter, das char Array in welchen der Wert geschrieben werden soll dtostrf(value, stellenVorDemKomma, stellenNachDemKomma, buffer);
Wenn wir uns nun die Ausgabe betrachten, dann wird nicht wie im Beispiel zuvor einfach die zweite Nachkommastelle abgeschnitten, sondern auf eine Stelle nach dem Komma kaufmännisch gerundet.
Damit haben wir jetzt die Möglichkeit Messwerte wie Temperatur, Abstand, etc. mit einer größeren Genauigkeit anzuzeigen.
Formatieren von natürliche Zahlen
Natürliche Zahlen sind eine Menge von positiven ganzen Zahlen, die ab der Zahl 1 beginnen und sich unendlich in aufsteigender Reihenfolge fortsetzen.
Anders als bei Gleitkommazahlen gibt es wenig Anwendungsfälle natürliche Zahlen zu formatieren. Jedoch können wir diese Zahlen mit führenden Nullen oder Zeichen auffüllen, um so ein bestimmtes Muster zu erfüllen.
char buffer[10]; sprintf(buffer,"%09d", value); Serial.print(" > führende Nullen: "); Serial.println(buffer);
In der Ausgabe siehst du das die Zufallszahlen auf maximal 9 Stellen erweitert werden. Wenn jetzt die Zahl kleiner als 10 ist, wird eine Null mehr hinzugefügt.
Fazit – Formatierung von Zahlen am Arduino
Mit diesem Beitrag habe ich dir soeben ein paar Wege gezeigt, wie du Zahlen am Arduino formatieren kannst. Dabei bin ich speziell auf die Gleitkommazahlen eingegangen, da diese doch recht öfters vorkommen und gerne verarbeitet werden.
Im nächsten Beitrag zeige ich dir dann, wie du diese Zahlen untereinander konvertieren und so zwischen den Datenformaten wechseln kannst.