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

#define DHTPIN 12         // Pin สำหรับ DHT22
#define DHTTYPE DHT22    // ชนิดของ DHT
#define RELAY_PIN 7      // Pin สำหรับรีเลย์

DHT dht(DHTPIN, DHTTYPE);
LiquidCrystal_I2C lcd(0x27, 16, 2);  // กำหนดที่อยู่ I2C ของจอ LCD

// การตั้งค่าคีย์แพด
const byte ROWS = 4;
const byte COLS = 4;
char keys[ROWS][COLS] = {
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};

byte rowPins[ROWS] = {2, 3, 4, 5};
byte colPins[COLS] = {8, 9, 10, 11};

Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);

// ตัวแปรสำหรับเก็บค่าอุณหภูมิและความชื้นที่กำหนดโดยผู้ใช้
float targetTemp;
float targetHumidity;
String inputTemp = "";     // เก็บค่าอินพุตจากคีย์แพด
String inputHumidity = ""; // เก็บค่าอินพุตสำหรับความชื้น
bool isSettingTemp = true; // สถานะสำหรับกรอกค่าอุณหภูมิ
bool isSettingHumidity = false; // สถานะสำหรับกรอกค่าความชื้น

float mode = 1;

void setup() {
  Serial.begin(115200);
  dht.begin();
  lcd.init();
  lcd.backlight();
  
  pinMode(RELAY_PIN, OUTPUT);
  digitalWrite(RELAY_PIN, LOW);  // ตั้งค่ารีเลย์ให้เริ่มต้นปิดอยู่
}

void loop() {
  float temp = dht.readTemperature();
  float humidity = dht.readHumidity();
  
  // แสดงค่าอุณหภูมิและความชื้นบนจอ LCD
  if(mode == 1){
    lcd.setCursor(0, 0);
    lcd.print("Temp: ");
    lcd.setCursor(0, 1);
    lcd.print("Hum: ");

    lcd.setCursor(6, 0);
    lcd.print(temp);
    lcd.print(" C ");
    
    lcd.setCursor(5, 1);
    lcd.print(humidity);
    lcd.print(" %RH");
  }else if(mode == 2){
    lcd.setCursor(0, 0);
    lcd.print("Limit Temp: ");
  }else if(mode == 3){
    lcd.setCursor(0, 0);
    lcd.print("Limit Hum: ");
  }
  
  
  // ตรวจสอบการทำงานของรีเลย์
  if (temp > targetTemp || humidity > targetHumidity) {
    digitalWrite(RELAY_PIN, HIGH);  // เปิดรีเลย์
  } else {
    digitalWrite(RELAY_PIN, LOW);   // ปิดรีเลย์
  }
  
  // รับอินพุตจากคีย์แพด
  char key = keypad.getKey();
  
  if (key != NO_KEY) {

    if (key == 'A'){
      lcd.clear();
      mode = 2;
    }

    else if (key == 'B'){
      inputTemp = "";  // ล้างข้อมูลที่กรอกไว้
      inputHumidity = "";  // ล้างข้อมูลที่กรอกไว้
      isSettingTemp = true;
      isSettingHumidity = false;
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("Input Clear");
      delay(100);
      lcd.clear();
      mode = 1;
    }

    else if (key == '#'){
      if (mode == 2 && isSettingTemp && inputTemp != "") {
        targetTemp = inputTemp.toFloat();  // แปลงค่าเป็น float และบันทึกเป็น targetTemp
        isSettingTemp = false;
        isSettingHumidity = true;
        inputTemp = "";  // รีเซ็ตค่าอินพุต
        lcd.clear();
        mode = 3;
        

      } else if (mode == 3 && isSettingHumidity && inputHumidity != "") {
        targetHumidity = inputHumidity.toFloat();  // แปลงค่าเป็น float และบันทึกเป็น targetHumidity
        inputHumidity = "";  // รีเซ็ตค่าอินพุต
        isSettingHumidity = false;
        lcd.clear();
        mode = 1;
        
      }
    }

    // รับค่าตัวเลขจากคีย์แพด
    else if (key >= '0' && key <= '9') {
      if (isSettingTemp) {
        inputTemp += key;  // สะสมตัวเลขที่ผู้ใช้กรอกเข้าไปสำหรับอุณหภูมิ
        lcd.setCursor(0, 1);
        lcd.print(inputTemp);
      } else if (isSettingHumidity) {
        inputHumidity += key;  // สะสมตัวเลขที่ผู้ใช้กรอกเข้าไปสำหรับความชื้น
        lcd.setCursor(0, 1);
        lcd.print(inputHumidity);
      }
    }
  }

}
$abcdeabcde151015202530fghijfghij
NOCOMNCVCCGNDINLED1PWRRelay Module