HOWTO · Arduino
Arduino Serial Drucken Mehrere Variablen
Mit den Funktionen Serial.print() und Serial.println() können variable Werte auf dem seriellen Monitor angezeigt werden.
Auf dieser Seite
Um mehrere Variablenwerte im Arduino Serial Monitor anzuzeigen, initialisieren Sie die serielle Kommunikation mit Serial.begin() und senden Sie jeden Wert mit Serial.print() oder Serial.println(). Aufeinanderfolgende Aufrufe von Serial.print() schreiben in dieselbe Zeile; Serial.println() beendet die Ausgabe des Werts mit einem Zeilenumbruch. Fügen Sie zwischen den Werten Text ein, damit das Ergebnis leichter lesbar ist. Stellen Sie den Serial Monitor auf dieselbe Baudrate wie Serial.begin() ein.
Das vollständige Beispiel unten zeigt Werte mit Trennzeichen in einer Zeile, die Genauigkeit bei Gleitkommazahlen, Werte in separaten Zeilen und ein sich änderndes Wertepaar. Ein kleiner Host-Shim ermöglicht es, denselben Quelltext als standardkonformes C++ auszuführen: Auf einem Arduino stellt der Board-Core Serial und delay() bereit; auf einem Computer schreibt der Shim in die Standardausgabe und führt zwei Beispieldurchläufe aus. Wenn Sie ein Board verwenden, stellen Sie den Serial Monitor auf dieselbe Baudrate wie Serial.begin() ein.
Mehrere Werte mit Serial.print() in einer Zeile ausgeben
Serial.print() wandelt einen Wert in Text um und gibt ihn aus, ohne einen Zeilenumbruch hinzuzufügen. Rufen Sie die Funktion nacheinander für jedes Feld auf und geben Sie zwischen den Feldern ein Trennzeichen aus. Das Beispiel verwendet einen Tabulator ("\t") zwischen einem Temperatur- und einem Luftfeuchtigkeitswert. Die Ausgabe enthält daher ein Tabulatorzeichen und nicht die beiden sichtbaren Zeichen Backslash und t.
Bei Gleitkommawerten gibt das optionale zweite Argument an, wie viele Stellen nach dem Dezimaltrennzeichen ausgegeben werden. Serial.print(temperature, 2) fordert hier zwei Nachkommastellen an. Das ändert die Darstellung, nicht den in der Variablen gespeicherten Wert. Ein abschließender Aufruf von Serial.println() beendet die Zeile mit einem Zeilenumbruch. Das optionale Genauigkeitsargument gilt für die Darstellung von Gleitkommazahlen; Ganzzahlen werden als ganze Zahlen ausgegeben.
Werte mit Serial.println() in separaten Zeilen ausgeben
Verwenden Sie Serial.println(value), wenn jeder Wert in einer eigenen Zeile stehen soll. Die Funktion gibt den Wert aus und fügt anschließend einen Zeilenumbruch ein. Aufeinanderfolgende Aufrufe ergeben daher eine Liste untereinander. Im Sketch bleiben Beschriftung und zugehöriger Wert zusammen: Für jede Beschriftung wird Serial.print() verwendet, für den dazugehörigen Wert Serial.println().
Öffnen Sie den Serial Monitor mit 9600 Baud, passend zu Serial.begin(9600). Bei einer anderen Baudrate können die empfangenen Zeichen unleserlich erscheinen, obwohl der Sketch die vorgesehenen Werte sendet. Jeder Aufruf von Serial.println() gibt seinen Wert mit einem anschließenden Zeilenumbruch aus, sodass der nächste Aufruf in einer neuen Zeile beginnt.
Beide Funktionen kombinieren, um sich ändernde Werte auszugeben
Für wiederholte Messwerte geben Sie zunächst den ersten Wert und ein Trennzeichen mit Serial.print() aus und anschließend mit Serial.println() den letzten Wert der Zeile. Die Schleife unten gibt ein sich änderndes Wertepaar aus: Zwischen den Werten steht ein Tabulator, und nach jedem Paar folgt ein Zeilenumbruch. Vor dem nächsten Durchlauf wird der Luftfeuchtigkeitswert erhöht; der zweite Wert ist stets um fünf größer. Auf einem Board wird die Schleife wiederholt und zwischen den Zeilen kurz pausiert. Der Host-Shim führt zwei Durchläufe aus, damit die Änderungen in der Ausgabe sichtbar werden. Die Abschnitte zu Werten in derselben und in separaten Zeilen beziehen sich auf dieses eine vollständige Beispiel. So bleiben Variablendeklarationen und serielle Einrichtung an einer Stelle.
Wenn ein anderes Programm die Zeilen einliest, behalten Sie beim Anpassen des Sketches die Reihenfolge der Felder und das Trennzeichen bei. Änderungen daran können die Verarbeitung durch dieses Programm beeinträchtigen. Der Host-Shim demonstriert nur die Formatierung; er simuliert weder ein Board noch den Serial Monitor.
Führen Sie dieses Beispiel aus. Der Host-Shim schreibt in die Standardausgabe; auf einem Board stellt der Arduino-Core dieselben Serial-Aufrufe und die wiederholt ausgeführte loop() bereit. Die im unveränderten Code ausgegebenen Beschriftungen wie „Temperature“ und „Humidity“ sowie die Beispielausgabe bleiben auf Englisch.
#ifndef ARDUINO
#include <iostream>
class HostSerial {
public:
void begin(unsigned long) {}
void print(const char* value) { std::cout << value; }
void print(int value) { std::cout << value; }
void print(double value, int digits = 2) {
std::cout.setf(std::ios::fixed);
std::cout.precision(digits);
std::cout << value;
std::cout.unsetf(std::ios::fixed);
}
void println(const char* value) { print(value); std::cout << '\n'; }
void println(int value) { print(value); std::cout << '\n'; }
void println(double value, int digits = 2) { print(value, digits); std::cout << '\n'; }
};
HostSerial Serial;
void delay(unsigned long) {}
#endif
int humidity = 40;
void setup() {
Serial.begin(9600);
}
void loop() {
float temperature = 23.456;
Serial.print("Temperature: ");
Serial.print(temperature, 2);
Serial.print("\t");
Serial.print("Humidity: ");
Serial.println(humidity);
Serial.print("Temperature on its own line: ");
Serial.println(temperature, 2);
Serial.print("Humidity on its own line: ");
Serial.println(humidity);
int first = humidity;
int second = humidity + 5;
Serial.print(first);
Serial.print("\t");
Serial.println(second);
humidity++;
delay(1000);
}
#ifndef ARDUINO
int main() {
setup();
loop();
loop();
}
#endif
Temperature: 23.46 Humidity: 40
Temperature on its own line: 23.46
Humidity on its own line: 40
40 45
Temperature: 23.46 Humidity: 41
Temperature on its own line: 23.46
Humidity on its own line: 41
41 46