// Ampelschaltung mit 2 Fahrbahnampeln (rot gelb grün)
// und einer Fußgängerampel (rot grün)
// sowie einer "Anforderungsleuchte" (blau), die eingeschaltet werden soll, wenn die Fußgängertaste gedrückt wurde
//
// Die Fahrbahnampeln sollen abwechselnt von rot --> rot gelb --> grün --> gelb --> rot schalten
//
// Die Anforderungstaste soll angehen, wenn die Taste gedrückt wurde
//
// Immer wenn beide Ampeln rot sind, soll geprüft werden, ob die Fußgängerampel angefordert wurde
// und dann die Fußgängerampel auf grün geschaltet werden
// wir haben also 9 Outputs (LEDs)
// und 1 Input (Taster)
const int r1 = 13; // Ampel 1 rot
const int y1 = 12; // Ampel 1 gelb
const int g1 = 11; // Ampel 1 grün
const int r2 = 3; // Ampel 2 rot
const int y2 = 4; // Ampel 2 gelb
const int g2 = 5; // Ampel 2 grün
const int fr = 9; // Fussgängerampel rot
const int fg = 8; // Fussgängerampel grün
const int fStat = 6; // Statuslicht für "Fussgängerampel gedrückt"
const int tast = 2; // Taster für die Fussgängerampel
const int zeit = 1000; // Faktor für die Dauer der Anzeigen
volatile int gedrueckt = 0;
void setup() {
// Interrupt auf LOW-->HIGH aktivieren
digitalPinToInterrupt(2); // Pin 2 als Interrupt verwenden
attachInterrupt(0, TasterGedrueckt, RISING);
// 0 entspricht Pin2
// es soll beim Ändern von LOW-->HIGH die Funktion
// TasterGedrueckt() ausgelöst werden
// Ampeln auf Output Pins:
pinMode(r1, OUTPUT);
pinMode(r2, OUTPUT);
pinMode(y1, OUTPUT);
pinMode(y2, OUTPUT);
pinMode(g1, OUTPUT);
pinMode(g2, OUTPUT);
pinMode(fr, OUTPUT);
pinMode(fg, OUTPUT);
pinMode(fStat, OUTPUT);
// Taster auf Input Pin:
pinMode(tast, INPUT);
// Fussgängerampel auf rot schalten
digitalWrite(fr, HIGH);
digitalWrite(fg, LOW);
// Statuslicht ausschalten:
digitalWrite(fStat, LOW);
// Ampel 1 auf rot schalten
digitalWrite(r1, HIGH);
digitalWrite(y1, LOW);
digitalWrite(g1, LOW);
// Ampel 2 auf grün schalten
digitalWrite(r2, LOW);
digitalWrite(y2, LOW);
digitalWrite(g2, HIGH);
}
void TasterGedrueckt() {
digitalWrite(fStat, HIGH);
}
void loop() {
// grünes Fussgängerlicht auf Status des Tasters setzen:
// digitalWrite(fg, digitalRead(tast));
// hier werden die beiden Fahrzeugampeln abwechselnd gesteuert:
digitalWrite(r1, HIGH);
digitalWrite(y1, LOW);
digitalWrite(g1, LOW);
digitalWrite(r2, LOW);
digitalWrite(y2, LOW);
digitalWrite(g2, HIGH);
delay(4*zeit);
digitalWrite(r1, HIGH);
digitalWrite(y1, LOW);
digitalWrite(g1, LOW);
digitalWrite(r2, LOW);
digitalWrite(y2, HIGH);
digitalWrite(g2, LOW);
delay(1*zeit);
digitalWrite(r1, HIGH);
digitalWrite(y1, LOW);
digitalWrite(g1, LOW);
digitalWrite(r2, HIGH);
digitalWrite(y2, LOW);
digitalWrite(g2, LOW);
delay(2*zeit);
// Wenn beide Ampeln rot sind: Taster abfragen für Fussgängerampel auf grün:
fStatPruefen();
digitalWrite(r1, HIGH);
digitalWrite(y1, HIGH);
digitalWrite(g1, LOW);
digitalWrite(r2, HIGH);
digitalWrite(y2, LOW);
digitalWrite(g2, LOW);
delay(1*zeit);
digitalWrite(r1, LOW);
digitalWrite(y1, LOW);
digitalWrite(g1, HIGH);
digitalWrite(r2, HIGH);
digitalWrite(y2, LOW);
digitalWrite(g2, LOW);
delay(4*zeit);
digitalWrite(r1, LOW);
digitalWrite(y1, HIGH);
digitalWrite(g1, LOW);
digitalWrite(r2, HIGH);
digitalWrite(y2, LOW);
digitalWrite(g2, LOW);
delay(1*zeit);
digitalWrite(r1, HIGH);
digitalWrite(y1, LOW);
digitalWrite(g1, LOW);
digitalWrite(r2, HIGH);
digitalWrite(y2, LOW);
digitalWrite(g2, LOW);
delay(2*zeit);
// Wenn beide Ampeln rot sind: Taster abfragen für Fussgängerampel auf grün:
fStatPruefen();
digitalWrite(r1, HIGH);
digitalWrite(y1, LOW);
digitalWrite(g1, LOW);
digitalWrite(r2, HIGH);
digitalWrite(y2, HIGH);
digitalWrite(g2, LOW);
delay(1*zeit);
}
void fStatPruefen() {
// Prüft, ob die Fußgängerampel angefordert wurde
if(digitalRead(fStat)==HIGH) {
// Statuslicht wieder ausschalten
digitalWrite(fStat, LOW);
// Fußgänger grün schalten
digitalWrite(fr, LOW);
digitalWrite(fg, HIGH);
delay(3*zeit);
// Fußgänger wieder rot schalten
digitalWrite(fr, HIGH);
digitalWrite(fg, LOW);
delay(1*zeit);
}
}