04 Die Variable - Ein Stromkreis, tausend Verhalten

 

Programmierung durch Verdrahtung. In den Anfängen der angewandten Kybernetik wurden Roboter nicht durch Software gesteuert. Die Funktionen waren fest verdrahtete Elektronik. Man benutzte unterschiedliche Elektronikelemente wie Transistoren, elektromagnetische Relais, Kondensatoren und vieles mehr. Diese Maschinen funktionierten ziemlich gut.

Es gab aber große Nachteile: Das Verdrahten der Komponenten war sehr zeitaufwendig, komplex und kostspielig. Außerdem waren die Funktionen im wahrsten Sinne des Wortes "fest". Eine Erweiterung oder Veränderung der Roboterfunktionen musste per Verdrahtung durchgeführt werden. Komplexes, vielschichtiges Verhalten war bei autonomen mobilen Robotern schwer zu realisieren.

Der immense Vorteil von programmierbarer Elektronik gegenüber fest verdrahteter Elektronikkomponenten, ist die Flexibilität. Mit nur einem Arduino-Board und ein paar Modulen können wir tausende unterschiedliche Verhalten erstellen, in dem wir "nur" die Programmierung ändern, anstatt die Verdrahtung.

Die Variable – dein Freund und Helfer

Die Variable ist einer der Gründe für die Flexibilität einer Programmiersprache. Der Name verrät es schon: Eine Variable kann variieren – sich ändern. Das Konzept der Variable kennst du bereits aus der Mathematik:

x = y+3

In einer Variable können wir unterschiedliche Daten abspeichern. Man kann sie als ein Platzhalter ansehen, der im Mikrocontroller-Speicher einen bestimmten Platz besetzt. Ein Beispiel: Ein Thermometer reserviert eine Variable namens temperatur innerhalb des Speichers. Bei jeder Temperaturänderung wird nun der neue Temperaturwert im reservierten Speicherplatz namens temperatur platziert und laufend aktualisiert.

####Abbildung

Das hört sich zunächst unspektakulär an, hat aber immense Vorteile, wie wir später sehen werden. Variablen sind von einem bestimmten Typ, haben einen Namen und einen Wert. Hier ein Beispiel:

int meineVariable = 13;

Die Buchstaben int bilden die Abkürzung für Integer und ist der am meisten verwendete Variablentyp. Es handelt sich dabei um Ganzzahlen, die keine Kommawerte besitzen. Den Namen einer Variablen (meineVariable) kann man frei wählen. Sie dient der eindeutigen Identifizierung. Es sollten keine zwei Variablen den gleichen Namen haben, die für unterschiedliche Zwecke eingesetzt werden. Die Zahl 13 ist der Wert der Variablen, die wir ihr geben.

Unterschiedliche Variablentypen

Die Variable int ist nur eine von vielen Variablentypen. Die untere Liste zeigt eine Übersicht der verfügbaren Variablen. In späteren Kapiteln werden wir einige Variablen näher erläutern. Im Moment konzentrieren wir uns nur auf die Variable int.

Aber warum gibt es eigentlich so viele unterschiedliche Variablen? Die Antwort ist praktischer Natur: Hauptsächlich aus Gründen der Speicherkapazität. In Mikrocontrollern ist der Speicher rar und teuer.

Wie schon erwähnt, speichert eine Variable Daten. Jedes Mal, wenn wir einen bestimmten Variablentyp auswählen, fällt der Speicherort unterschiedlich groß aus. Je nach Variablentyp wird mehr oder weniger Speicherplatz belegt. Machen wir drei Beispiele und sehen uns die Datengrößen an. Vergleichen wir die Daten von einem Taster, einer Lichtschranke und eines Thermometers:

 

Taster-Beispiel – die Boolean-Variable

Stell dir vor, du willst wissen, ob ein Taster ein- oder ausgeschaltet ist. Hier könnte man die Boolean-Variable einsetzen, die nur zwei Zustände kennt: 0 oder 1. Die Variable Boolean beansprucht nur 8Bit (=1Byte) Speicherplatz für sich. In der Informatik ist das die kleinstmögliche Menge an Information.

#####bild

 

Lichtschranken-Beispiel – die Integer-Variable

Nun stell dir vor, du platzierst eine Lichtschranke an einem Fußgängerweg, um die Zahl der vorbeigehenden Passanten in einer bestimmten Zeit zu erfassen. Ein Boolean wäre hier völlig nutzlos, da wir höchstens eine Person zählen könnten. Besser ist ein Integer (Ganzzahlen) geeignet, dessen Wertebereich zwischen –32768 bis 32767 liegt. Ein Integer belegt 16Bit (=2Byte) Speicher – doppelt so viel wie Boolean.

Wir könnten natürlich im Taster-Beispiel auch eine Integer-Variable verwenden, der die zwei Zustände von 0 und 1 locker abdeckt. Besteht aber ein Speicherplatzproblem, dann ist Boolean die bessere Wahl.

#####bild

 

Thermometer-Beispiel – die Float-Variable

Jetzt stell dir vor wir wollen die Körpertemperatur so genau wie möglich messen. Wir brauchen dazu eine Genauigkeit von 0,1° Schritten. Dann wäre die Verwendung von Integer nicht zielführend, da dieser keine Kommastellen darstellen kann. Eine bessere Wahl ist die Variable float, die Kommazahlen abbilden kann. Ihr Wertebereich ist recht groß: –3.4028235E+38 bis 3.4028235E+38.

 

Wie du sehen kannst, konzentriert float seine Aufmerksamkeit auf die Zahlen nach dem Komma. Sie verbraucht im Speicher ganze 32Bit (=4Byte) – doppelt so viel wie Integer.

Wir könnten auch die float-Variable im Taster-Beispiel verwenden. Dies wäre aber eine schiere Verschwendung an Speicherkapazität.

#####bild

An diesen Beispielen siehst du, dass je nach Anwendung eine treffende Wahl gefällt werden muss. Meistens kommt man mit Integerwerten ganz gut über die Runden und muss sich keine großen Gedanken machen. Ist der Sketch mit der Zeit umfangreicher geworden und grenzt hart an der Speicherkapazität, beginnt spätestens dann die Suche nach Speicher schonenden Variablen.

 

Der Vorteil einer Variablen

Sehen wir uns an welchen Vorteil eine Variable in unserem Blink-Beispiel haben kann. Du wirst im unteren Sketch erkennen, dass die Pinnummer 13 nur einmal auftaucht, anstatt dreimal wie im bisherigen Blink-Sketch.

int ledPin =13;

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

voidloop()
{
digitalWrite(ledPin,HIGH);
delay(1000);
digitalWrite(ledPin,LOW);
delay(1000);
}

Im Detail

Anstatt die Pinnummer 13 überall im Sketch einzutippen, speichern wir sie direkt in der Variablen mit dem Namen ledPin.

int ledPin =13;

Ab jetzt wird der Wert 13 automatisch überall eingesetzt, wo die Variable ledPin auftaucht. Beispielsweise wird in pinMode() für ledPin der Wert 13 verwendet. Beachte, dass die formulierte Variable int ledPin = 13; außerhalb von void setup() und void loop() platziert ist. Sie kann auch innerhalb von setup und loop stehen, dann ändert sich jedoch die Funktionsweise. Auf diesen Punkt werden später noch eingehen.

pinMode(ledPin,OUTPUT);

Auch in den digitalWrite()-Funktionen, wird nun die Zahl 13 automatisch platziert.

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

Dieses Konzept ist super praktisch, falls im Nachhinein Werte geändert werden sollen. Es werden an unterschiedlichen Programmstellen gleichzeitig viele Werte ausgetauscht. Ein mühseliges Suchen und ersetzen per Hand entfällt.

Der Variablenname ist frei wählbar, solange es nicht mit dem Namen einer Funktion oder Systembezeichnungen kollidiert. Das sind Bezeichnungen, die sich in der Arduino IDE farblich verändern. Wir könnten z.B. eine Variable nicht delay nennen, da sie bereits vom System belegt ist.

Gleichung versus Zuweisung - hat nichts mit Mathematik zu tun.

Eine Gleichung kennen wir aus der Mathematik. Wie der Name schon sagt, ist hier etwas gleich. Das Zeichen = stellt ein Gleichgewicht her. In der Programmierung funktioniert das Gleich-Zeichen = anders. Ist einem der Unterschied zwischen Gleichung und Zuweisung nicht bekannt, erwarten einen viele merkwürdige Überraschungen, weil sich das Gleich-Zeichen = anders verhält.

In einer mathematischen Formel definieren wir x=5 und y=7. Platzieren wir die beiden Variablen in eine Gleichung x=y so ergibt das keine Lösung, den 5 ist nicht gleich 7!

x = 5

y = 7 

x=y > 5 ≠ 7   //Fehler!

 

In der Programmierung ist das anders. Den hier sprechen wir von einer Zuweisung und keiner Gleichung. Die Variable x hat den Wert 5 und die Variable y den Wert 7 zugewiesen. Im nächsten Moment wird aber x neu definiert: x=y. Die Variable x hat jetzt den Wert von y, also 7. Der ursprüngliche Wert von 5 wird einfach überschrieben.

x = 5

y = 7

x = y;   // neuer Wert, die Variable x hat jetzt den Wert y zugewiesen bekommen. x hat jetzt den Wert 7!

Übungen

1. Formuliere den Blink-Sketch um
Ersetze die Zahl 13 in void setup() und void loop() mit einer Variablen. Wenn du eigene Variablennamen vergibst, achte darauf, dass keine Umlaute wie ä, ü und ö enthalten sind. Sie werden von der Arduino IDE nicht akzeptiert. In Kommentaren sind sie wiederum erlaubt. Eine Variable Namens grün kannst du als gruen umschreiben.

###lösung fehlt

 

2. Ersetze delay mit einer Variablen
Den Pin haben wir oben schon mit einer Variablen ausgerüstet. Probiere folgendes: Schreibe deinen blink_Code so um, dass du mit einer Variablen alle Zeiteinheiten in den delay()-Funktionen ersetzen kannst.  

 ###lösung fehlt