/*
* Blink
*
* The basic Arduino example. Turns on an LED on for one second,
* then off for one second, and so on... We use pin 13 because,
* depending on your Arduino board, it has either a built-in LED
* or a built-in resistor so that you need only an LED.
*
* http://www.arduino.cc/en/Tutorial/Blink
*/
int ledPin = 13; // LED connected to digital pin 13
void setup() // run once, when the sketch starts
{
pinMode(ledPin, OUTPUT); // sets the digital pin as output
}
void loop() // run over and over again
{
digitalWrite(ledPin, HIGH); // sets the LED on
delay(1000); // waits for a second
digitalWrite(ledPin, LOW); // sets the LED off
delay(1000); // waits for a second
}
Kommentare
Wir schauen uns diesen Sketch jetzt im Detail an und beginnen mit dem ersten Abschnitt:
/*
* Blink
*
* The basic Arduino example. Turns on an LED on for one second,
* then off for one second, and so on... We use pin 13 because,
* depending on your Arduino board, it has either a built-in LED
* or a built-in resistor so that you need only an LED.
*
* http://www.arduino.cc/en/Tutorial/Blink
*
Das ist ein Kommentar. Der Text wird von dem Arduino nicht ausgeführt oder verwendet. Er steht hier, um Menschen wie uns zu verdeutlichen, was passiert. Dass es sich um einen Kommentar handelt kann man daran erkennen, dasss am Anfang /* und */ am Ende steht. Alles zwischen /* und */ wird vom Arduino ignoriert. Der Person, die diesen Sketch geschrieben hat, gefiel es, dass jede Zeile dazwischen mit einem * beginnt, erforderlich ist das aber nicht.
Kommentare sind sehr nützlich und es ist empfehlenswert, dass jeder Sketch mit einem Kommentar mit Informationen darüber beginnt, wer den Sketch geschrieben hat, wann das war und was möglicherweise noch getan werden muss.
Variablen
Lass uns die nächste Zeile anschauen:
int ledPin = 13; // LED connected to digital pin 13
Dies ist die erste Anweisung in dem Sketch. Sie unterscheidet sich sehr von Englisch oder sonst einer menschlichen Sprache. Der leicht zu verstehende Teil befindet sich auf der rechten Seite. Hier handelt es sich ebenfalls um einen Kommentar. Wenn Du nur einen kurzen Kommentar schreiben willst, kannst Du genauso gut // anstatt /* und */ verwenden. // wird häufig für kurze einzeilige Kommentare verwendet.
Der Anfang der Zeile bis zu // ist eine Anweisung (engl. statement). Einfach ausgedrückt handelt, es sich hierbei um eine computerisierten Satz. Ähnlich wie ein menschlicher Satz mit einem . (Punkt) endet, enden in C alle Computersätze mit einem ; (Semikolon).
Variable-Typ
Variable-Name
=
Wert für die Variable
int
ledPin
=
13
Hier wird eine Variable definiert. Variablen sind so etwas wie Behälter, in denen Werte aufbewahrt werden, die im Laufe des Sketches weiter benutzt werden sollen.
Der Satz beginnt mit int. Das ist eine Abkürzung für Integer, eine technische Art zu sagen, dass es sich um eine Ganzzahl (z.B. 1, 2, 3 usw.) handelt.
Der zweite Teil ist ledPin. Das ist der Namen der Variable.
Der dritte Teil ist ein =(Gleichheitszeichen), das einfach sagt, dass alles nach dem = in der Variable ledPin gespeichert werden soll.
Der vierte Teil ist die Ganzzahl (Integer) 13, die in der Variable ledPin gespeichert werden soll.
Prozeduren
Schauen wir uns den nächsten Abschnitt an:
void setup() // run once, when the sketch starts
{
pinMode(ledPin, OUTPUT); // sets the digital pin as output
}
Zunächst sehen wir wieder zwei Kommentare, die mit // beginnen. Das kennen wir schon und beschäftigen uns hier jetzt nicht weiter damit. In der Mitte sehen wir eine Anweisung. Das erkennen wir daran, dass sie mit einem ; (Semikolon) endet. Davor und danach gibt es aber noch einiges, was wir noch nicht kennen.
Diese Code-Zeilen sind ein Beispiel für eine Prozedur. Eine Prozedur ist eine Ansammlung von Anweisungen und wird verwendet, um zusammengehörende Anweisungen zu gruppieren. Häufig werden dafür auch Begriffe wie Funktion, Unterprogramm, Methode und Subroutine verwendet. Wo da der genaue Unterschied ist, ist für uns noch nicht so wichtig. Über die Unterschiede streiten sich die Gelehrten. In diesem Tutorial werden die Begriffe Prozedur und Funktion gleichwertig verwendet.
Auf eine Prozedur kann unter Verwendung ihres Namens immer wieder zugegriffen werden. Sobald eine Prozedur an einer Stelle im Sketch aufgerufen wird, werden die Anweisungen in ihr nacheinander ausgeführt.
Rückgabewert
Prozedur-Name
(Eingabewerte)
{ Anweisungen }
void
setup
()
{pinMode(ledPin, OUTPUT); }
Um das besser zu verstehen, verwenden wir eine Analogie aus dem täglichen Leben ;-)
saubere Katze Katze waschen(schmutzige Katze)
{
Stelle die Dusche an.
Suche die Katze.
Fange die Katze.
Halte die Katze unter die Dusche.
Warte 3 Minuten.
Lass die Katze frei.
}
Das ist eine Katzen-wasch-Prozedur. Der Name der Prozedur ist Katze waschen. Als Eingabe erwartet die Prozedur eine schmutzige Katze und gibt nach erfolgreichem Ablauf eine saubere Katze aus. Am Anfang der Prozedur steht eine öffnende, geschwungene Klammer { und am Ende eine schließende }. Innerhalb der Prozedur stehen die Anweisungen, um eine Katze zu waschen. Wenn Du die Anweisungen nacheinander ausführst, sollte aus einer schmutzigen Katze eine saubere werden.
Wenn wir nochmal auf den Arduino-Sketch schauen, sehen wir, dass die Prozedur setup heisst und keine Eingabe erwartet - erkennbar an () - und auch nichts zurück gibt - erkennbar an dem Wort void.
void setup()
Möglicherweise fragst Du Dich jetzt, was wohl void heisst. Void ist englisch und bedeutet soviel wie leer, Lücke, Leerstelle oder nichts. Die Prozedur gibt also nichts zurück. Das bedeutet aber nicht, dass die Prozedur nichts tut, sondern eben nur, dass sie am Ende keinen konkreten Wert oder was auch immer zurück gibt.
Innerhalb dieser Prozedur befindet sich eine Anweisung:
pinMode(ledPin, OUTPUT); // sets the digital pin as output
Auf diese Anweisung werden wir später im Detail zurückkommen. Jetzt reicht es erst einmal zu wissen, dass das die Art ist, dem Arduino zu sagen, dass wir etwas mit einem physikalischen Pin am Prozessorchip vorhaben.
Prozeduraufrufe
Kommen wir zu den nächsten Anweisungen:
void loop() // run over and over again
{
digitalWrite(ledPin, HIGH); // sets the LED on
delay(1000); // waits for a second
digitalWrite(ledPin, LOW); // sets the LED off
delay(1000); // waits for a second
}
Wir wissen bereits, dass alles rechts von // Kommentare sind. Wir wissen mittlerweile auch, dass es sich um eine weitere Prozedur handelt, die loop heisst und weder eine Eingabe erwartet, noch eine Ausgabe zurückgibt. Diese Prozedur enthält mehrere Anweisungen, die wir uns jetzt der Reihe nach betrachten.
Wir überspringen zunächst die erste Anweisung und betrachten direkt die zweite und die vierte Anweisung.
Beide Anweisungen sind identisch. delay ist englisch und steht für eine Verzögerung. Die Bedeutung dieser Anweisung ist ähnlich wie die Aufforderung in der Katzenwasch-Prozedur: "Warte 3 Minuten.". Diese Anweisung sagt: "Lieber Arduino, Warte mit dem was Du tust eine bestimmte Zeit!. Danke!"
Um das zu tun, ruft die Anweisung eine Prozedur auf. Im Grunde genommen wollen wir, dass der Arduino eine Pause macht. Da wir selber nicht wissen, wie das geht, hat glücklicherweise jemand eine Prozedur mit dem Namen delay geschrieben, die wir aufrufen können und die das für uns erledigt. Das ist so ähnlich, als ob wir unsere Steuererklärung machen wollen, aber nicht genau wissen, wie das geht. Also beauftragen wir einen Steuerberater, geben ihm eine Menge Unterlagen und bekommen die Steuerrückerstattung als Ergebnis zurück.
Prozedur- Name
(Eingabewerte)
;
delay
(1000)
;
Das bedeutet, dass es irgendwo eine Prozedur gibt, die in etwa so aussehen muss:
void delay(Anzahl von Millisekunden)
{
"Lieber Arduino, Warte mit dem was Du tust für (Anzahl von Millisekunden)! Danke!"
}
(Selbstveständlich handelt es sich in diesem Beispiel nicht um gültigen Code.)
Halten wir fest, dass die delay-Prozedur wunderbar funktioniert und wir ihr nur noch mitteilen müssen, wieviele Millisekunden (1/1000 einer Sekunde) gewartet werden soll.
Bleibt noch die erste und die dritte Anweisung. Wir sehen, dass es sich hier auch um einen Prozeduraufruf handelt. Dieses Mal heisst die Prozedur digitalWrite Im Moment schauen wir uns auch das nicht näher an. Jetzt reicht es zu wissen, dass ein Pin auf dem Arduino-Chip an und aus geschaltet werden soll. Dieser Pin ist mit eine LED verbunden. Im Ergebnis geht diese LED an und aus.
Spezielle Prozeduren - setup() und loop()
Die Prozeduren setup() und loop() sind spezielle Prozeduren. setup() wird nach jedem Einschalten und nach jedem Reset des Arduino als erstes ausgeführt. Danach wird immer wieder alles ausgeführt, was in der Prozedur loop() steht. Erst wenn der Arduino ausgeschaltet wird, wird diese Prozedur beendet.
Das Beispiel verändern
Nachdem wir jetzt den gesamten Sketch analysiert haben, wird es Zeit einige Änderungen vorzunehmen. Ändere in Deiner Arduino-Software die Zahl in dem Prozeduraufruf delay von 1000 auf 500, so wie in dem nachfolgenden Beispiel:
void loop() // run over and over again
{
digitalWrite(ledPin, HIGH); // sets the LED on
delay(500); // waits for a second
digitalWrite(ledPin, LOW); // sets the LED off
delay(500); // waits for a second
}
Wenn Du versuchst, diesen Sketch zu speichern, erhältst Du eine Fehlermeldung, die besagt. dass diese Datei read-only (nur lesbar) ist.
Sketch is read-only
(Unter Windows oder OS X kann die Meldung etwas anders aussehen. Ich benutze Linux) :-)
Kein Problem. Du kannst den Sketch unter einem anderen Namen speichern, z. B. MyBlink oder jedem anderen Namen, der Dir passend scheint.
Sketch speichern unter ...
Jetzt muss der Sketch noch mit Verify/Compile so wie bereits beschrieben umgewandelt und auf den Arduino übertragen werden.
Kompilierung erfolgreich
Sketch hochgeladen
Sobald dieser geänderte Sketch auf dem Arduino läuft, sollte das Blinken jetzt schneller sein.
Falls die LED nicht schneller blinkt, überprüfe folgendes:
- Hast Du den Wert für den Aufruf von delay auf 500 geändert?
- War die Verify/Compile-Aktion erfolgreich? Hast Du die Meldungen so wie in dem Screenshot erhalten?
- War das Hochladen auf den Arduino erfolgreich? Vergleiche mit dem Screenshot!




0 Antworten auf “Lektion 2 - Blink blink bLiNk BLINK”