#include <LiquidCrystal_I2C.h>
#include <Wire.h>
#include "DHTesp.h"

int led1 = 19;
int sw1 = 34;
int sw2 = 35;
int sw3 = 32;
int val_1 = 0;
const int DHT_PIN = 15;

DHTesp dhtSensor;

#define PIN_TRIG 18
#define PIN_ECHO 5
#define LCD_ADDR 0x27
LiquidCrystal_I2C lcd(LCD_ADDR, 16, 2);

void setup() {
  Serial.begin(115200);
  Serial.println("Hello, esp32");
  dhtSensor.setup(DHT_PIN, DHTesp::DHT22);
  pinMode(led1, OUTPUT);
  pinMode(sw1, INPUT);
  pinMode(sw2, INPUT);
  pinMode(sw3, INPUT);
  pinMode(PIN_TRIG, OUTPUT);
  pinMode(PIN_ECHO, INPUT);

  lcd.init();
  lcd.backlight();
  lcd.clear();
  lcd.setCursor(5,0);
  lcd.print("HELLO");
}

void loop() {
  // ตรวจสอบการกดของสวิตช์
  if (digitalRead(sw1) == LOW) {
    val_1 = 1;
  } else if (digitalRead(sw2) == LOW) {
    val_1 = 2;
  } else if (digitalRead(sw3) == LOW) {
    val_1 = 3;
  }

  // ทำงานตามค่าของ val_1
  switch (val_1) {
    case 1:
      digitalWrite(led1, HIGH);
      delay(500);
      digitalWrite(led1, LOW);
      delay(500);
      lcd.setCursor(11, 0);
      lcd.print("RED   ");
      break;

    case 2:
      digitalWrite(led1, HIGH);
      delay(200);
      digitalWrite(led1, LOW);
      delay(200);
      lcd.setCursor(10, 0);
      lcd.print("YELLOW");
      break;

    case 3:
      digitalWrite(led1, HIGH);
      delay(100);
      digitalWrite(led1, LOW);
      delay(100);
      lcd.setCursor(11, 0);
      lcd.print("GREEN ");
      break;
  }

  // วัดระยะทางโดยใช้ Ultrasonic Sensor
  digitalWrite(PIN_TRIG, HIGH);
  delayMicroseconds(10);
  digitalWrite(PIN_TRIG, LOW);

  // อ่านผลลัพธ์ระยะทาง
  int duration = pulseIn(PIN_ECHO, HIGH);
  lcd.setCursor(11,1);
  lcd.print(duration/58);
  lcd.print("cm");

  // อ่านค่าอุณหภูมิและความชื้นจาก DHT22
  TempAndHumidity data = dhtSensor.getTempAndHumidity();
  
  // แสดงค่าอุณหภูมิและความชื้นบน Serial Monitor
  Serial.println("Temp: " + String(data.temperature, 2) + "°C");
  Serial.println("Humidity: " + String(data.humidity, 1) + "%");

  // แสดงค่าอุณหภูมิและความชื้นบนจอ LCD
  lcd.setCursor(0, 0); // เริ่มต้นแสดงผลที่บรรทัดแรก
  lcd.print("Temp:");
  lcd.print(data.temperature, 1);
  lcd.print("C");

  lcd.setCursor(0, 1); // บรรทัดที่สอง
  lcd.print("Hum:");
  lcd.print(data.humidity, 1);
  lcd.print("% ");

  delay(2000); // หน่วงเวลาเล็กน้อยก่อนรอบถัดไป
}