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

// ตั้งค่าจอ LCD I2C
LiquidCrystal_I2C lcd(0x27, 16, 2); // เปลี่ยนที่อยู่ I2C ถ้าจำเป็น

// ตั้งค่าขา DHT และรีเลย์
#define DHTPIN 9     // ขาที่เชื่อมต่อกับ DHT เซ็นเซอร์
#define DHTTYPE DHT22 // หรือ DHT22, DHT21

#define RELAY1 7
#define RELAY2 6
#define RELAY3 5

DHT dht(DHTPIN, DHTTYPE);

///////////////////////////////////Debounce switch pin13

const int buttonPin = 13;
const int ledPin = 3;

int ledState = 1;
int buttonState = 0;
int lastButtonState = LOW;

unsigned long lastDebounceTime = 0;
unsigned long debounceDelay = 50;

////////////////////////////////END Debounce switch pin13

///////////////////////////////////Debounce switch pin12

const int buttonPin1 = 12;


int ledState1 = 1;
int buttonState1 = 0;
int lastButtonState1 = LOW;

unsigned long lastDebounceTime1 = 0;
unsigned long debounceDelay1 = 50;

////////////////////////////////END Debounce switch pin12

///////////////////////////////////Debounce switch pin11

const int buttonPin2 = 11;


int ledState2 = 1;
int buttonState2 = 0;
int lastButtonState2 = LOW;

unsigned long lastDebounceTime2 = 0;
unsigned long debounceDelay2 = 50;

////////////////////////////////END Debounce switch pin11
void setup() {
  // เริ่มการสื่อสารกับจอ LCD
  lcd.init();
  lcd.backlight();

  // เริ่มการทำงานของ DHT เซ็นเซอร์
  dht.begin();

  // ตั้งค่าขารีเลย์เป็น OUTPUT
  pinMode(RELAY1, OUTPUT);
  pinMode(RELAY2, OUTPUT);
  pinMode(RELAY3, OUTPUT);
  
  // ตั้งค่ารีเลย์ทั้งหมดเป็นปิดในตอนเริ่มต้น
  digitalWrite(RELAY1, HIGH);
  digitalWrite(RELAY2, HIGH);
  digitalWrite(RELAY3, HIGH);
////////////////////////////////////sw1
  pinMode(buttonPin, INPUT_PULLUP);
  pinMode(ledPin, OUTPUT);
///////////////////////////////////sw1

////////////////////////////////////sw2
  pinMode(buttonPin1, INPUT_PULLUP);

///////////////////////////////////sw2

////////////////////////////////////sw3
  pinMode(buttonPin2, INPUT_PULLUP);

///////////////////////////////////sw3
}

void loop() {

 //// autofarm();

 ///////////////////////////SW1
  
 int reading = digitalRead(buttonPin);/// pin13

  if (reading != lastButtonState) {

    lastDebounceTime = millis();
  }

  if ((millis() - lastDebounceTime) > debounceDelay) {

    if (reading != buttonState) {
      buttonState = reading;

      if (buttonState == HIGH) {
        ledState = !ledState;

      }

    }

  }


  digitalWrite(ledPin, ledState);
  lastButtonState = reading;
  digitalWrite(RELAY1, ledState);

///////////////////////////END SW1

 ///////////////////////////SW2
  
 int reading1 = digitalRead(buttonPin1);/// pin12

  if (reading1 != lastButtonState1) {

    lastDebounceTime1 = millis();
  }

  if ((millis() - lastDebounceTime1) > debounceDelay1) {

    if (reading1 != buttonState1) {
      buttonState1 = reading1;

      if (buttonState1 == HIGH) {
        ledState1 = !ledState1;

      }

    }

  }


 
  lastButtonState1 = reading1;
  digitalWrite(RELAY2, ledState1);

///////////////////////////END SW2

///////////////////////////SW3
  
 int reading2 = digitalRead(buttonPin2);/// pin11

  if (reading2 != lastButtonState2) {

    lastDebounceTime2 = millis();
  }

  if ((millis() - lastDebounceTime2) > debounceDelay2) {

    if (reading2 != buttonState2) {
      buttonState2 = reading2;

      if (buttonState2 == HIGH) {
        ledState2 = !ledState2;

      }

    }

  }


 
  lastButtonState2 = reading2;
  digitalWrite(RELAY3, ledState2);

///////////////////////////END SW3
}
//////////////////////END LOOP


void autofarm(){
// อ่านค่าความชื้นและอุณหภูมิจาก DHT เซ็นเซอร์
  float h = dht.readHumidity();
  float t = dht.readTemperature();

  // ตรวจสอบว่ามีข้อผิดพลาดในการอ่านค่าหรือไม่
  if (isnan(h) || isnan(t)) {
    lcd.setCursor(0, 0);
    lcd.print("Error");
    return;
  }

  // แสดงค่าอุณหภูมิและความชื้นบนจอ LCD
  lcd.setCursor(0, 0);
  lcd.print("Temp: ");
  lcd.print(t);
  lcd.print(" C");

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

  // ควบคุมรีเลย์ตามค่าอุณหภูมิและความชื้น
  if (t > 30) {
    digitalWrite(RELAY1, LOW); // เปิดรีเลย์ 1
  } else {
    digitalWrite(RELAY1, HIGH); // ปิดรีเลย์ 1
  }

  if (h > 70) {
    digitalWrite(RELAY2, LOW); // เปิดรีเลย์ 2
  } else {
    digitalWrite(RELAY2, HIGH); // ปิดรีเลย์ 2
  }

  if (t < 20) {
    digitalWrite(RELAY3, LOW); // เปิดรีเลย์ 3
  } else {
    digitalWrite(RELAY3, HIGH); // ปิดรีเลย์ 3
  }

  // หน่วงเวลา 2 วินาที
  delay(2000);

  
}
NOCOMNCVCCGNDINLED1PWRRelay Module
NOCOMNCVCCGNDINLED1PWRRelay Module
NOCOMNCVCCGNDINLED1PWRRelay Module