Struktur Der grundlegende Aufbau der Arduino Programmiersprache ist relativ einfach und teilt sich in mindestens zwei Teile auf. Diese zwei benötigten Teile oder Funktionen umschliessen Blöcke von Anweisungen.

void setup() { anweisungen; }   void loop() { anweisungen; }

Hierbei ist setup() die Vorbereitung und loop() ist die Ausführung. Beide Funktionen sind notwendig damit das Programm ausgeführt werden kann. Die Setup Funktion sollte der Variablen Definition folgen, die noch davor aufgeführt werden muss. Setup muss als erste Funktion in einem Programm druchlaufen werden. Es wird nur einmal ausgeführt und dient dem Setzen von PinMode oder der Initiierung der seriellen Kommunikation. Nach der setup() Funktion folgt die loop() Funktion. Sie beinhaltet Programmcode, der kontinuierlich in einer unendlichen Schleife ausgeführt wird – Eingänge auslesen, Ausgänge triggern, etc. Diese Funktion ist der Kern von allen Arduino Programmen und erledigt die Hauptarbeit. setup() Die setup() Funktion wird einmalig aufgerufen wenn das Programm startet. Benutze diese Funktion um PinModes zu setzen oder die serielle Kommunikation zu starten. Die setup() Funktion muss in jedem Programm vorkommen, auch wenn sie keine Anweisungen enthält.

void setup() { pinMode(pin, OUTPUT); // ‘pin’ als Ausgang definieren }

loop() Nach dem Durchlaufen der setup() Funktion macht die loop() Funktion genau das was ihr Name vermuten lässt und läuft in einer endlosen Schleife. Damit wird dem Programm ermöglicht mit dem Arduino Board über Änderungen, Reaktionen und Kontrollen zu interagieren.

  void loop() { digitalWrite(pin, HIGH); // schaltet ‘pin’ ein delay(1000); // Pause für eine Sekunde digitalWrite(pin, LOW); // schaltet ‘pin’ aus delay(1000); // Pause für eine Sekunde }

Funktionen Eine Funktion ist ein Block von Programmcode, der einen Namen hat und eine Reihe von Anweisungen, die beim Aufruf der Funktion ausgeführt werden. Die Funktionen void setup() und void loop() wurden bereits erklärt. Es gibt noch weitere eingebaute Funktionen, die später behandelt werden. Eigene Funktionen zu Schreiben macht Sinn, um sich wiederholende Aufgaben zu vereinfachen und um die Übersichtlichkeit der Programmstruktur zu fördern. Funktionen werden erstellt indem zuerst der Type der Funktion definiert wird. Dieser ist identisch mit dem Datentyp des zurückgegebenen Wertes, so wie zum Beispiel ‘int’ für den Integer Typen. Wenn kein Wert zurückgegeben werden soll, so wird der Funktionstyp ‘void’ verwendet. Nach der Definition des Types wird der Name festgelegt und in Klammern alle Parameter, die der Funktion übergeben werden sollen.

Typ FunktionsName(parameter) { anweisungen; }

Die folgende Integer Typ Funktion ”delayVal()” wird genutzt um eine Delay Wert, also eine Verzögerung in ein Programm durch Auslesen eines Potentiometers einzubauen. Zuerst wird eine lokale Variable ‘v’ erstellt. Als nächstes wird ‘v’ mit der Stellung des Potentiometers gleichgesetzt, das einen Wert zwischen 0 und 1023 haben kann. Der Wert wird dann durch 4 dividiert um auf eine Skala von 0 bis 255 zu kommen und am Ende wird das Ergebnis der Funktion zum Hauptprogramm zurückgegeben.

int delayVal() { int v; // erstelle temporäre Variable ‘v’ v = analogRead(pot); // lese Potentiometer Wert v /= 4; // Umrechnen von 0-1023 auf 0-255 return v; // errechneten Wert zurückgeben }

{} geschweifte Klammern Geschweifte Klammern (auch ‘geschwungene Klammern’ genannt) definieren den Anfang und das Ende von Funktions- und Anweiungsblöcken so wie bei der ‘void loop()’ Funktion und auch bei der ‘for’ und ‘if’ Anweisung.

typ funktion() { anweisungen; }

Eine öffnende geschwungene Klammer ‘{‘ muss immer von einer schliessenden geschwungenen Klammer gefolgt werden ‘}’. Hier spricht man oft davon, dass die Anzahl der Klammern ausgeglichen sein müssen. Unausgeglichene Klammern führen oft zu kryptischen, undurchschaubaren Fehlern im Kompiler, die manchmal schwer zu finden sind, vor allem in großen Programmen. Die Arduino Programmierumgebung hilft dabei die Augeglichenheit der geschwungenen Klammern zu prüfen. Dafür muss man einfach eine Klammer auswählen oder kurz hinter dieser klicken, und das logisch verbundene Gegenstück wird optisch hervorgehoben. ; Semikolon Ein Semikolon muss am Ende einer Anweisung verwendet werden und dient zur Trennung der Elemente eines Programmes. Ein Semikolon wird auch werwendet um die Elemente einer ”for” Schleife zu trennen.

int x = 13; // deklariert Variable ‘x’ als Integer mit Wert 13

Bemerkung: Das Vergessen eines Semikolons am Ende einer Zeile führt zu einem Fehler im Kompiler. Die Fehlerbeschreibung kann dabei sehr eindeutig sein und auf das fehlende Semikolon direkt hinweisen, das muss aber nicht der Fall sein. Wenn eine undurchschaubarer oder scheinbar unlogischer Fehler gemeldet wird, sollte deswegen als erstes fehlende Semikolons in der Nähe des gemeldeten Fehlers ergänzt werden. /*… */ Block Kommentare Block Kommentare oder mehrzeilige Kommentare sind Textbereiche die vom Programm irgnoriert werden. Sie werden für längere Beschreibungen oder Kommentare verwendet und helfen anderen Autoren Programmteile zu verstehen. Sie fangen mit /* an und enden mit */ und können mehrere Zeilen umfassen.

  /* Dies ist eine eingefügter Block Kommentar bitte den schliessenden Kommentar nicht vergessen – Diese müssen ausgeglichen sein */

Weil Kommentare vom Programm ignoriert werden und damit keinen Speicherplatz verbrauchen sollten sie großzügig verwendet werden. Mit Block Kommentaren kann man auch ganze Programmteile zum Debuggen ungültig machen. Bemerkung: Man kann einzeilige Kommentare in einen Block Kommentar integrieren. Aber es ist nicht möglich einen zweiten Block Kommentar zu einzuschliessen. // Einzeilige Kommentare Einfache einzeilige Kommentare werden mit einem // am Anfang der Zeile definiert und enden mit dem Ende der Zeile. Sie werden vom Programm ignoriert und verbrauchen keinen Speicherplatz.

// dies ist ein einzeiliger Kommentar

Einzeilige Kommentare werden oftmals nach Anweisungen verwendet um mehr Informationen über die verwendete Anweisung zu vermitteln oder um Notizen für zukünftige Änderungen am Code festzuhalten.