#include "DHT.h"
#define DHTPIN 7
#define DHTTYPE DHT22 
DHT dht(DHTPIN, DHTTYPE);

#define btn1 4
#define btn2 2

#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
bool Dis = true;

void setup() {
  Serial.begin(115200); // เริ่มต้น Serial communication ที่ความเร็ว 115200 bps
  pinMode(btn1, INPUT_PULLUP); // ตั้งโหมดของปุ่ม btn1 เป็น INPUT_PULLUP เพื่อให้ปุ่มทำงานในโหมด Pull-up
  pinMode(btn2, INPUT_PULLUP); // ตั้งโหมดของปุ่ม btn2 เป็น INPUT_PULLUP เพื่อให้ปุ่มทำงานในโหมด Pull-up

  lcd.begin(16, 2); // เริ่มต้นการใช้งาน LCD ที่มีขนาด 16x2
  lcd.init();
  lcd.backlight(); // เปิดไฟหลังจอ LCD

  dht.begin(); // เริ่มต้นการใช้งานเซ็นเซอร์ DHT
}

void loop() {
  delay(100); // หน่วงเวลา 100 มิลลิวินาทีเพื่อให้ระบบทำงานได้โดยสมบูรณ์

  float h = dht.readHumidity(); // อ่านค่าความชื้น
  float t = dht.readTemperature(); // อ่านค่าอุณหภูมิ

  bool btn1D = !digitalRead(btn1); // ตรวจสอบว่าปุ่ม btn1 ถูกกดหรือไม่
  bool btn2S = !digitalRead(btn2); // ตรวจสอบว่าปุ่ม btn2 ถูกกดหรือไม่

  if (isnan(h) || isnan(t)) {
    Serial.println(F("Failed to read from DHT sensor!")); // พิมพ์ข้อความลงบน Serial Monitor ในกรณีที่ไม่สามารถอ่านค่าจากเซ็นเซอร์ DHT ได้
    return;
  }

  if (btn1D) {
    Dis = true; // กำหนดค่า Dis เป็น true เมื่อปุ่ม btn1 ถูกกด
  }
  if (btn2S) {
    Dis = false; // กำหนดค่า Dis เป็น false เมื่อปุ่ม btn2 ถูกกด
  }
  
  if (Dis) {
    // แสดงค่าอุณหภูมิและความชื้นบน LCD และ Serial Monitor หาก Dis เป็น true
    lcd.setCursor(0, 0);
    lcd.print("Temp:");
    lcd.setCursor(6, 0);
    lcd.print(t);

    lcd.setCursor(0, 1);
    lcd.print("Humidity:");
    lcd.setCursor(10, 1);
    lcd.print(h);

    Serial.print("Temperature: ");
    Serial.print(t);
    Serial.print(F("°C "));
    Serial.print("Humidity: ");
    Serial.print(h);
    Serial.println(F("%"));    
  } else {
    lcd.setCursor(0, 0);
    lcd.clear(); // ล้างหน้าจอ LCD เมื่อ Dis เป็น false   
  }
}