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

// Pin untuk DHT11 dan jenis sensor
#define DHTPIN 3
#define DHTTYPE DHT22

// Pin untuk LED
#define LED_RED 31
#define LED_GREEN 33
#define LED_YELLOW 35
#define motor 4
#define servo 9
// Pin untuk tombol
#define BUTTON_START 47
#define BUTTON_STOP 49
#define BUTTON_INCREASE 51
#define BUTTON_DECREASE 53

// Inisialisasi LCD
LiquidCrystal lcd(36, 34, 32, 30, 28, 26);

// Inisialisasi sensor DHT
DHT dht(DHTPIN, DHTTYPE);


// Variabel untuk batas suhu
int lowerLimit = 20;  // Batas bawah default
int upperLimit = 25;  // Batas atas default

//posisi servo
int initial = 90;
// Mode operasi
bool isSettingMode = false;  // Default mode operasi

void setup() {
  // Inisialisasi komunikasi serial
  Serial.begin(9600);

  // Inisialisasi sensor DHT
  dht.begin();

  // Inisialisasi LCD
  lcd.begin(16, 2);  // LCD ukuran 16 kolom, 2 baris

  // Inisialisasi LED sebagai output
  pinMode(LED_RED, OUTPUT);
  pinMode(LED_GREEN, OUTPUT);
  pinMode(LED_YELLOW, OUTPUT);
  pinMode(motor, OUTPUT);

  // Inisialisasi tombol sebagai input
  pinMode(BUTTON_START, INPUT_PULLUP);
  pinMode(BUTTON_STOP, INPUT_PULLUP);
  pinMode(BUTTON_INCREASE, INPUT_PULLUP);
  pinMode(BUTTON_DECREASE, INPUT_PULLUP);

  // Menampilkan pesan awal
  lcd.setCursor(0, 0);
  lcd.print("Setting Mode");
  lcd.setCursor(0, 1);
  lcd.print("Press START...");
  delay(2000); // Tunggu 2 detik
}

void loop() {
  // Membaca tombol START dan STOP
  if (digitalRead(BUTTON_START) == LOW) {
    isSettingMode = false;  // Beralih ke mode operasi
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("Operation Mode");
    delay(300);
  }

  if (digitalRead(BUTTON_STOP) == LOW) {
    isSettingMode = true;  // Beralih ke mode pengaturan
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("Setting Mode");
    delay(300);
  }
  if (isSettingMode) {
  // Mode Setting: Mengatur rentang suhu
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Adjust Temp:");
  lcd.setCursor(0, 1);
  lcd.print("Low:");
  lcd.print(lowerLimit);
  lcd.print(" High:");
  lcd.print(upperLimit);

  // Tombol untuk menambah batas atas
  if (digitalRead(BUTTON_INCREASE) == LOW) {
    if (upperLimit < 40) {
      upperLimit++;  // Tambah nilai batas atas
    } else {
      upperLimit = 26;  // Reset ke nilai awal jika mencapai maksimum
    }
    delay(300);  // Debounce tombol
  }

  // Tombol untuk mengurangi batas bawah
  if (digitalRead(BUTTON_DECREASE) == LOW) {
    if (lowerLimit > 0) {
      lowerLimit--;  // Kurangi nilai batas bawah
    } else {
      lowerLimit = 30;  // Reset ke nilai maksimum jika mencapai minimum
    }
    delay(300);  // Debounce tombol
  }

  // Validasi rentang: Lower tidak boleh >= Upper
  if (lowerLimit >= upperLimit) {
    lowerLimit = upperLimit - 1;
  }

  delay(200);  // Tunda untuk refresh
}

 else {
    // Mode Operasi: Membaca sensor dan mengontrol LED
    float h = dht.readHumidity();    // Membaca kelembapan
    float t = dht.readTemperature(); // Membaca suhu
    //float temp = analogRead(sensorsuhu)*0.488;
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("Temp: ");
    lcd.print(t);
    lcd.print(" C");
    lcd.setCursor(0, 1);
    lcd.print("Humidity: ");
    lcd.print(h);
    lcd.print(" %");

    // Logika untuk menyalakan LED berdasarkan suhu
    if (t < lowerLimit) {
      // Suhu di bawah batas bawah
      digitalWrite(LED_RED, LOW);   // LED merah menyala
      digitalWrite(LED_GREEN, LOW);
      digitalWrite(LED_YELLOW, HIGH);
      digitalWrite(motor, LOW);
      

    } else if (t > upperLimit) {
      // Suhu di atas batas atas
      digitalWrite(LED_RED, HIGH);
      digitalWrite(LED_GREEN, LOW);
      digitalWrite(LED_YELLOW, LOW); // LED kuning menyala
      digitalWrite(motor, HIGH);
      
    } else {
      // Suhu dalam rentang
      digitalWrite(LED_RED, LOW);
      digitalWrite(LED_GREEN, HIGH);  // LED hijau menyala
      digitalWrite(LED_YELLOW, LOW);
      digitalWrite(motor, LOW);
      
    }

    delay(1000);  // Tunda pembaruan
  }
}
NOCOMNCVCCGNDINLED1PWRRelay Module