Arduino- Physical Computing für Bastler, Designer und Geeks. (Amzon Partnerlink) vom O’Reilly Verlag ist laut eigener Aussage das erste deutschsprachige Buch zum Thema Arduino. Ich habe im Dezember letzen Jahres ein Exemplar der ersten Auflage gekauft, weil mich das Thema Arduino interessiert und ich einfach mal ein bischen damit rumprobieren wollte. Leider merkt man dem Buch an, dass es unbedingt das erste deutschsprachige sein wollte. Auch wenn mir die Texte und Beschreibungen gut gefallen, es hapert an einer anderen, sehr bedeutenden Stelle: dem Beispielcode.

Fast kein einziges Programm in diesem Buch kommt fehlerfrei daher und vielen merkt man an, dass niemand Korrektur gelesen hat. Dabei wäre es so einfach gewesen: schnell die Schaltung zusammengesteckt, Programm mit Copy & Paste auf den Arduino geworfen und nachsehen ob es funktioniert. Da ich zumindest ein paar Grundlagen in Sachen Programmierung beherrsche war es kein großer Aufwand die Fehler zu finden und zu korrigieren und sicherlich habe ich dadurch deutlich mehr gelernt als durch stumpfes abtippen. Aber für jemandwn, für den das alles ganz neu ist, kann es sicherlich schnell frustierend werden.

Daher habe ich mir überlegt, dass ich eine kleine Serie starte in der ich die Fehler aufzeige und die korrigierten Codebeispiele poste.

Los geht es in Kapitel 3 auf Seite 90. Ziel ist es zwei LEDs mit einem Schalter zu steuern. In Grundzustand soll LED 1 leuchten und LED 2 nicht, bei gedrücktem Schalter umgekehrt. Im Buch steht folgender Code:

int val = digitalRead(schalter);
int ledPin1 = 13;
int ledPin2 = 12;
int schalter = 2;
void setup()
{
  pinMode(ledPin1, OUTPUT);
  pinMode(schalter, INPUT);
  digitalWrite(schalter, HIGH);
}
void loop() {
  int val = digitalRead(schalter);
  if (val == HIGH) {
    digitalWrite(ledPin1, HIGH);
    digitalWrite(ledPin2, LOW);
  }
  else {
    digitalWrite(ledPin1, LOW);
    digitalWrite(ledPin2, HIGH);
  }
}

Zwei Dinge stimmen hier nicht.

Zum einen die erste Zeile, diese liest den Input vom Schalter und schreibt diesen in den Integer val. Da sie diesen auch gleich erschafft macht es keinen Sinn, dass sie oben bei der Definition der Variablen steht. Korrekt platziert findet sie sich auch noch einmal in der ersten Zeile des Loops. Die erste Zeile kann also weggelassen werden.

Der zweite Fehler findet sich im Setup Block und ist sogar noch trivialer: es wurde vergessen einen zweiten digitalen Pin für die zweite LED als Output zu definieren.

Der korrigierte Code:

int ledPin1 = 13;
int ledPin2 = 12;
int schalter = 2;
void setup()
{
  pinMode(ledPin1, OUTPUT);
  pinMode(ledPin2, OUTPUT);
  pinMode(schalter, INPUT);
  digitalWrite(schalter, HIGH);
}
void loop() {
  int val = digitalRead(schalter);
  if (val == HIGH) {
    digitalWrite(ledPin1, HIGH);
    digitalWrite(ledPin2, LOW);
  }
  else {
    digitalWrite(ledPin1, LOW);
    digitalWrite(ledPin2, HIGH);
  }
}