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

// กำหนดที่อยู่ของจอ LCD และขนาด (16x2)
LiquidCrystal_I2C lcd(0x27, 16, 2);  // 0x27 เป็นที่อยู่ I2C ของจอ LCD

#define DHTPIN 14
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);

#define SERVO_PIN 2  // กำหนดขาที่ต่อ Servo
Servo myservo;

#define LDR_PIN 12  // กำหนดขาที่ต่อ LDR sensor module
#define LED_PIN 4   // กำหนดขาที่ต่อ LED
#define FAN_PIN  // กำหนดขาที่ต่อพัดลม

void setup() {
  // เริ่มต้นการสื่อสารผ่าน I2C
   Wire.begin();

  dht.begin();

  // เริ่มต้นการใช้งานจอ LCD
  lcd.init();

   // เริ่มต้นการใช้งานจอ LCD
  lcd.begin(16, 2);  // ระบุจำนวนคอลัมน์และแถวของจอ LCD

  // ปรับความสว่างของจอ (0-255)
  lcd.setBacklight(255);

  // ใช้ขา SERVO_PIN เป็นขาควบคุม Servo
  myservo.attach(SERVO_PIN);

  // กำหนดขา LED_PIN เป็น OUTPUT
  pinMode(LED_PIN, OUTPUT);
  
  // กำหนดขา LDR_PIN เป็น INPUT
  pinMode(LDR_PIN, INPUT);
}

/// Shows parameters on LCD.
void refershDisplay() {
  float temperature = dht.readTemperature();
  float humidity = dht.readHumidity();

  if (temperature <= 25) {
    myservo.write(0);  // หมุน Servo ไปที่ตำแหน่ง 0 องศา
  } else if (temperature >= 35) {
    myservo.write(180);  // หมุน Servo ไปที่ตำแหน่ง 180 องศา
  } else {
    // ให้ Servo อยู่ในตำแหน่งกลาง 90 องศา
    myservo.write(90);
  }

  lcd.setCursor(0, 0);
  lcd.print("T:");
  lcd.print(temperature);
  lcd.print("(C) H:");
  lcd.print(humidity);
  
  int ldrValue = analogRead(LDR_PIN);
  lcd.setCursor(0, 1);
  lcd.print("LDR:");
  lcd.print(ldrValue);
}

void loop() {
  refershDisplay();

  // ควบคุม Servo
  //myservo.write(90);  // ให้ Servo หมุนไปที่มุม 90 องศา

  // อ่านค่าจาก LDR sensor
  int ldrValue = analogRead(LDR_PIN);

  // เปิด-ปิด LED ตามค่า LDR
  if (ldrValue < 500) {
    digitalWrite(LED_PIN, HIGH); // เปิด LED
  } else {
    digitalWrite(LED_PIN, LOW);  // ปิด LED
  }

  // ทำงานเพิ่มเติมสำหรับพัดลม
  // ทำงานเพิ่มเติมสำหรับควบคุมปั้มน้ำ
}