// Definition der Pins für die Blinker und Taster
const int leftBlinkerPin = 8;    // Pin für den linken Blinker
const int rightBlinkerPin = 9;   // Pin für den rechten Blinker
const int leftButtonPin = 2;     // Pin für den linken Blinkertaster
const int rightButtonPin = 3;    // Pin für den rechten Blinkertaster
const int warnButtonPin = 4;     // Pin für den Warnblinkertaster

// Variablen zum Umschalten der Blinker
bool leftBlinkerOn = false;   // Status des linken Blinkers
bool rightBlinkerOn = false;  // Status des rechten Blinkers
bool warnBlinkerOn = false;   // Status des Warnblinkers

// Variablen zum Überprüfen, ob der Taster gerade gedrückt wurde
bool lastLeftButtonState = HIGH;
bool lastRightButtonState = HIGH;
bool lastWarnButtonState = HIGH;

// Blinken Intervall
unsigned long previousMillis = 0;  // Speichert die letzte Zeit, zu der geblinkt wurde
const long blinkInterval = 1000;     // Intervall für das Blinken (1000ms - 1 Hz)

void setup() {
  // Setze die Pins für die Blinker als Ausgang
  pinMode(leftBlinkerPin, OUTPUT);
  pinMode(rightBlinkerPin, OUTPUT);

  // Setze die Pins für die Taster als Eingang mit Pull-up-Widerstand
  pinMode(leftButtonPin, INPUT_PULLUP);  // Verwende internen Pullup-Widerstand
  pinMode(rightButtonPin, INPUT_PULLUP); // Verwende internen Pullup-Widerstand
  pinMode(warnButtonPin, INPUT_PULLUP);  // Verwende internen Pullup-Widerstand
}

void loop() {
  // Lese den Zustand der Taster
  int leftButtonState = digitalRead(leftButtonPin);
  int rightButtonState = digitalRead(rightButtonPin);
  int warnButtonState = digitalRead(warnButtonPin);

  // Überprüfe, ob der linke Blinker-Taster gedrückt wurde
  if (leftButtonState == LOW && lastLeftButtonState == HIGH) {
    // Wenn der linke Blinker aktiv ist, deaktiviere ihn
    if (leftBlinkerOn) {
      leftBlinkerOn = false;
    } else {
      // Wenn der linke Blinker nicht aktiv ist, aktiviere ihn
      leftBlinkerOn = true;
      rightBlinkerOn = false; // Schalte den rechten Blinker aus
      warnBlinkerOn = false;  // Schalte den Warnblinker aus
    }
    delay(200); // Entprellung des Tasters
  }

  // Überprüfe, ob der rechte Blinker-Taster gedrückt wurde
  if (rightButtonState == LOW && lastRightButtonState == HIGH) {
    // Wenn der rechte Blinker aktiv ist, deaktiviere ihn
    if (rightBlinkerOn) {
      rightBlinkerOn = false;
    } else {
      // Wenn der rechte Blinker nicht aktiv ist, aktiviere ihn
      rightBlinkerOn = true;
      leftBlinkerOn = false;  // Schalte den linken Blinker aus
      warnBlinkerOn = false;  // Schalte den Warnblinker aus
    }
    delay(200); // Entprellung des Tasters
  }

  // Überprüfe, ob der Warnblinker-Taster gedrückt wurde
  if (warnButtonState == LOW && lastWarnButtonState == HIGH) {
    // Wenn der Warnblinker aktiv ist, deaktiviere ihn
    if (warnBlinkerOn) {
      warnBlinkerOn = false;
      // Wenn der Warnblinker deaktiviert wird, sollte der zuletzt aktive Blinker weiterhin blinken
      // Setze die aktiven Blinker zurück
      if (leftBlinkerOn) {
        rightBlinkerOn = false;
      }
      if (rightBlinkerOn) {
        leftBlinkerOn = false;
      }
    } else {
      // Wenn der Warnblinker nicht aktiv ist, aktiviere beide Blinker
      warnBlinkerOn = true;
      leftBlinkerOn = true;
      rightBlinkerOn = true;
    }
    delay(200); // Entprellung des Tasters
  }

  // Verarbeite das Blinken der LEDs
  unsigned long currentMillis = millis();

  // Wenn der Warnblinker aktiviert ist, blinken beide LEDs gleichzeitig
  if (warnBlinkerOn) {
    if (currentMillis - previousMillis >= blinkInterval) {
      previousMillis = currentMillis;
      digitalWrite(leftBlinkerPin, !digitalRead(leftBlinkerPin)); // Umschalten der linken LED
      digitalWrite(rightBlinkerPin, !digitalRead(rightBlinkerPin)); // Umschalten der rechten LED
    }
  } else {
    // Wenn der Warnblinker nicht aktiv ist, blinken nur der aktive Blinker
    if (leftBlinkerOn) {
      if (currentMillis - previousMillis >= blinkInterval) {
        previousMillis = currentMillis;
        digitalWrite(leftBlinkerPin, !digitalRead(leftBlinkerPin)); // Umschalten der linken LED
      }
    } else {
      digitalWrite(leftBlinkerPin, LOW); // Wenn nicht aktiv, halte den linken Blinker aus
    }

    if (rightBlinkerOn) {
      if (currentMillis - previousMillis >= blinkInterval) {
        previousMillis = currentMillis;
        digitalWrite(rightBlinkerPin, !digitalRead(rightBlinkerPin)); // Umschalten der rechten LED
      }
    } else {
      digitalWrite(rightBlinkerPin, LOW); // Wenn nicht aktiv, halte den rechten Blinker aus
    }
  }

  // Speicher den aktuellen Tasterzustand für die nächste Überprüfung
  lastLeftButtonState = leftButtonState;
  lastRightButtonState = rightButtonState;
  lastWarnButtonState = warnButtonState;
}
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
led2:A
led2:C
led1:A
led1:C
r1:1
r1:2
r2:1
r2:2
btn1:1.l
btn1:2.l
btn1:1.r
btn1:2.r
btn2:1.l
btn2:2.l
btn2:1.r
btn2:2.r
btn3:1.l
btn3:2.l
btn3:1.r
btn3:2.r