LEDChaserProgLEDandere

Aus Arduino Hannover
Wechseln zu: Navigation, Suche

Eine andere LED blinken lassen

Lassen wir nun eine andere LED blinken. Dazu musst Du nur die Nummer des LED-Pins ändern:

/*  Sketch 02 - blink
 *
 *  Lässt die zweite LED des LED-Chasers
 *  blinken.
 *
 *  2016-10-21   Andreas   Sketch erzeugt
 *
 ****************************************/

// setup: wird einmal zu Beginn ausgeführt

void setup ()
{
    pinMode (4, OUTPUT);
}

// loop: wird immer wieder ausgeführt

void loop ()
{
    digitalWrite (4, LOW);  // LED einschalten
    delay (1000);
    digitalWrite (4, HIGH);   // LED ausschalten
    delay (1000);
}

Das war's schon. Wenn Du den Sketch übersetzt und hoch lädst, wird die nächste LED blinken.

Dir ist bestimmt aufgefallen, dass Du die Pin-Nummer an drei Stellen ändern musstest. Das ist unschön. Dieser Sketch ist noch sehr übersichtlich, aber stell Dir vor, dass Du einen sehr langen Sketch hast, oder sogar mehrere Dateien verwendest. Da vergisst man gerne mal eine Stelle beim Ändern.

Die erste Idee ist, eine sogenannte globale Variable zu definieren.

/*  Sketch 03 - blink
 *
 *  Lässt die zweite LED des LED-Chasers
 *  blinken.
 *
 *  2016-10-21   Andreas   Sketch erzeugt
 *
 ****************************************/

byte pin_nr = 4;

// setup: wird einmal zu Beginn ausgeführt

void setup ()
{
    pinMode (pin_nr, OUTPUT);
}

// loop: wird immer wieder ausgeführt

void loop ()
{
    digitalWrite (pin_nr, LOW);  // LED einschalten
    delay (1000);
    digitalWrite (pin_nr, HIGH);   // LED ausschalten
    delay (1000);
}

Zwei Dinge sind hier neu:

Die Variable pin_nr ist vom Datentyp byte. Dieser Datentyp ist platzsparender als int, kann aber nur Zahlen von 0 bis 255 speichern. Für die Pin-Nummern reicht das aus.

Außerdem steht die Definition der Variablen außerhalb der beiden Funktionen setup und loop. Das bedeutet, dass die Variable innerhalb aller Funktionen bekannt ist - deshalb globale Variable.

Nun brauchst Du nur eine Zahl zu ändern. Probier's aus - Du kannst hier jede Zahl von 3 bis 12 verwenden.

Jedoch: Niemand verwendet dies so. Das liegt daran, dass sich der Wert der Variablen pin_nr während des Programmlaufs nicht ändert. Die Nummer des Anschlusspins wird einmal festgelegt. Diese Nummer ist also konstant. Es gibt zwei Möglichkeiten dies im Programm auszudrücken. Erstens: die "alte" Möglichkeit. Dies existiert in C seit Anfang an. Statt der Zeile, in der die Variable pin_nr definiert wird, schreibe:

#define PIN_NR 4

und ändere im restliche Quellcode pin_nr in PIN_NR. Im Prinzip kannst Du auch alles in Kleinbuchstaben lassen - es ist allerdings Konvention unter C-Programmierern, dass Konstanten in Großbuchstaben geschrieben werden.

Die Zeilen, die mit einem "Lattenkreuz" (#) beginnen sind sog. Präprozessor-Direktiven. Der Präprozesser nimmt den Quellcode vor dem eigentlichen Übersetzungsvorgang und ersetzt hier alle Vorkommen von PIN_NR durch 4. Der Vorteil ist, dass kein Speicherplatz verschwendet wird. In der ersten Version wird vom Speicher des Arduino ein Byte verwendet, um eine Zahl zu speichern, die sich nicht ändert. Ein einziges Byte ist noch nicht viel; bei größeren Programmen kann sich das allerdings aufsummieren.

Zweitens: die "neue" Möglichkeit. Statt der #define-Zeile schreibe:

const byte PIN_NR = 4;

Der Unterschied zu ersten Version ist das Wörtchen const am Anfang der Zeile. Hiermit wird dem Compiler gesagt, dass sich der Wert der Variablen PIN_NR nicht ändert. Diese Art der Konstanten-Definition hat zwei Vorteile:

  1. Der Compiler kennt den Datentyp und kann bei fehlerhafter Verwendung Warnungen oder Fehler ausgeben.
  2. Trotzdem kann die Variable nicht geändert werden.

Das Programm sieht jetzt also folgendermaßen aus:

/*  Sketch 04 - blink
 *
 *  Lässt die zweite LED des LED-Chasers
 *  blinken.
 *  Version mit Konstante.
 *
 *  2016-10-21   Andreas   Sketch erzeugt
 *
 ****************************************/

const byte PIN_NR = 4;

// setup: wird einmal zu Beginn ausgeführt

void setup ()
{
    pinMode (PIN_NR, OUTPUT);
}

// loop: wird immer wieder ausgeführt

void loop ()
{
    digitalWrite (PIN_NR, LOW);  // LED einschalten
    delay (1000);
    digitalWrite (PIN_NR, HIGH);   // LED ausschalten
    delay (1000);
}

Nebenbei: Die Werte OUTPUT, HIGH und LOW sind ebenfalls Konstanten, die in den Tiefen der Arduino-Umgebung definiert sind. Du wirst noch einige andere kennen lernen; und Du erkennst ab jetzt sofort, was eine Konstante ist.

Nun kannst Du noch einmal andere LEDs blinken lassen, indem Du einfach die Konstante änderst.