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

#define DHTPIN 15        // Pin untuk DHT22
#define DHTTYPE DHT22    // Tipe sensor DHT22
#define RED_LED 19       // Pin untuk LED Merah
#define PURPLE_LED 18     // Pin untuk LED Ungu
#define BLUE_LED 33      // Pin untuk LED Biru
#define YELLOW_LED 12    // Pin untuk LED Kuning
#define BUTTON_1 32      // Pin untuk Tombol 1
#define BUTTON_2 27      // Pin untuk Tombol 2

// Inisialisasi objek LCD I2C
LiquidCrystal_I2C lcd(0x27, 16, 2); // Ganti 0x27 jika alamat berbeda
DHT dht(DHTPIN, DHTTYPE); // Inisialisasi sensor DHT22

void setup() {
  Serial.begin(115200);   // Mulai komunikasi serial
  lcd.init();             // Inisialisasi LCD
  lcd.backlight();        // Hidupkan backlight LCD
  dht.begin();            // Mulai sensor DHT

  // Inisialisasi pin LED sebagai output
  pinMode(RED_LED, OUTPUT);
  pinMode(PURPLE_LED, OUTPUT);
  pinMode(BLUE_LED, OUTPUT);
  pinMode(YELLOW_LED, OUTPUT);

  // Inisialisasi tombol sebagai input dengan pull-up
  pinMode(BUTTON_1, INPUT_PULLUP);
  pinMode(BUTTON_2, INPUT_PULLUP);

  // Tampilkan pesan awal di LCD
  lcd.setCursor(2, 0);
  lcd.print("HALO TIARA!!");
  delay(2000);
}

void loop() {
  Serial.println("Mengambil data dari DHT22..."); // Debugging line

  // Membaca kelembapan dan suhu dari sensor
  float humidity = dht.readHumidity();
  float temperature = dht.readTemperature();

  // Cek apakah pembacaan gagal dan keluar jika gagal
  if (isnan(humidity) || isnan(temperature)) {
    Serial.println("Gagal membaca dari sensor DHT!");
    return;
  }

  // Menampilkan data di Serial Monitor untuk debugging
  Serial.print("Kelembaban: ");
  Serial.print(humidity);
  Serial.print(" %\t");
  Serial.print("Suhu: ");
  Serial.print(temperature);
  Serial.println(" *C");

  // Menampilkan data pada LCD
  lcd.clear();
  lcd.setCursor(0, 0); // Set cursor ke baris pertama
  lcd.print("Kelembaban: ");
  lcd.print(humidity);
  lcd.print(" %");

  lcd.setCursor(0, 1); // Set cursor ke baris kedua
  lcd.print("Suhu: ");
  lcd.print(temperature);
  lcd.print(" C");

  // Kontrol LED berdasarkan suhu
  if (temperature > 30) {
    digitalWrite(RED_LED, HIGH);   // Hidupkan LED Merah jika suhu > 30°C
    digitalWrite(PURPLE_LED, LOW); // Matikan LED Ungu
  } else {
    digitalWrite(RED_LED, LOW);    // Matikan LED Merah
    digitalWrite(PURPLE_LED, HIGH); // Hidupkan LED Ungu jika suhu <= 30°C
  }

  // Kontrol LED berdasarkan tombol
    if (digitalRead(BUTTON_1) == LOW) { // Tombol ditekan
    digitalWrite(BLUE_LED, HIGH);     // Nyalakan LED Biru
  } else {
    digitalWrite(BLUE_LED, LOW);      // Matikan LED Biru
  }

  // Kontrol LED Kuning berdasarkan Tombol 2
  if (digitalRead(BUTTON_2) == LOW) { // Tombol ditekan
    digitalWrite(YELLOW_LED, HIGH);   // Nyalakan LED Kuning
  } else {
    digitalWrite(YELLOW_LED, LOW);    // Matikan LED Kuning
  }

  // Tunggu beberapa detik sebelum membaca data lagi
  delay(2000);
}