Für dieses Bastelprojekt wird nicht viel benötigt und im Grunde genommen kommen wir auch ohne zusätzliche Bauteile aus, denn auf dem Arduino-Board befindet sich eine LED mit der Bezeichnung L . Dennoch möchte ich dieses Bastelprojekt mit ein paar Komponenten anreichern, die auch in weiteren Projekten Verwendung finden:
Tabelle 1: Bauteilliste |
Bauteil |
Bild |
LED rot 1x |
 |
Widerstand 330Ω 1x |
 |
Widerstand 10K Ω 1x |
 |
Mikrotaster 1x |
 |
Der Schaltplan zeigt uns zur Sicherung eines sicheren Eingangspegels einen externen Pulldown-Widerstand am digitalen Pin 8.
Abb. 6:Der Schaltplan zur Tasterabfrage
Der Schaltungsaufbau geht auf einem entsprechenden Breadboard leicht von der Hand und ist schnell realisiert.
Abb. 7:Der Schaltungsaufbau zur Tasterabfrage auf dem Arduino Discoveryboard
Mit diesen technischen Grundlagen ausgestattet, wenden wir uns jetzt dem Sketch zu.
Der Sketch zur Abfrage des Tasters und Ansteuerung der LED sieht wie folgt aus:
int ledPin = 13; // LED-Pin 13 int tasterPin = 8; // Taster-Pin 8 int tasterStatus; // Variable für den Tasterstatus void setup() { pinMode(ledPin, OUTPUT); // LED-Pin als Ausgang pinMode(tasterPin, INPUT); // Taster-Pin als Eingang } void loop() { tasterStatus = digitalRead(tasterPin); if(tasterStatus == HIGH) digitalWrite(ledPin, HIGH); else digitalWrite(ledPin, LOW); }
Es ist zu erkennen, dass in diesem Sketch mit mehreren Variablen gearbeitet wird, die am Anfang erst einmal deklariert werden müssen. Die Erklärungen dazu befinden sich hinter den Deklarationen im Sketch als Kommentare.
Was ist bei einem digitalen Pin zu beachten?
Ein digitaler Pin arbeitet standardmäßig als Eingang und benötigt deswegen keine explizite Konfiguration über den Befehl pinMode , wie das hier zu sehen ist. Es erhöht jedoch die Lesbarkeit, wenn es trotzdem erfolgt. Es kann weggelassen werden, wenn der Speicherplatz einmal knapp werden sollte.
Werfen wir kurz einen Blick auf das Flussdiagramm:
Abb. 8:Das Flussdiagramm zur LED-Ansteuerung
Das Diagramm liest sich recht einfach. Wenn die Ausführung des Sketches in der loop -Endlosschleife angekommen ist, wird der Zustand des Taster-Pins kontinuierlich abgefragt und in der Variablen tasterStatus abgelegt. Die entsprechende Zeile lautet:
tasterStatus = digitalRead(tasterPin);
Je nach Rückgabewert erfolgt die Auswertung über eine Kontrollstruktur in Form einer if-else -Anweisung (Wenn-Dann-Sonst):
if(tasterStatus == HIGH) digitalWrite(ledPin, HIGH); else digitalWrite(ledPin, LOW);
Die if -Anweisung bewertet den in runden Klammern stehenden Ausdruck, der umgangssprachlich ungefähr so formuliert werden könnte: »Ist der Inhalt der Variablen tasterStatus gleich dem Wert HIGH ? Falls ja, dann führe den Befehl aus, der der if -Anweisung unmittelbar folgt. Falls nicht, fahre mit der Anweisung fort, die der else -Anweisung folgt.« Das folgende Flussdiagramm erleichtert das Verständnis dieser Kontrollstruktur:
Abb. 9:Flussdiagramm zur if-else-Kontrollstruktur
Es gibt auch noch eine einfachere Variante dieser Kontrollstruktur, bei der der else -Zweig nicht vorhanden ist. Du siehst, dass ein Programmablauf nicht unbedingt geradlinig verlaufen muss. Es können Verzweigungen eingebaut werden, die anhand von Bewertungsmechanismen unterschiedliche Befehle oder Befehlsblöcke zur Ausführung bringen. Ein Sketch agiert nicht nur, sondern reagiert auf äußere Einflüsse, beispielsweise auf Sensorsignale.
Zuweisungsoperator kontra Gleichheitsoperator
Ein sehr häufiger Anfängerfehler ist die Verwechslung von Gleichheits- und Zuweisungsoperator. Der Gleichheitsoperator == und der Zuweisungsoperator = haben völlig unterschiedliche Aufgaben, werden aber häufig verwechselt. Das Heimtückische ist, dass beide Schreibweisen in einer Bedingung verwendet werden können und gültig sind.
Hier die korrekte Verwendung des Gleichheitsoperators:
if(tasterStatus == HIGH)
Nun die falsche Verwendung des Zuweisungsoperators:
if(tasterStatus = HIGH)
Aber warum erzeugt diese Schreibweise keinen erkennbaren Fehler? Ganz einfach: Es erfolgt eine Zuweisung der Konstanten HIGH (numerischer Wert 1) an die Variable tasterStatus . 1 bedeutet kein Nullwert und wird als true (wahr) interpretiert. Bei einer Codezeile, die if ( true )... lautet, wird der nachfolgende Befehl immer ausgeführt. Ein numerischer Wert 0 wird in C/C++ als false (falsch) angesehen und jeder von 0 verschiedene als true . Derartige Fehler haben es in sich und es muss immer wieder sehr viel Zeit darauf ver(sch)wendet werden, sie ausfindig zu machen.
Überprüf deine Steckverbindungen auf dem Breadboard, ob sie wirklich der Schaltung entsprechen.
Sind die LEDs richtig herum eingesteckt worden? Denk an die richtige Polung.
Hast du den Taster richtig angeschlossen?
Der Mikrocontroller des Arduino Uno verfügt über interne Pullup-Widerstände, die einen Wert von 20KΩ besitzen.
Diese Widerstände können entweder über eine Sequenz von pinMode- beziehungsweise digitalWrite-Befehlen oder über einen einzigen pinMode-Befehl mit den Modi INPUT_PULLUP oder INPUT aktiviert beziehungsweise deaktiviert werden.
Über den Befehl digitalRead kann der Pegel eines digitalen Pins abgefragt werden.
Über Kontrollstrukturen wie if oder if-else kann Einfluss auf den Programmablauf genommen werden.
Читать дальше