const int ampelPin[] = {PB5, PB6, PB7, PB3, PB4};
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() {
for (int i = 0; i < 5; i++) {
pinMode(ampelPin[i], OUTPUT);
}
for (int i = 0; i < 7; i++) {
pinMode(displayPin[i], OUTPUT);
}
pinMode(PB8, INPUT);
pinMode(PB9, OUTPUT);
setAmpel1(GRUEN);
setAmpel2(ROT);
Serial.begin(115200);
Serial.println("Setup abgeschlossen.");
}
void loop() {
if (digitalRead(PB8) == HIGH) {
delay(1000);
setAmpel1(GELB);
delay(3000);
setAmpel1(ROT);
delay(1000);
setAmpel2(GRUEN);
tone(PB9, 200, 500); // Signalton spielen
countdown(); // Countdown von 9 bis 0
setAmpel2(ROT);
delay(1000);
setDisplay(0);
delay(4000);
setAmpel1(GRUEN);
}
}
void setAmpel1(Farbe farbe) {
switch(farbe) {
case ROT:
digitalWrite(ampelPin[1], LOW);
digitalWrite(ampelPin[0], HIGH);
break;
case GELB:
digitalWrite(ampelPin[2], LOW);
digitalWrite(ampelPin[1], HIGH);
break;
case GRUEN:
digitalWrite(ampelPin[0], LOW);
digitalWrite(ampelPin[2], HIGH);
break;
}
}
// Fußgängerampel
void setAmpel2(Farbe farbe) {
switch(farbe) {
case ROT:
digitalWrite(ampelPin[4], LOW);
digitalWrite(ampelPin[3], HIGH);
break;
case GRUEN:
digitalWrite(ampelPin[3], LOW);
digitalWrite(ampelPin[4], 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--) {
delay(1000);
setDisplay(zahlen[i]);
}
}