Ampelschaltung

Ziel dieses Projektes ist es, eine Ampel zu simulieren und diese mit einem Button umzuschalten.

Aufbau

Um alle Komponenten anzuschließen, benötigst du zwei JST-Adapterkabel. Das erste wird an Digital A (also den digitalen Pins 1 und 2), das zweite an Digital B (also den digitalen Pins 3 und 4) angeschlossen. Am Kabel in Digital A werden die rote und die gelbe LED angeschlossen, am Kabel in Digital B die grüne LED und der Button.

/images/projects/traffic_light/ampelschaltung_setup.png - Logo

Programmierung

Nutze den senseBox - Code Editor oder die Arduino IDE, um die Programmierung für dieses Projekt durchzuführen.

Schritt 1

Definiere Variablen für die drei LEDs und den Knopf. Hierzu erzeugst du Integer Variablen, die als Wert den jeweiligen Pin, an dem die LED oder der Knopf angeschlossen sind, zugewiesen bekommen.

int rot = 1;
int gelb = 2;
int gruen = 3;

int button = 4;

Schritt 2

In der setup()-Methode definierst du die LED-Pins als Outputs und den Knopf als Input. Dann setzt du zur Initialisierung des Programms die rote LED auf “HIGH” und die beiden anderen LEDs auf LOW. Das bedeutet, die rote LED wird eingeschaltet, während die anderen beiden zu Beginn des Programms ausgeschaltet werden.

void setup() {
 pinMode(rot, OUTPUT);
 pinMode(gelb, OUTPUT);
 pinMode(gruen, OUTPUT);

 // Der Button soll Signale messen, also INPUT
 pinMode(button, INPUT);

 // Ampel zuerst auf ROT setzen
 digitalWrite(rot, HIGH);
 digitalWrite(gelb, LOW);
 digitalWrite(gruen, LOW);
}

Schritt 3

Nun schreibst du die loop()-Methode. Hier wird deine eigentliche Ampelschaltung programmiert.

Am Anfang der loop() Funktion wird jedesmal abgefragt, ob der Button gedrückt ist. digitalRead(button) liest den aktuellen Zustand des Buttons aus. Wird er gedrückt, liefert die Funktion HIGH aus, ansonsten LOW. Um zu Prüfen, ob der Button gedrückt wurde, muss digitalRead(button) mit HIGH verglichen werden. Der Vergleich geschieht mit zwei Gleichzeichen == (Vergleichsoperator). Ein Gleichzeichen = ist eine Zuweisung, wie etwa int rot = 13.

Diese Abfrage geschieht in einer if-Bedingung. Ist sie wahr (der Knopf wird gedrückt), so wird der Programmcode innerhalb der {} hinter der if-Bedingung ausgeführt.

void loop() {

 // Hier wird geprüft, ob der Button gedrückt wird
 if(digitalRead(button) == HIGH) {

Hier beginnst du, indem du 5 Sekunden wartest. Dann schaltest du die rote (bereits eingeschaltet) und die gelbe LED ein, die grüne bleibt (weiterhin) ausgeschaltet.

delay(5000);

   // ROT zu GRUEN
   digitalWrite(rot, HIGH);
   digitalWrite(gelb, HIGH);
   digitalWrite(gruen, LOW);

Danach wartest du 1 Sekunde und schaltest dann nur die grüne LED ein, die rote und gelbe LED dafür aus.

delay(1000);

   digitalWrite(rot, LOW);
   digitalWrite(gelb, LOW);
   digitalWrite(gruen, HIGH);

Nach weiteren 5 Sekunden schaltest du die grüne LED aus und die gelbe LED ein. Die rote bleibt weiterhin ausgeschaltet.

 delay(5000);


   // GRUEN zu ROT
   digitalWrite(rot, LOW);
   digitalWrite(gelb, HIGH);
   digitalWrite(gruen, LOW);

Nun wartest du wieder eine Sekunde und schaltest dann die rote LED ein und die anderen beiden LEDs aus.

delay(1000);


   digitalWrite(rot, HIGH);
   digitalWrite(gelb, LOW);
   digitalWrite(gruen, LOW);
 }
}

Damit hast du das Ende der if-Bedingung erreicht. Das Programm verharrt nun im aktuellen Zustand und macht solange nichts, bis das nächste mal der Knopf gedrückt wird.

Gesamter Code

Hier findest du nochmal den gesamten Code als zusammenhängenden Block.

int rot = 1;
int gelb = 2;
int gruen = 3;

int button = 4;

void setup() {
 pinMode(rot, OUTPUT);
 pinMode(gelb, OUTPUT);
 pinMode(gruen, OUTPUT);

 // Der Button soll Signale messen, also INPUT
 pinMode(button, INPUT);

 // Ampel zuerst auf ROT setzen
 digitalWrite(rot, HIGH);
 digitalWrite(gelb, LOW);
 digitalWrite(gruen, LOW);
}

void loop() {

 // Hier wird geprüft, ob der Button gedrückt wird
 if(digitalRead(button) == HIGH) {

   delay(5000);

   // ROT zu GRUEN
   digitalWrite(rot, HIGH);
   digitalWrite(gelb, HIGH);
   digitalWrite(gruen, LOW);

   delay(1000);

   digitalWrite(rot, LOW);
   digitalWrite(gelb, LOW);
   digitalWrite(gruen, HIGH);

   delay(5000);


   // GRUEN zu ROT
   digitalWrite(rot, LOW);
   digitalWrite(gelb, HIGH);
   digitalWrite(gruen, LOW);

   delay(1000);


   digitalWrite(rot, HIGH);
   digitalWrite(gelb, LOW);
   digitalWrite(gruen, LOW);
 }
}