Zum Hauptinhalt springen

Der serielle Monitor des Arduino

Bisher ist die Kommunikation mit dem Arduino relativ einseitig. Es wird ein Programm am PC geschrieben, auf den Arduino übertragen und anschließend leuchtet eine LED auf. Auf dem PC wird das Programm geschrieben, der Arduino führt es aus. Wenn das Programm funktioniert, die LEDs also wie gewünscht aufleuchten, ist alles gut. Sollte das Programm aber nicht auf Anhieb funktionieren (was leider meistens der Fall ist), wäre es wünschenswert, wenn uns der Arduino Informationen zum PC zurückschickt, damit wir untersuchen können, wo das Programm evtl. fehlerhaft ist. Das kann mit dem seriellen Monitor der Arduino IDE gemacht werden.

Die serielle Schnittstelle

Die serielle Schnittstelle ist eine Möglichkeit, nach dem Hochladen des Programms mit dem Arduino zu kommunizieren. Sie ermöglicht es, über den USB-Anschluss Daten vom Arduino zu empfangen, aber auch Daten zum Arduino zu senden. Hierbei bedeutet seriell, dass die Daten, ähnlich wie beim Morsen, nacheinander übertragen werden.

Auf den meisten Arduino-Boards befinden sich zwei mit RX und TX markierte LEDs. Diese LEDs zeigen an, ob mit der seriellen Schnittstelle gerade Daten empfangen (RX - receive) oder gesendet (TX - transmit) werden. Falls die serielle Schnittstelle mal nicht funktioniert, ist ein Blick auf die beiden LEDs immer ganz hilfreich. (Warum leuchten die RX und TX LEDs beim Hochladen des Programms?)

"Hallo Welt" Beispiel

In einem einfachen Beispiel soll der Arduino "Hallo Welt!" zum PC schicken, so dass es mit dem seriellen Monitor in der Arduino IDE gelesen werden kann. Außerdem wird der Zustand der Zählvariablen zaehler ausgegeben.

https://wokwi.com/arduino/projects/318942757864342098
/* Dieses Beispiel zeigt, wie vom Arduino Daten zum PC gesendet werden. */

int zaehler = 0;

void setup(){
Serial.begin(9600); // initialisieren der seriellen Schnittstelle
Serial.println("Hallo Welt. Das wird nur einmal ausgegeben.");
}
void loop(){
Serial.print("Zaehlerstand: "); // Text ohne Zeilenvorsprung schreiben
Serial.println(zaehler); // Wert der Variablen schreiben
zaehler = zaehler + 1;
}

Serieller Monitor

Öffnen Sie mit dem Lupensymbol oben rechts in der Arduino IDE den seriellen Monitor. Stellen Sie sicher, dass im seriellen Monitor unten rechts die Baudrate 9600 eingestellt ist. Testen Sie das Programm auf Ihrem Arduino.

Arduino Serieller Monitor

Serial.begin()

Damit die serielle Schnittstelle benutzt werden kann, muss diese zuerst initialisiert werden:

// initialisiert die serielle Schnittstelle mit 9600 bps (Baud)
Serial.begin(9600);

Im Gegensatz zu den anderen Befehlen, die bisher verwendet wurden, wird hier dem eigentlichen Befehl begin(9600) durch einen Punkt getrennt das Word Serial vorangestellt. Hierbei handelt es sich um einen Methodenaufruf aus der Serial-Klasse. Als Argument wird dem Befehl Serial.begin(9600) die Übertragungsgeschwindigkeit in Baud (Symbolrate) angegeben. In diesem Fall entspricht 1 Baud genau 1 bit/s. Oft werwendete Datenraten sind 9600, 57600 oder 115200 bit/s. Die im Programm konfigurierte Baudrate muss auch im seriellen Monitor eingestellt werden!

Serial.println()

Zum Senden von Daten stehen die Funktionen Serial.println() (mit Zeilenvorschub) und Serial.print() (ohne Zeilenvorschub) zur Verfügung. Mit print() und println() kann reiner Text (in Anführungszeichen: "Text")

Serial.print("Zaehlerstand: "); // Text ohne Zeilenvorsprung schreiben

oder aber auch der Wert von Variablen geschrieben werden.

Serial.println(zaehler);        // Wert der Variablen schreiben

In der Arduino-Referenz (Link) werden weitere Befehle und Beispiele für die serielle Schnittstelle beschrieben.

Einfache Formatierung

Mit dem print() bzw. println() Befehl kann der auszugebene Text auch ein wenig formatiert werden. Hierfür werden besonderen Zeichen verwendet. Zum Erzeugen eines Tabulators (ca. 4 Leerzeichen) wird \t und zum Einfügen eines Zeilenvorschubs wird \n verwendet. Das Beispiel soll die Verwendung verdeutlichen:

Serial.print("Wert1: ");
Serial.print(11);
Serial.print("\tWert2: "); // Tabulatur durch `\t` vor `Wert2`
Serial.print(12);
Serial.print("\nWert1: "); // Zeilenvorschub durch `\n` vor `Wert1`
Serial.print(21);
Serial.print("\tWert2: "); // Tabulatur durch `\t` vor `Wert2`
Serial.print(22);

Ausgabe auf dem seriellen Monitor:

Wert1: 11    Wert2: 12
Wert1: 21 Wert2: 22
Aufgaben
  1. Schreiben Sie ein Programm, welches über die serielle Schnittstelle genau einmal

    Das Programm ist gestartet.

    ausgibt. Anschließend soll das Programm den Satz immer wieder ausgeben.

    Das Programm ist aktiv.
    Das Programm ist aktiv.
    ...

Text mit sprintf() Formatieren

In der Regel reichen die Befehle Serial.print() und Serial.println() aus, um Daten in einer schönen Formatierung auf dem seriellen Monitor auszugeben. Trotzdem kann es hilfreich sein, mit dem Befehl sprintf() Daten in einer vorgegeben Art zu formatieren, zum Beispiel durch die Angabe der Stellen nach dem Komma, oder auch der Stellen vor dem Komma.

void setup(){
Serial.begin(9600);
char zeichenkette[20]; // Array von ASCII-Zeichen
// speichert mit `sprintf` formatierte Daten

int wert1 = 80;
sprintf(zeichenkette, "Wert:%4d", wert1);
Serial.println(zeichenkette); // Ausgabe: 'Wert: 80'

int wert2 = 1280;
sprintf(zeichenkette, "Wert:%4d", wert2);
Serial.println(zeichenkette); // Ausgabe: 'Wert:1280'
}

void loop(){}

Ausgabe auf dem seriellen Monitor

Wert:  80
Wert:1280

Erläuterungen

Das Prozentzeichen % beim zweiten Argument von sprintf() markiert einen Platzhalter für Zahlenwerte, die formatiert werden sollen. So wird zum Beispiel mit %4d ein Integerwert (d) ausgeben und nach links Platz für 4 Stellen bereitgestellt. Hat der Integerwert weniger als 4 Stellen, so wird an der Stelle ein Leerzeichen ausgegeben. Leider ist beim Arduino für die sprintf Funktion die Ausgabe von Fließkommazahlen (float oder double) nicht vorgesehen.

Mit sprintf() lassen sich noch viele andere Formatierungen realisieren. Eine Auflistung der Formatierungsoptionen gibt es hier.