Basiskonzept

Die Programmiersprache des Arduino ist genau genommen ein C++ „Dialekt“, der mit Befehlen ausgestattet wurde, damit z.b. Eingänge des Mikrocontollers ausgelesen und Ausgänge angesteuert werden können. Bei C++ handelt es sich um eine Hochsprache. Das bedeutet, dass die Befehle für Menschen verständlich und lesbar ist. Damit sie der Arduino verstehen kann, muss das Programm jedoch zuerst von einem Compiler in maschinenlesbaren Code übersetzt werden. Ist das Programm jedoch in den Speicher des Arduino übertragen worden, kann es nicht mehr in den Ursprungscode zurück übersetzt werden.

Von Klammern und dem Semikolon

Semikolon und Klammern

Befehle werden in der Arduino-Programmiersprache durch das Semikolon getrennt. Es ist durchaus möglich mehrere Befehle in eine Zeile zu schreiben:

Code-Beispiel

1
2
3
// Hinter einander geschriebener Code ist möglich.
// Die Überischtlichkeit leidet jedoch darunter 
int erster_wert = 1; int zweiter_wert = 2; float dritter_wert = 3.14;

Ein gutes Vorgehen ist dies jedoch nicht. Besser ist es Befehle zeilenweise einzugeben. Das fördert die Lesbarkeit des Programms nicht nur für dich, sondern auch für andere, die deinen Code eventuell einmal lesen werden:

Code-Beispiel

1
2
3
4
// ... besser ist es Befehle zeilenweise zu schreiben 
int erster_wert = 1;
int zweiter_wert = 2;
flaoat dritter_wert = 3.14;

Befehle können durch geschweifte Klammern zusammengefasst werden. Mit der öffnenden Klammern wird der Beginn eines Blocks eingeleitet. Die schließende Klammer schließt ihn ab. Diese sogenannten Codeblocks werden dir im Verlauf dieses Tutorials noch an vielen Stellen begegnen und im Verlauf des Kurses werden wir ausführlicher darauf eingehen.

Code-Beispiel

1
2
3
4
5
6
7
8
int x = 1;
do{ // Start Codeblock
 
//mach das, was zwischen den geschweiften Klammern steht.
x++;
// Die schließende gewschweifte Klammer leitet das Ende des Codeblocks ein
} while (x < 0 );
serial.println(x);

Grundstruktur eines Arduino Sketchs

In seiner Grundform besteht ein Sketch aus mindestens drei Abschnitten:
Der erste Abschnitt ist der Deklarations- und Initialisierungsteil Hier können Variablen deklariert oder initialisiert werden. Alles über die Begriffe Deklarieren und Initialisieren erfahren Sie im Modul Variablen. Der zweite Bestandteil ist die Setup() Funktion. Dieser Part wird nur einmal an Anfang des Programms durchlaufen. An dieser Stelle können Sie z.B angeben, welche Funktion ein Pin übernehmen soll, ob er als Ein- oder Ausgang definiert sein soll.
Der dritte Abschnitt des Sketches beginnt in der Zeile in der void loop() steht. Loop könnten man mit Schleife übersetzen. Alle Befehle die innerhalb der geschweiften Klammern stehen werden der Reihe nach abgearbeitet. Wird die schließende Klammer erreicht, beginnt die Abarbeitung der Befehle wieder von vorne an der sich öffnenden Klammer. Der Sketch durchläuft die loop()-Funktion also ständig.

Aufbau eines Arduino Sketch
Sketch Grundgerüst Arduino

Wie eine Wertzuweisung funktioniert

Werte werden in vielen Programmiersprachen, so auch in der Arduino-Programmiersprache nach folgendem Schema zugewiesen:

Links befindet beispielsweise eine Variable x, die als Platzhalter für eine Zahl steht. Auf der rechten Seite steht der Wert der zugewiesen werden soll 9. Anstatt der 9 könnte dort auch eine weitere Variable stehen.

Betrachten wir das Ganze genauer:
Das Gleichzeichen ist ein sogenannter Operator ist, um genau zu sein, ein Zuweisungsoperator. Links und rechts davon stehen die sogenannten Operanden.

Dem linken Operand x wird durch den Zuweisungsoperator = der Wert 9, also der Wert des rechten Operanden zugewiesen.

Arduino IDE – 1 Was sie ist und was sie kann

Die Arduino IDE
Die Arduino IDE
Das Programm das standardmäßig zur Programmentwicklung für die Arduinofamilie verwendet wird, ist die Arduino-IDE. Die drei Buchstaben „IDE“ stehen für „Integrated Developement Eniviroment“ (integrierte Entwicklungsumgebung). Der Vorteil einer Entwicklungsumgebung ist das dort nicht nur Programme in einem Editor geschrieben, geladen und gespeichert werden können, sondern auch alles sonst noch Notwendige zur Programmentwicklung bereitgestellt wird. In der Arduino-IDE besteht beispielsweise die Möglichkeit das Programm, dass beim Arduino übrigens als Sketch bezeichnet auf Syntaxfehler prüfen zu lassen. Außerdem kann in dieser Umgebung das Programm kompiliert und in den Speicher des Arduinos übertragen werden.

Arduino IDE – 2 Die wichtigsten Funktionen

Die Bedieneroberfläche der Arduino IDE wurde von den Entwicklern bewusst übersichtlich gestaltet und hilft Ihnen dadurch schnell Erfolge zu erzielen.

 

Damit ein Programm in den Speicher des Arduinos geladen werden kann, müssen 3 Parameter, die Sie unter dem Menüpunkt Werkzeuge finden korrekt eingestellt sein.
1 Das zu flashende Board, in unserem Fall der Arduino Uno.
2 Die richtige Schnittstellengeschwindigkeit, also die Geschwindigkeit mit der das Programm übertragen wird. 57600 Baud ist ein guter Wert.
3 Die Programmierschnittstelle, bei Verwendung des USB Port unter Windows ist die „“ ausgewählt.

<!--nextpage-->

Kommentare in der Arduino-Programmiersprache

Kommentare bieten Ihnen die Möglichkeit, Texte in den Quellcode zu schreiben, die vom Compiler ignoriert werden, also von ihm so behandelt wird, als wären sie nicht vorhanden. Sie belegen keinerlei Speicher, da sie nicht mit kompiliert werden.

Sie können sie beispielsweise zu Beginn des Programms verwenden, um allgemeine Erklärungen oder Hinweise zur Verwendung des Quelltextes zu geben. Kommentare können auch zur Gliederung von Quelllcode eingesetzt werden. Bei komplexem Quellcode können ergänzende Kommentare die Lesbarkeit ihres Programms erhöhen. Sehr häufig wird die Kommentarfunktion genutzt um einen Befehl oder mehrere Befehle nicht auszuführen, im dem man sie in einen Kommentar umwandelt. Dieses Vorgehen wird auch als auskommentieren von Befehlen bezeichnet.

Kommentare existieren in zwei Ausprägungen, einzeiligen und mehrzeiligen

Einzeiliger Kommentar

Ein // (Doppelslash) leitet einen einzeiligen Kommentar ein. Diese Form des Kommentars wird auch als Inline-Kommentar bezeichnet. Alles was hinter dem Doppelslash steht, wird in dieser Zeile als Kommentar behandelt. Diese Art Kommentar kann auch hinter einem Befehl stehen. Steht // vor einem Befehl, gilt der Befehl als auskommentiert. Er wird dann vom Compiler so behandelt, als wäre er nicht vorhanden.

Mehrzeiliger Kommentar

Mit mehrzeiligen Kommentaren können Sie Texte eingeben, die sich über mehrere Zeilen erstrecken. Sie müssen diese lediglich zwischen die den Kommentar ein- und ausleitenden Zeichen einfügen.
Der mehrzeilige Kommentar wird durch /* eingeleitet und mit */ abgeschlossen. Dazwischen befindet sich der Kommentartext.
Bild ein- und zweizeiliger Kommentar

Serial.print()

Neben der Serial.println()-Anweisung gibt es noch eine weitere Anweisung um Texte oder Ausdrücke über die serielle Schnittstelle des Arduinos zu senden, um sie beispielsweise auf dem seriellen Montior anzuzeigen. Sollen Ausgaben in der aktuellen Zeile des seriellen Monitors einfach angefügt werden, verwendest du die Serial.print()-Anweisung.

Sketch: Unterschied zwischen Serial.print() und Serial.println()

Code-Beispiel

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void setup() {
  Serial.begin(9600);
  Serial.println("Serial.println()gibt zeilenweise aus");
  // Serial.print fügt einfach die Ausgaben der aktuellen Zeile an
  Serial.print('S');
  Serial.print('e');
  Serial.print('r');
  Serial.print('i');
  Serial.print('a');
  Serial.print('l');
  Serial.print('.');
  Serial.print("print() nicht");
}
 
void loop() {
 
}

Ausgabe serieller Monitor

Serial Monitor Arduino piece #8
Serial Monitor Arduino piece #7
Serial Monitor Arduino piece #6
Serial Monitor Arduino piece #5
Serial Monitor Arduino piece #4
Serial Monitor Arduino piece #3
Serial.println()gibt zeilenweise aus Serial.print nicht()

Ausgabeformatierung von Zahlensystemen mit Serial.print() und Serial.println()

Die Anweisungen können Serial.print() und Serial.println() können noch viel mehr.
Sie können Ausdrücke und Werte in anderen Zahlenformaten darstellen. Damit ist es möglich zum Beispiel den Wert 12 als Binärzahl darstellen. Dazu wird den Anweisung mitgeteilt, in welchem Zahlenformat die Darstellung erfolgen soll. Die Anweisung sieht dann wie folgt aus:

Übersicht Ausgabeformate von Zahlensystemen mit Serial.print() und Serial.println()

Ausgabe-
format
Ausgabe-
anweisung
Beispiel Ausgabe
Binär BIN Serial.println(66, BIN), 1000010
Oktal OCT Serial.print(66, OCT); 101
Dezimal DEZ Serial.print(66, DEC); 65
Hexdezimal HEX Serial.print(78, HEX); 4E

Sketch: Ausgabeformatierung von Zahlensystemen mit Serial.print()

Code-Beispiel

1
2
3
4
5
6
7
8
9
10
11
void setup() {
  Serial.begin(9600);
  Serial.println(66, BIN); // 1000010
  Serial.println(66, OCT); // 102 
  Serial.println(66, DEC); // 66 
  Serial.println(78, HEX); // 4E 
}
 
void loop() {
 
}

Ausgabe serieller Monitor

Serial Monitor Arduino piece #8
Serial Monitor Arduino piece #7
Serial Monitor Arduino piece #6
Serial Monitor Arduino piece #5
Serial Monitor Arduino piece #4
Serial Monitor Arduino piece #3
1000010
102
66
4E

Der zweite Sketch – void loop()

In dieser Lektion erfährst du was sich hinter der loop()-Funktion verbirgt.
Die loop()-Funktion ist der Hauptbestandteil unseres Sketches. Alle Anweisungen, die sich zwischen der öffnenden und schließenden Klammer befinden werden der Reihe nach ausgeführt. Bei der letzten Anweisung angekommen (schließende Klammer), springt der Sketch zum Anfang der loop()-Funktion (öffnende Klammer) zurück.

void loop ()-Funktion Arduino
void loop ()-Funktion Arduino

Die Inhalt der Schleife wird also ständig wiederholt. So kann der Mikrocontroller sofort auf Änderungen von Schaltzuständen oder durch Sensoren erfasste Messwerte reagieren und nach deren Auswertung z.B. Motoren oder LEDs ein- oder ausschalten.

Die LED des Arduinos

Auf der Platine des Arduino Uno befindet sich zu eine LED, die zu Testzwecken verwendet werden kann. Im später folgenden Code-Beispiel soll genau diese LED blinken. Dazu müssen wir einige Vorbereitungen treffen. Wir beginnen damit den Pin (Kontakt) zu definieren, der später zum Schalten der LED verwendet werden soll. Dazu benötigt der Mikrocontroller zwei Informationen:
Welchen Pin soll er verwenden und welche Funktion soll diesem Pin zugewiesen werden? Fast alle Pins des Arduinos sind in ihrer Funktion in Grenzen frei wählbar. Sie können als Ein- oder Ausgang definiert werden.
Standardmäßig ist Pin 13 der auf Platine verbauten LED zugeordnet.

Die pinMode()-Anweisung

Es soll eine Spannung an diesem Pin ausgegeben werden, damit die LED leuchten kann. Dazu muss Pin 13 als Ausgang (engl. OUTPUT) definiert sein.
Beide Informationen werden dem Mikrocontroller mit der pinMode()-Funktion mitgeteilt:

Delay()

Damit die LED blinkt, muss sie für eine gewisse Zeit ein- und wieder ausgeschaltet werden. Dazu verwendet man die delay()-Funktion, die die Programmausführung für eine gewisse Zeit stoppt. Die Zeitangabe erfolgt in Millisekunden. 1000 Millisekunden sind eine Sekunde. Dieser Wert soll verwendet werden. Die Anweisung dazu sieht dann wie folgt aus:

Einen digitalen Ausgang mit digitalWrite() schalten

Eine einzige Anweisung fehlt damit der Sketch komplett ist. Der Mikrocontroller muss nun wissen, wann der Ausgang ein- oder ausgeschaltet werden soll. Das erreicht man mit digitalWrite().
Auch hier sind wieder zwei Informationen nötig:
Welcher Pin soll geschaltet werden? Für das verwendete Beispiel ist das Pin 13
Als zweite Information muss mitgegeben werden, ob der PIN ein- oder ausgeschaltet werden soll. Zum Einschalten kommen zwei Arduino Konstanten zum Einsatz: HIGH verwendest du zum ein- und LOW zum ausschalten. Soll Pin 13 eingeschaltet werden, sieht die vollständige Anweisung wie folgt aus:

Der zweite Arduino Sketch mit void loop()

Hier ist nun der vollständige Sktech:

Code-Beispiel

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void setup() {
  Serial.begin(9600);
  pinMode(13, OUTPUT);
}
 
void loop() {
// Alles was zwischen der öffnenden und schließende Klammer steht,
// durchläuft ständing diesen loop 
digitalWrite(13, HIGH);
Serial.println("LED eingeschaltet");
delay(1000);
digitalWrite(13, LOW);
Serial.println("LED eingeschaltet");
delay(1000);
}

Was passiert?

Zeile 1-5: Hier befindet der Abschnitt in dem die Anweisungen nur einmal abgearbeitet werden
Zeile 2: Mit Serial.begin(9600) stellen wir die Übertragungsgeschwindigkeit der seriellen Kommunikation des Mikrocontrollers aus 9600 Baud ein.
Zeile 3: Mit Serial.println() wird Pin 13 als Ausgang definiert.
Zeile 6: Hier beginnt die loop()-Funktion. Alle Anweisungen im Anweisungsblock werden ständig durchlaufen.
Zeile 9: Pin 13 wird eingeschaltet – die LED leuchtet.
Zeile 10: Als Statusmeldung wird LED eingeschaltet an den seriellen Monitor übermittelt.
Zeile 11: Das Programm wird eine Sekunde angehalten – Die LED bleibt solange eingeschaltet
Zeile 12: Pin 13 wird ausgeschaltet – die LED leuchtet nicht.
Zeile 13: Eine weitere Statusmeldung LED ausgeschaltet wird an den seriellen Monitor übermittelt.
Zeile 14: Das Programm wird für eine weitere Sekunde angehalten – die LED ist solange ausgeschaltet.
Zeile 15: Die schließende Klammer beendet den Anweisungsblock der loop()-Funktion und beginnt in Zeile 6 erneut mit der Abarbeitung der Anweisungen. Dies wiederholt sich fortwährend.

Ausgabe am seriellen Monitor

Serial Monitor Arduino piece #8
Serial Monitor Arduino piece #7
Serial Monitor Arduino piece #6
Serial Monitor Arduino piece #5
Serial Monitor Arduino piece #4
Serial Monitor Arduino piece #3
LED eingeschaltet
LED ausgeschaltet
LED eingeschaltet
LED ausgeschaltet
LED eingeschaltet
LED ausgeschaltet

Der erste Sketch – void setup()

Der serielle Monitor

Der erste Sketch soll einen Text ausgeben. Dies geschieht über eine serielle Verbindung, die zum Senden und empfangen von Daten verwendet werden kann. Zur Anzeige von Daten, Meldungen etc. gibt es in der Arduino-IDE eine sehr komfortable Komponente, den seriellen Monitor.

Serial.begin()

Um Ausgaben an den seriellen Monitor zu senden, ist zu beachten, dass die Geschwindigkeitseinstellung des Arduino und die des seriellen Monitors gleich sind. Die Übertragungsgeschwindigkeit wird in Baud angegeben. 9600 Baud ist ein guter Wert für unsere Verbindung. Auf der Seite des Arduinos wird die Gechwindigkeit durch die folgenden Anweisung eingestellt:

Ausgabe mit Serial.println()

Damit der Arduino Ausgaben am seriellen Monitor machen kann, gibt eine weitere Anweisung, die wir uns etwas näher anschauen wollen:

Damit können Texte oder Ausdrücke, die zwischen den Klammern stehen ausgegeben werden. Die Ausgabe erfolgt bei Serial.println() zeilenweise. Die Texte werden untereinander ausgegeben und werden nicht dahinter angefügt. Das ln, das vor print steht, drückt genau das aus, denn es steht für das englische line (zu deutsch Zeile).
Um Texte auszugeben werden diese in Hochkommas gesetzt:

Anweisungen die sich innerhalb der setup()-Funktion befinden werden nur einmalig ausgeführt. Um das zu demonstrieren befindet sich die Serial.println()-Anweisung in genau diesem Teil des Sketches. Der Text sollte also am seriellen Monitor nur einmal angezeigt werden.

Der erste Arduino Sketch mit void setup()

Nach dieser kurzen Einleitung, hier der gesamte Sktech:

Code-Beispiel

1
2
3
4
5
6
7
8
9
10
void setup() {
  Serial.begin(9600);
  Serial.println("Hallo Welt!");
  Serial.println("Dieser Teil wird nur einmal ausgeführt");
}
 
void loop() {
// Alles was zwischen der öffnenden und schließende Klammer steht,
// durchläuft ständing diesen loop 
}

Was passiert?

Zeile 1: Mit dem Schlüsselwort void wird eine Funktion initialisiert. Diese Funktion heisst setup(). Später in diesem Kurs werden wir uns noch intensiver mit Funktionen beschäftigen und klären was es mit void auf sich hat.
Zeile 2: Mit Serial.begin(9600) stellen wir die Übertragungsgeschwindigkeit der seriellen Kommunikation des Mikrocontrollers aus 9600 Baud ein. Die Anweisung befindet sich innerhalb setup()-Funktion. Sie ist da genau an der richtigen Stelle im Sketch, denn die Übertragungsgeschwindigkeit wird nur einmal eingestellt.
Zeile 3+4: Serial.println() übermittelt den auszugebenden Text an die serielle Schnittstelle. Der serielle Monitor empfängt den Text und gibt ihn aus.
Zeile 5: Die schließende Klammer beendet den Anweisungsblock der setup()-Funktion.
Zeile 7-9: Hier befindet sich standardmäßig die loop()-Funktion, also den Teil, der wie schon im Kommentar nachzulesen ist ständig durchlaufen wird.

Ausgabe am seriellen Monitor

Serial Monitor Arduino piece #8
Serial Monitor Arduino piece #7
Serial Monitor Arduino piece #6
Serial Monitor Arduino piece #5
Serial Monitor Arduino piece #4
Serial Monitor Arduino piece #3
Hallo Welt!
Dieser Teil wird nur einmal ausgeführt