#define AMPEL1_ROT PB5
#define AMPEL1_GELB PB6
#define AMPEL1_GRUEN PB7
#define AMPEL2_ROT PB3
#define AMPEL2_GRUEN PB4
// A B C D E F G
const int displayPin[] = {PA0, PA1, PA7, PA8, PA4, PA5, PA6};
const byte zahlen[] = {
0b00111111, // 0
0b00000110, // 1
0b01011011, // 2
0b01001111, // 3
0b01100110, // 4
0b01101101, // 5
0b01111101, // 6
0b00000111, // 7
0b01111111, // 8
0b01101111 // 9
};
enum Farbe {ROT, GELB, GRUEN};
void setup() {
pinMode(AMPEL1_ROT, OUTPUT);
pinMode(AMPEL1_GELB, OUTPUT);
pinMode(AMPEL1_GRUEN, OUTPUT);
pinMode(AMPEL2_ROT, OUTPUT);
pinMode(AMPEL2_GRUEN, OUTPUT);
pinMode(PB8, INPUT);
pinMode(PB9, OUTPUT);
for (int i = 0; i < 7; i++) {
pinMode(displayPin[i], OUTPUT);
}
Serial.begin(115200);
Serial.println("Setup abgeschlossen.");
setAmpel1(GRUEN);
setAmpel2(ROT);
}
void loop() {
if (digitalRead(PB8) == HIGH) {
delay(1000);
setAmpel1(GELB);
delay(3000);
setAmpel1(ROT);
delay(1000);
setAmpel2(GRUEN);
tone(PB9, 200, 500); // Signalton abspielen
delay(500);
countdown(); // Countdown von 9-0
setAmpel2(ROT);
delay(1000);
setDisplay(0);
delay(4000);
setAmpel1(GRUEN);
}
}
void setAmpel1(Farbe farbe) {
switch(farbe) {
case ROT:
digitalWrite(AMPEL1_GELB, LOW);
digitalWrite(AMPEL1_ROT, HIGH);
break;
case GELB:
digitalWrite(AMPEL1_GRUEN, LOW);
digitalWrite(AMPEL1_GELB, HIGH);
break;
case GRUEN:
digitalWrite(AMPEL1_ROT, LOW);
digitalWrite(AMPEL1_GRUEN, HIGH);
break;
}
}
// Fußgängerampel
void setAmpel2(Farbe farbe) {
switch(farbe) {
case ROT:
digitalWrite(AMPEL2_GRUEN, LOW);
digitalWrite(AMPEL2_ROT, HIGH);
break;
case GRUEN:
digitalWrite(AMPEL2_ROT, LOW);
digitalWrite(AMPEL2_GRUEN, HIGH);
break;
}
}
void setDisplay(byte b) {
for (int i = 0; i < 7; i++) {
if ((b >> i & 1) == 1) {
digitalWrite(displayPin[i], HIGH);
} else {
digitalWrite(displayPin[i], LOW);
}
}
}
void countdown() {
for(int i = 9; i > 0; i--) {
setDisplay(zahlen[i]);
delay(1000);
}
setDisplay(zahlen[0]);
}