#include <Wire.h>
#include <LiquidCrystal_I2C.h>

// Initialisierung des I2C-LCDs mit der I2C-Adresse 0x27 (das kann je nach Modul variieren)

LiquidCrystal_I2C lcd(0x27, 16, 2);

// Pin-Definitionen für die Buttons

constexpr byte buttonPinYellow = 7;
constexpr byte buttonPinRed = 6;
constexpr byte buttonPinOrange = 5;
constexpr byte buttonPinBlue = 4;

// Pin-Definition für den Piezo-Lautsprecher

constexpr byte piezoPin {8};

// Pin-Definitionen für die LEDs

constexpr byte ledPinYellow {9};
constexpr byte ledPinRed {10};
constexpr byte ledPinOrange {11};
constexpr byte ledPinBlue {12};

// Variablen für die Farbauswahl

constexpr char *colors[] = {"Gelb", "Rot", "Orange", "Blau"};
constexpr byte buttonPins[] = {buttonPinYellow, buttonPinRed, buttonPinOrange, buttonPinBlue};
constexpr byte ledPins[] = {ledPinYellow, ledPinRed, ledPinOrange, ledPinBlue};
constexpr byte MAX_BUTTONS {sizeof(buttonPins) / sizeof(buttonPins[0])};

void setup() {

  // Initialisiere das LCD
  lcd.init();
  lcd.backlight();
  lcd.print("Waehle Farbe:");

  // Initialisiere die Button-Pins als Input
  for (byte i = 0; i < MAX_BUTTONS; i++) {
    pinMode(buttonPins[i], INPUT_PULLUP);
  }

  // Initialisiere die LED-Pins als Output

  for (byte i = 0; i < MAX_BUTTONS; i++) {
    pinMode(ledPins[i], OUTPUT);
    digitalWrite(ledPins[i], LOW); // LEDs aus
  }

  // Initialisiere den Piezo-Pin als Output
  pinMode(piezoPin, OUTPUT);
}


void loop() {

  for (byte i = 0; i < MAX_BUTTONS; i++) {
    if (digitalRead(buttonPins[i]) == LOW) {
      // Ton auf dem Piezo-Lautsprecher abspielen
      tone(piezoPin, 1000, 200); // 1000 Hz Ton für 200 ms

      // Zeige die entsprechende Farbe auf dem LCD an
      updateLCD(colors[i]);

      // Schalte die entsprechende LED ein und die anderen aus
      updateLEDs(i);

      // Warte, bis die Taste losgelassen wird, um Mehrfachauslösungen zu vermeiden

      while (digitalRead(buttonPins[i]) == LOW) {
        delay(50);
      }
    }
  }
}

void updateLCD(const char color[]) {
  lcd.clear();
  lcd.print("Waehle Farbe:");
  lcd.setCursor(0, 1);
  lcd.print(color);
}

void updateLEDs(byte activeLed) {
  for (byte i = 0; i < MAX_BUTTONS; i++) {
    (i == activeLed) ? digitalWrite(ledPins[i], HIGH) : digitalWrite(ledPins[i], LOW); 
  }
}