#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <DHT.h>
// กำหนดขาและชนิดของเซ็นเซอร์ DHT
#define DHTPIN 2
#define DHTTYPE DHT22
// กำหนดขาของรีเลย์
#define RELAY1_PIN 13
#define RELAY2_PIN 12
#define RELAY3_PIN 11
// สร้าง object ของ DHT
DHT dht(DHTPIN, DHTTYPE);
// สร้าง object ของจอ LCD I2C
LiquidCrystal_I2C lcd(0x27, 16, 2);
////////////////////// fan
int ledState = HIGH;
int swpinfan = 10;
int ledPin = 4;
int statefan ;
int laststatefan = LOW;
unsigned long pretime = 0;
unsigned long interval = 50;
/////////////////////////////////////// end fan
///////////////////// pump
int ledState1 = HIGH;
int swpinpump = 9;
int ledPin1 = 5;
int statepump ;
int laststatepump = LOW;
unsigned long pretime1 = 0;
unsigned long interval1 = 50;
/////////////////////////////////////// end pump
///////////////////// lamp
int ledState2 = HIGH;
int swpinlamp = 8;
int ledPin2 = 6;
int statelamp ;
int laststatelamp = LOW;
unsigned long pretime2 = 0;
unsigned long interval2 = 50;
/////////////////////////////////////// end lamp
void setup() {
// เริ่มต้นการทำงานของจอ LCD
lcd.init();
lcd.backlight();
Serial.begin(115200);
// เริ่มต้นการทำงานของ DHT
dht.begin();
// ตั้งค่าขารีเลย์เป็นขาออก
pinMode(RELAY1_PIN, OUTPUT);
pinMode(RELAY2_PIN, OUTPUT);
pinMode(RELAY3_PIN, OUTPUT);
// ปิดรีเลย์ทั้งหมดก่อน
digitalWrite(RELAY1_PIN, LOW);
digitalWrite(RELAY2_PIN, LOW);
digitalWrite(RELAY3_PIN, LOW);
///////////////////////////////////////// fan
pinMode(swpinfan, INPUT_PULLUP);
pinMode(ledPin, OUTPUT);
//////////////////////////////////////// end fan
///////////////////////////////////////// pump
pinMode(swpinpump, INPUT_PULLUP);
pinMode(ledPin1, OUTPUT);
//////////////////////////////////////// end pump
///////////////////////////////////////// lamp
pinMode(swpinlamp, INPUT_PULLUP);
pinMode(ledPin2, OUTPUT);
//////////////////////////////////////// end lamp
pinMode(3, INPUT_PULLUP);///for Selector switch (Slide switch)
//Left=autofarm, Right=manual
}
void loop() {
int swmenu = digitalRead(3);
if (swmenu == 1) {
autofarm();
} else {
manual();
displayDHT ();
}
}
void autofarm() {
// อ่านค่าอุณหภูมิและความชื้นจาก DHT22
float h = dht.readHumidity();
float t = dht.readTemperature();
// ตรวจสอบว่าการอ่านค่าถูกต้องหรือไม่
if (isnan(h) || isnan(t)) {
lcd.setCursor(0, 0);
lcd.print("Error reading ");
lcd.setCursor(0, 1);
lcd.print("DHT22 sensor");
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 > 38) {
digitalWrite(RELAY1_PIN, HIGH); // เปิดรีเลย์ 1
} else {
digitalWrite(RELAY1_PIN, LOW); // ปิดรีเลย์ 1
}
if (h < 60 ) {
digitalWrite(RELAY2_PIN, HIGH); // เปิดรีเลย์ 2
} else if (h > 75) {
digitalWrite(RELAY2_PIN, LOW); // ปิดรีเลย์ 2
}
if (t < 30) {
digitalWrite(RELAY3_PIN, HIGH); // เปิดรีเลย์ 3
} else {
digitalWrite(RELAY3_PIN, LOW); // ปิดรีเลย์ 3
}
// หน่วงเวลา 2 วินาทีก่อนอ่านค่าใหม่
delay(2000);
} /////////////////////// end auto loop
void manual() {
/////////////////////////////////////////////// fan
int swfan = digitalRead(swpinfan);
if (swfan != laststatefan) {
pretime = millis();
Serial.println(pretime);
}
if ((millis() - pretime) > interval) {
if (swfan != statefan) {
statefan = swfan;
Serial.println(statefan);
if (statefan == HIGH) {
ledState = !ledState;
}
}
}
digitalWrite(ledPin, ledState);
digitalWrite(RELAY1_PIN, ledState);
laststatefan = swfan;
/////////////////////////////////////////////// end fan
/////////////////////////////////////////////// pump
int swpump = digitalRead(swpinpump);
if (swpump != laststatepump) {
pretime1 = millis();
Serial.println(pretime1);
}
if ((millis() - pretime1) > interval1) {
if (swpump != statepump) {
statepump = swpump;
Serial.println(statepump);
if (statepump == HIGH) {
ledState1 = !ledState1;
}
}
}
//digitalWrite(ledPin1, ledState1);
digitalWrite(RELAY2_PIN, ledState1);
laststatepump = swpump;
/////////////////////////////////////////////// end pump
/////////////////////////////////////////////// lamp
int swlamp = digitalRead(swpinlamp);
if (swlamp != laststatelamp) {
pretime2 = millis();
Serial.println(pretime2);
}
if ((millis() - pretime2) > interval2) {
if (swlamp != statelamp) {
statelamp = swlamp;
Serial.println(statelamp);
if (statelamp == HIGH) {
ledState2 = !ledState2;
}
}
}
digitalWrite(ledPin2, ledState2);
digitalWrite(RELAY3_PIN, ledState2);
laststatelamp = swlamp;
/////////////////////////////////////////////// end lamp
} ////// end manual loop
void displayDHT (){
// อ่านค่าอุณหภูมิและความชื้นจาก DHT22
float h = dht.readHumidity();
float t = dht.readTemperature();
// ตรวจสอบว่าการอ่านค่าถูกต้องหรือไม่
if (isnan(h) || isnan(t)) {
lcd.setCursor(0, 0);
lcd.print("Error reading ");
lcd.setCursor(0, 1);
lcd.print("DHT22 sensor");
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(" %");
}