X. Besser (ran)tasten

In der Regel sind zur Steuerung des Mikrocontrollers von außen Taster besser geeignet als Schalter.

Daher soll das Blinkprogramm nun derart abgeändert werden, dass der Programmzustand mit Hilfe eines Tasters beeinflusst werden kann.

Besondere Herausforderung ist, dass der Taster kurzzeitig ein Signal am Eingang des Arduino anlegt. Um die Funktionsweise eines Schalters nachzuempfinden, muss eine zusätzliche Variable eingeführt werden. In ihr speichert man sich den alten Schaltzustand, um eine Flankenerkennung zu realisieren (Wechsel von LOW -> HIGH):

int letzterTasterZustand=LOW;
int tasterPinNr = 10;
int ledPinNr = 13;
int ledZustand = LOW;

void setup() {
    pinMode(tasterPinNr, INPUT);
    pinMode(ledPinNr, OUTPUT);
}

void loop() {
    int aktuellerTasterzustand = digitalRead(tasterPinNr);

    if(aktuellerTasterzustand==HIGH && 
                              letzterTasterZustand==LOW) {
        letzterTasterZustand = aktuellerTasterzustand;
        if(ledZustand == LOW) {
            ledZustand = HIGH;
        } else {
            ledZustand = LOW;
        }
    }
    digitalWrite(ledPinNr, ledZustand);
}

Diese einfache Lösung verhindert noch nicht die mehrfache Erkennung von Flanken aufgrund von typischen Tasterprellen.

9. Digitale Sensoren

Der Helligkeitssensor der in der Lektion zur Helligkeitserfassung eingesetzt wurde ist ein einfacher analoger Sensor.

Mittlerweile gibt es eine Vielzahl intelligenter, digitaler Sensoren. Zwar sind die Kosten dieser Sensoren i. d. R. höher, allerdings sind sie oft bei höherer Genauigkeit einfacher einzubinden.

[in work]

8. LEDs dimmen

Der Arduino verfügt über sogenannten PWM Ausgänge.

Diese ermöglichen die Helligkeitssteuerung von LEDs.

[In work]

Auftrag

1) Erstellen Sie ein Programm, das abhängig von der Umgebungshelligkeit die LEDs dimmt

6. Schalter nutzen

An den GPIOs des Arduino lassen sich nicht nur Signale ausgeben, um beispielsweise LEDs einzuschalten. Es lassen sich auch Eingaben verarbeiten.

Dazu muss der GPIO in der Programmierung als Eingang festgelegt werden:

int eingangsPin = 10;

void setup() {
    [...]
    pinMode(eingangsPin, INPUT);
    [...]
}

Die Hardwareverschaltung wird im folgenden Bild angezeigt:

Der Taster muss mit einem sogenannten pull-down Widerstand angeschlossen werden, um auch im nicht betätigten Zustand des Schalters ein definiertes Potenzial am Pin des Mikrocontrollers zu haben. (Bei Verwendung des pin-Modes  INPUT_PULLUP kann auch der in den Arduino integrierte pull-down Widerstand aktiviert werden, dann kann auf den Einsatz des externen pull-down Widerstands verzichtet werden.)

Auftrag

1) Ergänzen Sie einen Schalter und geben Sie den Schaltzustand über den Serialmonitor aus.

2) Passen Sie Ihr Blinkprogramm an, so dass der Blinker nur bei eingeschaltetem Schalter aktiv ist.

5. Variablen nutzen

Statt feste Werte in Programmen zu verwenden, ist es möglich Variablen einzusetzen. Variablen können als Platzhalter verstanden werden. Zum einen helfen sie, Programme übersichtlicher zu machen. Zum anderen sind viele Funktionen erst mit ihnen möglich.

Variablen müssen im Programm vor der Verwendung bekannt gemacht werden. Diesen Vorgang nennt man Deklaration.

Eine Variablendeklaration hat in folgender Form zu erfolgen:

Typ Name [ = Wert ]

Der Typ beschreibt die Art der Daten, die in der Variable gespeichert werden kann. Vorerst ist es ausreichend den Datentyp int zu kennen. Er dient dazu, Ganzzahlen zu speichern.

Der Name ist (fast) frei wählbar. Die Groß-/Kleinschreibung ist bedeutend! Der Wert ist optional. Die Variable kann zu Beginn einen definierten Wert erhalten. In Syntax­be­schreibungen wird dies häufig durch eckige Klammern kenntlich gemacht. Die erste Zuweisung eines Werts zu einer Variablen bezeichnet man auch Initialisierung.

Auftrag

1) Schreiben Sie das Blink-Programm mit Hilfe von Variablen um:

int ledPinNr = 13;
 
void setup() {
    pinMode(ledPinNr, OUTPUT);
}
 
void loop() {
    digitalWrite(ledPinNr, HIGH);
    delay(1000);
    digitalWrite(ledPinNr, LOW); 
    delay(1000);
}

2) Untersuchen Sie die Funktionsweise folgender Programme und begründen Sie warum die Variante B nicht wie gewünscht funktioniert.

Variante A:

int ledPinNr;

void setup() {
    ledPinNr = 13;
    pinMode(ledPinNr, OUTPUT);
}

void loop() {
    digitalWrite(ledPinNr, HIGH);
    delay(1000);
    digitalWrite(ledPinNr, LOW); 
    delay(1000);
}

Variante B:

int ledPinNr;
  
void setup() {
  pinMode(ledPinNr, OUTPUT);
}

void loop() {
  digitalWrite(ledPinNr, HIGH);
  delay(1000);
  digitalWrite(ledPinNr, LOW); 
  delay(1000);
}

3) Programmoptimierung

Im unten stehenden Programm wurde eine Variable eingeführt, um die Blinkverzögerung zu steuern. Untersuchen Sie das Programm auch mit den Serialmonitor und  erläutern Sie die Bedeutung und Sinnhaftigkeit der Zuweisungen 1 – 3.

int ledPinNr = 13;
int verzoegerung = 1000;  // Zuweisung 1

void setup() {
    Serial.begin(9600);
    pinMode(ledPinNr, OUTPUT);
    verzoegerung = 10;    // Zuweisung 2
}

void loop() {
    verzoegerung = verzoegerung+1000; // Zuweisung 3
    Serial.println(verzoegerung);
    digitalWrite(ledPinNr, HIGH);
    delay(verzoegerung);
    digitalWrite(ledPinNr, LOW); 
    delay(verzoegerung);
}

4. Eine externe LED anschließen

Der Arduino verfügt über zahlreiche Anschlussmöglichkeiten den sogenannten GPIOs (General Purpose Input Outputs).
Diese Anschlusspins können genutzt werden um beispielsweise weitere LEDs anzuschließen.

ampelsimulation

Entwickeln Sie eine Ampel indem Sie 3 LEDs an den das Mikrocontrollerboard anschließen und eine Ampelschaltung programmieren.

Anschluss von LEDs

LEDs können je nach Mikrocontroller an den GPIOs anschließen. Beim Arduino ist es erlaubt, sie an die digitalen Pins DX oder auch an die auch für analoge Zwecke nutzbaren analogen Pins AX anschließen.
Um die LEDs auf die durch den Mikrocontroller-Pin bereit gestellte Spannung anzupassen und den maximal zulässigen Strom einzuhalten, müssen die LEDs mit einem Vorwiderstand versehen werden.
Eine Beschreibung des genauen Anschlusses folgt.