Ampel mit Arduino für Autos und Fußgänger

Eine Ampel mit Arduino bauen ist ganz einfach. Es gibt vier Ampelphasen: Grün – Gelb – Rot – Rot-Gelb.

Achtung! Neue Version hier: Ampelanlage mit Arduino

Ampel Schaltung

Arduino Schaltung Ampel Verkehrsampel

Code

int ampelRotPin = 12;
int ampelGelbPin = 11;
int ampelGruenPin = 10;

void setup() {
  pinMode(ampelRotPin, OUTPUT);
  pinMode(ampelGelbPin, OUTPUT);
  pinMode(ampelGruenPin, OUTPUT);
}

void loop() {
  // gruen
  digitalWrite(ampelRotPin, LOW);
  digitalWrite(ampelGelbPin, LOW);
  digitalWrite(ampelGruenPin, HIGH);
  digitalWrite(fgRotPin, HIGH);
  digitalWrite(fgGruenPin, LOW);
  delay(5000);
  // gelb
  digitalWrite(ampelRotPin, LOW);
  digitalWrite(ampelGelbPin, HIGH);
  digitalWrite(ampelGruenPin, LOW);
  digitalWrite(fgRotPin, HIGH);
  digitalWrite(fgGruenPin, LOW);
  delay(1000);
  // rot
  digitalWrite(ampelRotPin, HIGH);
  digitalWrite(ampelGelbPin, LOW);
  digitalWrite(ampelGruenPin, LOW);
  digitalWrite(fgRotPin, LOW);
  digitalWrite(fgGruenPin, HIGH);
  delay(5000);
  // rot-gelb
  digitalWrite(ampelRotPin, HIGH);
  digitalWrite(ampelGelbPin, HIGH);
  digitalWrite(ampelGruenPin, LOW);
  digitalWrite(fgRotPin, HIGH);
  digitalWrite(fgGruenPin, LOW);
  delay(1000);
}

Funktionsweise

Im Grunde ist das ein erweitertes blink() Beispiel. Als erstes deklarieren wir drei Pins als Outputs. Hier werden die LEDs (mit Vorwiderstand 220 Ohm) angeschlossen. Bei jeder Ampelphase schalten wir LEDs ein (HIGH) oder aus (LOW). Dazwischen warten wir einfach mit delay(wartezeit) eine gewisse Zeit ab.

Fußgängerampel

Jetzt erweitern wir die Schaltung durch einen Button und zwei weitere LEDs für die Fußgängerampel. Wird der Button gedrückt, schaltet sich unsere Ampelanlage auf Grün für die Fußgänger.

Ampel Schaltung mit Button

Arduino Ampel Schaltung mit Button für Fußgänger

Code

int ampelRotPin = 12;
int ampelGelbPin = 11;
int ampelGruenPin = 10;

int fgRotPin = 9;
int fgGruenPin = 8;

int fgButtonPin = 2;

void setup() {
  pinMode(ampelRotPin, OUTPUT);
  pinMode(ampelGelbPin, OUTPUT);
  pinMode(ampelGruenPin, OUTPUT);
  
  pinMode(fgRotPin, OUTPUT);
  pinMode(fgGruenPin, OUTPUT);
  pinMode(fgButtonPin, INPUT);
}

void loop() {
  // gruen
  digitalWrite(ampelRotPin, LOW);
  digitalWrite(ampelGelbPin, LOW);
  digitalWrite(ampelGruenPin, HIGH);
  digitalWrite(fgRotPin, HIGH);
  digitalWrite(fgGruenPin, LOW);

  if (digitalRead(fgButtonPin) == LOW) {
    // gelb
    digitalWrite(ampelRotPin, LOW);
    digitalWrite(ampelGelbPin, HIGH);
    digitalWrite(ampelGruenPin, LOW);
    digitalWrite(fgRotPin, HIGH);
    digitalWrite(fgGruenPin, LOW);
    delay(1000);
    // rot
    digitalWrite(ampelRotPin, HIGH);
    digitalWrite(ampelGelbPin, LOW);
    digitalWrite(ampelGruenPin, LOW);
    digitalWrite(fgRotPin, LOW);
    digitalWrite(fgGruenPin, HIGH);
    delay(5000);
    // rot-gelb
    digitalWrite(ampelRotPin, HIGH);
    digitalWrite(ampelGelbPin, HIGH);
    digitalWrite(ampelGruenPin, LOW);
    digitalWrite(fgRotPin, HIGH);
    digitalWrite(fgGruenPin, LOW);
    delay(1000);
  }
}

Funktionsweise

Wir erweitern den Code durch die Deklaration von zwei LEDs als Outputs und einem Button als Input. Die Ampelphasen bleiben gleich, werden jedoch durch die Ausgabe der Fußgänger LEDs erweitert. Die Ampel ist für die Autofahrer immer grün bis der Button gedrückt wird. Diese Prüfung lässt sich leicht mit der if-Abfrage realisieren. Die Funktion digitalRead(fgButtonPin) liefert immer HIGH solange bis der Button gedrückt wird. Ist der Button gedrückt, liefert die Funktion LOW. Mehr Informationen dazu im Kapitel Digital In.

Alle Grafiken mit Fritzing erstellt.

Hast du weitere Fragen? Probier doch mal unser brandneues Forum zu Arduino aus!