#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Adafruit_BMP280.h> // BMP280 szenzor könyvtár

#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
Adafruit_BMP280 bmp; // BMP280 objektum

int currentStateCLK;
int lastStateCLK;
unsigned long lastButtonPress = 0;

int leds[] = {5, 6, 7};
unsigned int menu = 0;
int ledStatus[5] = {0};
int timer = 1000;

void setup() {
  Serial.begin(9600);

  if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
    Serial.println(F("SSD1306 allocation failed"));
    for (;;);
  }

  display.display();

  pinMode(2, INPUT);
  pinMode(3, INPUT);
  pinMode(4, INPUT_PULLUP);

  for (int i = 0; i < 3; i++) {
    pinMode(leds[i], OUTPUT);
  }

  menu = 0;

  if (!bmp.begin(0x76)) { // BMP280 címe (0x76 vagy 0x77 lehet)
    Serial.println(F("Could not find a valid BMP280 sensor, check wiring!"));
    while (1);
  }

  updateMenu();
}

void loop() {
  currentStateCLK = digitalRead(2);

  if (currentStateCLK != lastStateCLK && currentStateCLK == 1) {
    if (digitalRead(3) != currentStateCLK) {
      menu--;
      updateMenu();
    } else {
      menu++;
      updateMenu();
    }
  }
  lastStateCLK = currentStateCLK;

  int btnState = digitalRead(4);
  if (btnState == LOW) {
    if (millis() - lastButtonPress > 50) {
      executeAction();
      updateMenu();
    }
    lastButtonPress = millis();
  }
  delay(1);
}

void printlcd() {
  display.clearDisplay();
  display.setTextSize(3);
  display.setTextColor(WHITE);
  display.setCursor(20, 0);
  display.println("LAMPA");
  display.display();
}

void updateMenu() {
  switch (menu) {
    case 0:
      menu = 1;
      break;
    case 1:
      printlcd();
      display.setCursor(0, 30);
      display.setTextSize(2);
      display.println(" Led 1>");
      display.display();
      break;
    case 2:
      printlcd();
      display.setCursor(0, 30);
      display.setTextSize(2);
      display.println("<Led 2>");
      display.display();
      break;
    case 3:
      printlcd();
      display.setCursor(0, 30);
      display.setTextSize(2);
      display.println("<Led 3>");
      display.display();
      break;
    case 4:
      printlcd();
      display.setCursor(0, 50);
      display.setTextSize(2);
      display.println("<All ON>");
      display.display();
      break;
    case 5:
      printlcd();
      display.setCursor(0, 50);
      display.setTextSize(2);
      display.println("<All OFF>");
      display.display();
      break;
    case 6:
      printTemperatureAndPressure();
      break;
    case 7:
      menu = 0;
      break;
  }
}

void executeAction() {
  switch (menu) {
    case 1:
      action(0);
      break;
    case 2:
      action(1);
      break;
    case 3:
      action(2);
      break;
    case 5:
      for (int i = 0; i < 3; i++) {
        ledStatus[i] = 0;
        digitalWrite(leds[i], ledStatus[i]);
      }
      display.clearDisplay();
      display.setCursor(0, 0);
      display.setTextSize(1);
      display.println("> All LEDs OFF...");
      display.display();
      delay(timer);
      break;
    case 4:
      for (int i = 0; i < 3; i++) {
        ledStatus[i] = 1;
        digitalWrite(leds[i], ledStatus[i]);
      }
      display.clearDisplay();
      display.setCursor(0, 0);
      display.setTextSize(1);
      display.println("> All LEDs ON...");
      display.display();
      delay(timer);
      break;
  }
}

void action(int ledIndex) {
  if (ledStatus[ledIndex] != 0) {
    ledStatus[ledIndex] = 0;
    display.clearDisplay();
    display.setCursor(0, 0);
    display.setTextSize(2);
    display.println("> LED OFF.");
    display.display();
    digitalWrite(leds[ledIndex], ledStatus[ledIndex]);
    delay(timer);
  } else {
    ledStatus[ledIndex] = 1;
    display.clearDisplay();
    display.setCursor(0, 0);
    display.setTextSize(2);
    display.println("> LED ON.");
    display.display();
    digitalWrite(leds[ledIndex], ledStatus[ledIndex]);
    delay(timer);
  }
}

void printTemperatureAndPressure() {
  float temperature = bmp.readTemperature();
  float pressure = bmp.readPressure() / 100.0F; // Pascal-ról hektopascalra konvertálás

  display.clearDisplay();
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(0, 0);
  display.print("Temperature: ");
  display.print(temperature);
  display.print(" C");
  display.setCursor(0, 20);
  display.print("Pressure: ");
  display.print(pressure);
  display.print(" hPa");
  display.display();

  Serial.print("Temperature: ");
  Serial.print(temperature);
  Serial.println(" C");
  Serial.print("Pressure: ");
  Serial.print(pressure);
  Serial.println(" hPa");

  delay(1000); // 1 másodperc várakozás, majd vissza a főmenübe
  menu = 0;
  updateMenu();
}