Beginnen wir mit einem einfachen Beispiel. Wir wollen das Blinken der Arduino LED an Pin 13 in eine Funktion packen. Dadurch müssen wir dann nur noch blinken() angeben.
Um eine Funktion im Setup oder Loop Teil zu verwenden muss man sie erst definieren. Das geschieht außerhalb dieser beiden Programmteile. Zunächst muss man festlegen, welchen Datentyp die Daten haben, die die Funktion zurück gibt. Da das Blinken keine Daten zurück gibt, muss man void angeben. Danach kommt der Name der Funktion. In den Klammern könnte man dann die Argumente angeben (dazu später mehr). Innerhalb der geschweiften Klammern wird dann der Code angegeben, der beim Aufruf der Funktion einmal ausgeführt werden soll. In meinem Fall die LED anmachen, kurz warten, wieder ausmachen und wieder kurz warten. Da diese Funktion dauernd im Loop Teil aufgerufen wird, blinkt die BoardLED konstant.
Nun wollen wir diese Funktion universell einsetzbar machen. Dazu wollen wir immer in den Klammern den Pin angeben, an dem die LED angeschlossen ist, die blinken soll. Das bedeutet die Funktion hat ein Argument. Argumente haben wie Variablen immer einen Datentyp. Der Pin wäre in unserem Fall eine Zahl, also int. Bei der Definition der Funktion wird nun in den normalen Klammern der Datentyp und der Name des Argument angegeben. Die Pinzahl, die dann beim Aufrufen der Funktion angegeben wird, ist dann in der Funktion in der Variable, mit dem Argumentnamen, gespeichert.
In meinem Fall heißt das Argument pin. Deshalb steht bei mir, bei digitalWrite(), an der Stelle wo der Pin angegeben werden sollte, pin. Wenn wir nun ein weiteres Argument wollen, beispielsweise die Geschwindigkeit des Blinkens, so werden die Argumente mit Kommas getrennt.
Nun müssen wir immer die Dauer des Blinkens angeben. Wäre es nicht praktisch, wenn man eine Standarddauer für das Blinken hat und deshalb die Dauer nur angeben muss, wenn man eine Andere haben will?
Das lässt sich auch ganz einfach lösen! Dazu definiert man einfach die gewünschte Funktion mehrmals. Einmal in der Kombination, wo man nur den Pin angibt, und einmal in der Kombination Pin und Dauer. Das sähe dann so aus:
Nun wollen wir noch, dass uns die Funktion einen Rückgabewert liefert. Beispielsweise die Geschwindigkeit des Blinken. Schnell, normal oder langsam. Dazu muss man das void vor dem Namen in den jeweiligen Datentyp umändern, in diesem Fall String, und in der Funktion, über return variable, eine Variable vom genannten Datentyp zurückgeben. Um die gefühlte Geschwindigkeit zurück zu geben, sähe der Sketch so aus:
In der seriellen Konsole wird dann laufend die "gefühlte Blinkgeschwindigkeit" ausgegeben.
Jetzt weißt du, wie man Funktionen definiert, Argumente verwendet, auch Optionale, und, wie eine Funktion etwas zurück geben kann.
Um eine Funktion im Setup oder Loop Teil zu verwenden muss man sie erst definieren. Das geschieht außerhalb dieser beiden Programmteile. Zunächst muss man festlegen, welchen Datentyp die Daten haben, die die Funktion zurück gibt. Da das Blinken keine Daten zurück gibt, muss man void angeben. Danach kommt der Name der Funktion. In den Klammern könnte man dann die Argumente angeben (dazu später mehr). Innerhalb der geschweiften Klammern wird dann der Code angegeben, der beim Aufruf der Funktion einmal ausgeführt werden soll. In meinem Fall die LED anmachen, kurz warten, wieder ausmachen und wieder kurz warten. Da diese Funktion dauernd im Loop Teil aufgerufen wird, blinkt die BoardLED konstant.
Nun wollen wir diese Funktion universell einsetzbar machen. Dazu wollen wir immer in den Klammern den Pin angeben, an dem die LED angeschlossen ist, die blinken soll. Das bedeutet die Funktion hat ein Argument. Argumente haben wie Variablen immer einen Datentyp. Der Pin wäre in unserem Fall eine Zahl, also int. Bei der Definition der Funktion wird nun in den normalen Klammern der Datentyp und der Name des Argument angegeben. Die Pinzahl, die dann beim Aufrufen der Funktion angegeben wird, ist dann in der Funktion in der Variable, mit dem Argumentnamen, gespeichert.
In meinem Fall heißt das Argument pin. Deshalb steht bei mir, bei digitalWrite(), an der Stelle wo der Pin angegeben werden sollte, pin. Wenn wir nun ein weiteres Argument wollen, beispielsweise die Geschwindigkeit des Blinkens, so werden die Argumente mit Kommas getrennt.
Nun müssen wir immer die Dauer des Blinkens angeben. Wäre es nicht praktisch, wenn man eine Standarddauer für das Blinken hat und deshalb die Dauer nur angeben muss, wenn man eine Andere haben will?
Das lässt sich auch ganz einfach lösen! Dazu definiert man einfach die gewünschte Funktion mehrmals. Einmal in der Kombination, wo man nur den Pin angibt, und einmal in der Kombination Pin und Dauer. Das sähe dann so aus:
Nun wollen wir noch, dass uns die Funktion einen Rückgabewert liefert. Beispielsweise die Geschwindigkeit des Blinken. Schnell, normal oder langsam. Dazu muss man das void vor dem Namen in den jeweiligen Datentyp umändern, in diesem Fall String, und in der Funktion, über return variable, eine Variable vom genannten Datentyp zurückgeben. Um die gefühlte Geschwindigkeit zurück zu geben, sähe der Sketch so aus:
In der seriellen Konsole wird dann laufend die "gefühlte Blinkgeschwindigkeit" ausgegeben.
Jetzt weißt du, wie man Funktionen definiert, Argumente verwendet, auch Optionale, und, wie eine Funktion etwas zurück geben kann.
Vielen Dank für diese tolle, verständliche und schnelle Erklärung :)
AntwortenLöschenVielen Dank, super erklärt!
AntwortenLöschenDanke, super erklärt! Ich habe es verstanden!
AntwortenLöschenSehr gut! Knapp und verständlich.
AntwortenLöschen