Die grundlegende Programmstruktur hatten wir ja schon in der Einleitung. Ein Arduino Progrqmm besteht aus mindestens 2 Proceduren.
Die eine heisst void setup() {}
und die andere nennt sich void loop(){}
.
setup
wird beim Start einmal ausgeführt. Hier kann man dann Code schreiben, der nur einmal ausgeführt werden muss, wie z.B. Initialisierungen.loop
wird immer wieder ausgeführt. Und zwar unendlich oft. Ist unser Code in loop
wird dieser automatisch wieder ausgeführt.Hier noch mal das Grundgerüst eines Arduinoprogramms.
/* Dieses Programm soll eine LED an dem Ausgang 13 zum Blinken bringen, Frequenz 1Hz. */ void setup() { pinMode(13,OUTPUT); } void loop() { // LED einschalten, digitalWrite(13,HIGH); // warten, delay(500); // auschalten, digitalWrite(13,LOW); // warten delay(500); }
Hier werden ja 2 Routinen benutzt. setup()
und loop()
. Das sind sog. Prozeduren. Also Funktionen ohne Rückgabewert. Aber was Arduino kann, können wir schon lange. Wir können uns auch selber Routinen schreiben, die wir dann im Programm verwenden. Auch die Befehle digitalWrite()
oder delay()
sind nichts weiter als bereits definierte Prozeduren. z.B. könnten wir eine Prozedur schreiben, die die LED einmal an schaltet und wartet.
void ledOn() { // LED einschalten, digitalWrite(13,HIGH); // warten, delay(500); }
Dann könnten wir unsere loop verkürzen auf:
void loop() { // LED einschalten, ledOn(); // auschalten, digitalWrite(13,LOW); // warten delay(500); }
Na super… macht ja so keinen Sinn gelle? Oh doch, wenn wir die Prozedur noch mit sog. Parametern ausstatten. Um z.B. den Ausgang zu bestimmen, oder die Wartezeit einzustellen.
void ledOn(byte pin, int msec) { // LED einschalten, digitalWrite(pin,HIGH); // warten, delay(msec); } void loop() { ledOn(13,500); ...
Na, besser? Parameter. Wie man hier sieht sieht werden Parameter immer zunächst mit dem Typ und dann mit einem Namen angegeben. Getrennt werden verschiedene Parameter mit dem ,.
Prozeduren können auch Werte zurück geben. Z.B. die digitalRead()
Routine. Dann heissen diese Rountinen Funktionen. Die digitalRead()
Funktion ist z.B. folgendermassen definiert:
int digitalRead(byte pin) {...
Statt void, das keine Rückgabe bedeutet ist hier int angegeben. D.h. es kommt eine Ganzahl zurück. (In wirklichkeit kommt nur eine 1 oder eine 0 zurück, aber egal…)
Natürlich können wir das auch machen. (Macht aber in unserem jetzigen Beispiel keinen Sinn, machen wir also später)
Falls ihr es noch nicht bemerkt habt, jeder Befehl wird mit einem ; abgeschlossen. Und man kann mehrere Befehle zu einer „Kette“ zusammenfassen mit geschweiften Klammern. {}