#include "DHT.h" //การเรียกใช้ไลบรารี DHT
DHT dht(2, DHT22); //ชื่อตัวแปร dht ควบคุมขา2 โดย dht22
float temp; //กำหนดตัวแปรอุณหภูมิ
float hum; //กำหนดตัวแปรความชื้น

#define LedPin 3 //กำหนดตัวแปร LedPin ต่อขา 3
#define buz 4 //กำหนดตัวแปร buz ต่อขา 4
int a = 0; //analog = 0 กำหนดค่าให้ปิด

#include <Servo.h> //การเรียกใช้ไลบรารี
Servo myservo; //servo ชื่อ myservo

#include <LiquidCrystal_I2C.h> //เรียก Library ของการสื่อสารแบบ I2C
LiquidCrystal_I2C lcd(0x27, 20, 4); //ใช้ในการประกาศ Address และขนาดของจอ Address,columns,rows

void setup()
{
  dht.begin(); //ใช้ในการกำหนดการเริ่มต้นในการใช้งานจอ
  Serial.begin(9600);
  pinMode(buz, OUTPUT); //ให้ buz เป็น output
  digitalWrite(buz, LOW); //ให้ค่าเริ่มอรกของ buz ปิดไว้
  myservo.attach(5); //ต่อ servo ที่ขา 5
  myservo.write(0); //ตั้งให้ servo อยู่ที่ขา 0
  delay(1000);
  lcd.init(); //เริ่มต้นการใช้หน้าจอ
  pinMode(LedPin, OUTPUT); //ให้ led เป็น output
  digitalWrite(LedPin, LOW); //กำหนดค่าเริ่มต้นให้ led ปิด
  lcd.clear(); //เคลียร์หน้าจอ
  lcd.backlight(); //ให้ไฟ backlight แสดงขึ้นมาบนหน้าจอ
  
}

void loop()
{
  temp = dht.readTemperature(); //อ่านค่าอุรหภูมิ
  hum = dht.readHumidity(); //อ่านค่าความชื้น
  lcd.setCursor(2,0); //เซ็ทตำแหน่งข้อความ คอมลัมที่3 แถว1 (แบบนับตามปกติ)
  lcd.print("Temp:"); //แสดงข้อความ
  lcd.print(temp); //แสดงค่าที่วัดได้
  lcd.print("celsius"); //แสดงข้อความ
  lcd.setCursor(5,1); //เซ็ทตำแหน่งข้อความ คอมลัมที่6 แถว2 (แบบนับตามปกติ)
  lcd.print("Hum:");  //แสดงข้อความ
  lcd.print(hum); //แสดงค่าที่วัดได้
  lcd.print("%"); //แสดงข้อความ
  Serial.print("Temp: "); //คำสั่งพิมพ์ข้อมูลเป็นข้อความ
  Serial.print(temp);
  Serial.print(" ํc ");
  Serial.print("Humidity: ");
  Serial.print(hum);
  Serial.print("%");
  Serial.print(" ");
  delay(1000);

  if (temp >= 37 && temp <= 40 && a==0) {
    if (hum > 80) {
      a=1; //เปลี่ยนค่า analog เป็น 1
      delay(40000); //ต้องมีการตั้งเวลาไว้ 4 วัน เมื่อกำหนดให้ 1 นาที แทนด้วย 10000
      digitalWrite(buz, HIGH); //ส่งเสียงแจ้งเตือน
      delay(1000);
      lcd.setCursor(3,2); //เซ็ทตำแหน่งข้อความ คอมลัมที่4 แถว3 (แบบนับตามปกติ)
      lcd.print("buzzer opened"); //เช็คว่า Buzzer ทำงาน
      digitalWrite(LedPin, LOW); //ตั้งให้ปิดไว้
      myservo.write(60); //เปิดช่องระบายอากาศ โดยกำหนดให้ 60 เป็นการเปิดช่องระบายอากาศ
      delay(10000); //ต้องมีการตั้งเวลาไว้ 1 วัน เมื่อกำหนดให้ 1 นาที แทนด้วย 10000
    }
    else { 
      digitalWrite(LedPin, LOW); //ตั้งให้ปิดไว้
      digitalWrite(buz, LOW); //ตั้งให้ปิดไว้
      lcd.setCursor(3,2); //เซ็ทตำแหน่งข้อความ คอมลัมที่4 แถว3 (แบบนับตามปกติ)
      lcd.print("buzzer closed"); //แสดงข้อความเพื่อเช็คว่า buzzer ปิด
      myservo.write(30); //พ่นน้ำ โดยกำหนดให้ 30 เป็นการเปิดน้ำ
      delay(1000);
    }
  }
  
  else if (temp < 37 && a==0) {
    digitalWrite(LedPin, HIGH); //เปิดหลอดไฟ
    digitalWrite(buz, LOW); //ตั้งให้ buzzer ปิด
    myservo.write(0); //ตั้งให้ servo อยู่ที่ 0
  }

  else if(a==0) {
    myservo.write(60); //เปิดช่องระบายอากาศ โดยกำหนดให้ 60 เป็นการเปิดช่องระบายอากาศ
    delay(1000);
    digitalWrite(buz, LOW); //ตั้งให้ buzzer ปิด
    digitalWrite(LedPin, LOW); //ตั้งให้หลอดไฟปิด
  }

  if(a==1){
    if ( temp > 28 && temp < 32 && hum > 80){
      digitalWrite(LedPin, LOW); //ตั้งปิดไฟ
      delay(30000); //ต้องมีการตั้งเวลาไว้ 3 วัน เมื่อกำหนดให้ 1 นาที แทนด้วย 10000
      lcd.setCursor(2,3); //เซ็ทตำแหน่งข้อความ คอมลัมที่3 แถว4 (แบบนับตามปกติ)
      lcd.print("ready to harvest"); //แสดงผล
      digitalWrite(buz, HIGH); //ส่งเสียงแจ้งเตือน
      lcd.setCursor(3,2); //เซ็ทตำแหน่งข้อความ คอมลัมที่4 แถว3 (แบบนับตามปกติ)
      lcd.print("buzzer opened"); //เช็คว่า buzzer เปิด
      delay(10000);
      a=0;
    }
    else if (temp < 28 && hum > 80) {
      lcd.clear(); //เคลียร์หน้าจอ
      digitalWrite(LedPin, HIGH); //ให้ไฟเปิด
      myservo.write(0); //ตั้ง servo ให้อยู่ที่ 0
    }
    else if (hum > 80) {
      lcd.clear(); //เคลียร์หน้าจอ
      myservo.write(60); //เปิดช่องระบายอากาศ โดยกำหนดให้ 60 เป็นการเปิดช่องระบายอากาศ
      delay(1000);
    }
  }
}