Jetzt ist es endlich soweit, und wir werden etwas an unsere Platine anschließen! In dieser Lektion werden wir verschiedene LEDs ein- und ausschalten und außerdem lernen, wie man die if-else Konditionalsätze verwendet. Jetzt kannst du all das anwenden, was wir bis jetzt gelernt haben.
- Kommunikaiton über die serielle Schnittstelle
- Funktionen und Variablen
Für diese Lektion benötigst du eine LED und eine Steuerplatine wie die ZUM BT 328 ( oder eine, die mit Arduino kompatibel ist).
Ein- und Ausschalten einer LED
Eine LED ein- und auszuschalten ist eines der ersten Programme mit Peripheriegeräten, die mit Arduino erstellt werden. Da es sich um das Erste handelt, werden wir es uns etwas intensiver ansehen. In den folgenden Lektionen gehen wir dann weniger detailliert vor.
Erste Frage: Ist eine LED analog oder digital? Eine LED ist eine digitale Komponente, die nur zwei Werte annehmen kann, nämlich ein und aus.
Zweite Frage: Ist eine LED eine Ausgangs- oder Eingangskomponente? Eine LED ist eine Ausgangskomponente, da wir ihr ein Kommando senden müssen, ihr mitteilen müssen, ob sie sich ein- oder ausschalten soll. Das Gegenteil von einem Sensor, der uns den ausgelesenen Wert angibt.
Beginnen wir damit, eine LED so wie es auf dem Bild gezeigt wird, an den digitalen Pin 8 der Platine anzuschließen.
Wir wir in den vorigen Lektionen erklärt haben, gibt es zwei grundlegende Funktionen bei der Arduino Programmierung, nämlich setup() und loop(). Die Funktion setup() ist für das Durchführen aller Konfigurations- und Initialisierungsaufgaben zuständig, während die Funktion loop() die Anweisungen enthält, die das Programm ausführt.
void setup()
Hier müssen wir bei der Konfiguration einzig und allein angeben, dass es sich beim digitalen Pin um eine Ausgabe handelt.
1 2 3 4 |
void setup() { pinMode(8,OUTPUT); // sets digital pin 8 as output } |
Die Funktion pinMode() enthält als ersten Parameter die Nummer des digitalen Pins und als zweiten die Arbeitsweise, die INPUT oder OUTPUT sein kann.
void loop()
Jetzt bringen wir die LED zum Blinken. Wir schalten sie ein, warten eine Sekunde, schalten sie aus und warten eine weitere Sekunde. Da die Funktion loop() in einer Schleife ausgeführt wird, führt dies dazu, dass die LED blinkt. Sehen wir uns den Code einmal an.
1 2 3 4 5 6 7 |
void loop() { digitalWrite(8, HIGH); //turn LED on delay(1000); //stop execution 1000 milliseconds digitalWrite(8, LOW); // turn LED off delay(1000); //stop execution 1000 milliseconds } |
Die Funktion digitalWrite() nimmt zwei Parameter an. Der erste ist die Zahl des digitalen Pins und der zweite ist der Zustand, den er besitzt: HIGH oder LOW. Ist der Zustand HIGH, besitzt der Pin 5 Volt, ist er hingegen LOW ist er geerdet (0 Volt). Dies führt dazu, dass sich die LED ein- oder ausschaltet. Um eine Schreibaktion auf einem digitalen Pin auszuführen, muss der pinMode zuvor auf OUTPUT gesetzt werden. Die Funktion delay() unterbricht die Ausführung für die angegebene Zeit in Millisekunden.
If-else Konditionalsätze
Ein Konditionalsatz verändert abhängig von einer Bedingung die Ausführung des Programms. Beispielsweise könnte man ein Programm erstellen, bei dem sich, bei Erhalt des Zeichens H die LED einschaltet, während sie sich beim Erhalt des Zeichens L ausschaltet. Sehen wir uns an, wie man das erreicht.
If-else Struktur
Die If-else-Anweisung besitzt die folgende Struktur:
1 2 3 4 5 6 7 8 9 |
if(condition) { //instruction 1 //instruction 2 }else() { //instruction 3 //instruction 4 } |
Ist die Bedingung erfüllt, werden die Anweisungen 1 und 2 ausgeführt; im umgekehrten Fall die Anweisungen 3 und 4. Zu beachten ist, dass es nicht notwendig ist, eine else-Anweisung einzufügen. Weitere Informationen zu diesem Thema finden sich in den offiziellen Unterlagen der Anweisung if und der Anweisung else.
Abhängig von einem Wert handeln
Sehen wir uns an, wie wir bei Erhalt des Zeichens H eine LED einschalten können und sie beim Erhalt des Zeichens L ausschalten. Wir erinnern uns an die vorige Lektion, bei der das Programm angehalten wurde bis wir Daten über die serielle Schnittstelle erhielten.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
void waitForInput(){ //While there is no data on Serial input while(Serial.available()==0){ delay(500); // wait 500 ms and check again } // hey!! something arrived // while there is data pending while(Serial.available()>0){ Serial.read(); //read and empty Serial } // when arrived here, Serial is empty and we have received something // that is what we wanted! } |
Verändern wir die Funktion, damit sie das Zeichen speichert, das sie über die serielle Schnittstelle erhalten hat. Diesen Wert soll sie an eine andere Funktion senden (die wir später erstellen), die bestimmt, was mit dem gelesenen Zeichen passieren soll. Wir nennen sie manageChar(). Sehen wir uns an, wie das Programm aussehen würde. Anschließend erklären wir es.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
int ledPin = 8; //global variable for the pin number /** * This funcions receives a char as parameter * and switchs on/off the LED depending on its value */ void manageChar(char c){ //if the char equals H if(c=='H') { digitalWrite(ledPin, HIGH); //switch LED on } //if the char equals L if(c=='L') { digitalWrite(ledPin,LOW); //switch LED off } } /** * This function stops execution of program until * something is received through serial port * The received chars are sent to manageChar function */ void waitForInput(){ //While there is no data on Serial input while(Serial.available()==0){ delay(500); // wait 500 ms and check again } // hey!! something arrived // while there is data pending while(Serial.available()>0){ char incomingChar = Serial.read(); //read and empty Serial manageChar(incomingChar); } // when arrived here, Serial is empty and we have received something // that is what we wanted! } void setup() { Serial.begin(9600); //start serial communiation at bautrate 9600 pinMode(ledPin, OUTPUT); //sets the LED pin as output } void loop() { waitForInput(); //waits for serial port input } |
int ledPin = 8;
Wir speichern die Nummer des Pins an dem die LED angeschlossen ist in einer globalen Variable. So vermeiden wir, dass wir beim Schreiben in den verschiedenen Teilen des Programmes einen Fehler .
void manageChar(char c)
Diese Funktion nimmt ein Zeichen als Parameter. Wenn der Wert dieses Parameters H ist (das Gleichheitszeichen schreibt man in Arduino so ==) schaltet sich die LED, die am ledPin angeschlossen ist ein (in unserem Fall die 8), wenn der Parameter L ist, schaltet sie sich aus. Sollte der Parameter weder H noch L sein, führt die Funktion keinerlei Aktion aus.
void waitForInput()
Wie wir in der vorigen Lektion gesehen haben, wartet diese Funktion darauf, Daten über die serielle Schnittstelle zu erhalten. Wir haben sie dahingehend abgeändert, dass sie den gelesenen Wert in einer Variable des Typ char speichert (wir erinnern uns, dass die Funktion Serial.read() einen char -byte-ausgibt)
1 2 |
char incomingChar = Serial.read(); //read and empty Serial manageChar(incomingChar); |
Anschließend wir der ausgelesene Wert an die Funktion manageChar gesendet, damit die LED sich entsprechend ein- oder ausschaltet.
setup()
Lege den Pin 8 als Ausgang fest und beginne die serielle Kommunikationen mit 9600 Baud.
loop()
Dies ist die Funktion, die in einer Schleife ausgeführt wird. In diesem Fall wartet sie darauf, Daten über die serielle Schnittstelle zu erhalten. Sobald sie diese erhält, werden sie mit der Funktion manageChar() bearbeitet. So geht es dann immer weiter.
Übung
Versuche nun, mit dem was du bisher gelernt hast, das folgende Programm zu erstellen. Die Lösung veröffentliche ich nächste Woche in der nächsten Lektion. Erstelle ein Programm, das Daten über die serielle Schnittstelle ausliest und die gelesenen Werte auf die folgende Art und Weise bearbeitet:
- Erstes Zeichen: gibt die Nummer des digitalen Pins an, zwischen 0 und 9.
- Zweites Zeichen: gibt an, ob die mit dem entsprechenden Pin verbundene LED mit dem Wert H oder L ein- oder ausgeschaltet wird.
Das bedeutet, dass wenn die folgende Sequenz 1H4L5H2L über die serielle Schnittstelle ankommt, Folgendes ausgeführt wird:
- Mit den Pins 1 und 5 verbundene und eingeschaltete LEDs.
- Mit den Pins 2 und 4 verbundene und ausgeschaltete LEDs.
- Alle übrigen LEDs verbleiben in dem Zustand, in dem sie sich zuvor befunden haben.
Na dann mal los. Warum versuchst du nicht, die Lösung zu finden, teilst den Code und wenn du dich traust, schickst du uns ein Video mit der Funktionsweise. Die Lösung zeige ich dir in der nächsten Lektion.