const int leftButton = 2;  // Linker Taster
const int rightButton = 3; // Rechter Taster

// Linke Ampel LEDs
const int leftGreen = 4;   // Grüne LED für linke Ampel
const int leftYellow = 5;  // Gelbe LED für linke Ampel
const int leftRed = 6;     // Rote LED für linke Ampel

// Rechte Ampel LEDs
const int rightRed = 7;    // Rote LED für rechte Ampel
const int rightYellow = 8; // Gelbe LED für rechte Ampel
const int rightGreen = 9;  // Grüne LED für rechte Ampel

// Ampelzustände
int leftState = 0;   // 0 = Grün, 1 = Gelb, 2 = Rot
int rightState = 2;  // 2 = Rot, 1 = Gelb, 0 = Grün

// Entprellung
unsigned long lastDebounceTimeLeft = 0;
unsigned long lastDebounceTimeRight = 0;
const unsigned long debounceDelay = 200; // Entprellzeit

void setup() {
  // Taster-Pins als Eingänge konfigurieren (mit Pull-Up-Widerstand)
  pinMode(leftButton, INPUT_PULLUP);
  pinMode(rightButton, INPUT_PULLUP);
  
  // LEDs als Ausgänge konfigurieren
  pinMode(leftGreen, OUTPUT);
  pinMode(leftYellow, OUTPUT);
  pinMode(leftRed, OUTPUT);
  
  pinMode(rightRed, OUTPUT);
  pinMode(rightYellow, OUTPUT);
  pinMode(rightGreen, OUTPUT);

  // Anfangszustand der Ampeln setzen
  updateLights();
}

void loop() {
  unsigned long currentTime = millis(); // Aktuelle Zeit erfassen

  // Linker Taster gedrückt
  if (digitalRead(leftButton) == LOW && currentTime - lastDebounceTimeLeft > debounceDelay) {
    lastDebounceTimeLeft = currentTime; // Zeit für Entprellung speichern
    if (leftState != 0) { // Schalten nur, wenn nicht bereits grün
      changeToGreen("left");
    }
  }

  // Rechter Taster gedrückt
  if (digitalRead(rightButton) == LOW && currentTime - lastDebounceTimeRight > debounceDelay) {
    lastDebounceTimeRight = currentTime; // Zeit für Entprellung speichern
    if (rightState != 0) { // Schalten nur, wenn nicht bereits grün
      changeToGreen("right");
    }
  }
}

// Funktion, um die Ampeln zu schalten
void changeToGreen(String side) {
  if (side == "left") {
    // Linke Ampel schaltet zu Gelb
    digitalWrite(leftRed, LOW);
    digitalWrite(leftYellow, HIGH);
    delay(1000);  // Gelb für 1 Sekunde

    // Rechte Ampel schaltet zu Gelb
    digitalWrite(rightGreen, LOW);
    digitalWrite(rightYellow, HIGH);
    delay(1000);  // Gelb für 1 Sekunde

    // Linke Ampel schaltet zu Grün
    digitalWrite(leftYellow, LOW);
    digitalWrite(leftGreen, HIGH);

    // Rechte Ampel schaltet zu Rot
    digitalWrite(rightYellow, LOW);
    digitalWrite(rightRed, HIGH);

    // Zustände aktualisieren
    leftState = 0;  // Grün
    rightState = 2; // Rot
  } else if (side == "right") {
    // Rechte Ampel schaltet zu Gelb
    digitalWrite(rightRed, LOW);
    digitalWrite(rightYellow, HIGH);
    delay(1000);  // Gelb für 1 Sekunde

    // Linke Ampel schaltet zu Gelb
    digitalWrite(leftGreen, LOW);
    digitalWrite(leftYellow, HIGH);
    delay(1000);  // Gelb für 1 Sekunde

    // Rechte Ampel schaltet zu Grün
    digitalWrite(rightYellow, LOW);
    digitalWrite(rightGreen, HIGH);

    // Linke Ampel schaltet zu Rot
    digitalWrite(leftYellow, LOW);
    digitalWrite(leftRed, HIGH);

    // Zustände aktualisieren
    rightState = 0; // Grün
    leftState = 2;  // Rot
  }
}

// Funktion zur Aktualisierung der LEDs entsprechend der Zustände
void updateLights() {
  // Linke Ampel
  digitalWrite(leftGreen, leftState == 0);
  digitalWrite(leftYellow, leftState == 1);
  digitalWrite(leftRed, leftState == 2);

  // Rechte Ampel
  digitalWrite(rightGreen, rightState == 0);
  digitalWrite(rightYellow, rightState == 1);
  digitalWrite(rightRed, rightState == 2);
}

uno:A5.2
uno:A4.2
uno:AREF
uno:GND.1
uno:13
uno:12
uno:11
uno:10
uno:9
uno:8
uno:7
uno:6
uno:5
uno:4
uno:3
uno:2
uno:1
uno:0
uno:IOREF
uno:RESET
uno:3.3V
uno:5V
uno:GND.2
uno:GND.3
uno:VIN
uno:A0
uno:A1
uno:A2
uno:A3
uno:A4
uno:A5
btn1:1.l
btn1:2.l
btn1:1.r
btn1:2.r
btn2:1.l
btn2:2.l
btn2:1.r
btn2:2.r
r1:1
r1:2
r2:1
r2:2
r3:1
r3:2
r4:1
r4:2
r5:1
r5:2
r6:1
r6:2
led1:A
led1:C
led2:A
led2:C
led3:A
led3:C
led4:A
led4:C
led5:A
led5:C
led6:A
led6:C