#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Keypad.h>
#include <DHT.h>
#define DHTPIN 12 // Pin สำหรับ DHT22
#define DHTTYPE DHT22 // ชนิดของ DHT
#define RELAY_PIN 7 // Pin สำหรับรีเลย์
DHT dht(DHTPIN, DHTTYPE);
LiquidCrystal_I2C lcd(0x27, 16, 2); // กำหนดที่อยู่ I2C ของจอ LCD
// การตั้งค่าคีย์แพด
const byte ROWS = 4;
const byte COLS = 4;
char keys[ROWS][COLS] = {
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
byte rowPins[ROWS] = {2, 3, 4, 5};
byte colPins[COLS] = {8, 9, 10, 11};
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
// ตัวแปรสำหรับเก็บค่าอุณหภูมิและความชื้นที่กำหนดโดยผู้ใช้
float targetTemp;
float targetHumidity;
String inputTemp = ""; // เก็บค่าอินพุตจากคีย์แพด
String inputHumidity = ""; // เก็บค่าอินพุตสำหรับความชื้น
bool isSettingTemp = true; // สถานะสำหรับกรอกค่าอุณหภูมิ
bool isSettingHumidity = false; // สถานะสำหรับกรอกค่าความชื้น
float mode = 1;
void setup() {
Serial.begin(115200);
dht.begin();
lcd.init();
lcd.backlight();
pinMode(RELAY_PIN, OUTPUT);
digitalWrite(RELAY_PIN, LOW); // ตั้งค่ารีเลย์ให้เริ่มต้นปิดอยู่
}
void loop() {
float temp = dht.readTemperature();
float humidity = dht.readHumidity();
// แสดงค่าอุณหภูมิและความชื้นบนจอ LCD
if(mode == 1){
lcd.setCursor(0, 0);
lcd.print("Temp: ");
lcd.setCursor(0, 1);
lcd.print("Hum: ");
lcd.setCursor(6, 0);
lcd.print(temp);
lcd.print(" C ");
lcd.setCursor(5, 1);
lcd.print(humidity);
lcd.print(" %RH");
}else if(mode == 2){
lcd.setCursor(0, 0);
lcd.print("Limit Temp: ");
}else if(mode == 3){
lcd.setCursor(0, 0);
lcd.print("Limit Hum: ");
}
// ตรวจสอบการทำงานของรีเลย์
if (temp > targetTemp || humidity > targetHumidity) {
digitalWrite(RELAY_PIN, HIGH); // เปิดรีเลย์
} else {
digitalWrite(RELAY_PIN, LOW); // ปิดรีเลย์
}
// รับอินพุตจากคีย์แพด
char key = keypad.getKey();
if (key != NO_KEY) {
if (key == 'A'){
lcd.clear();
mode = 2;
}
else if (key == 'B'){
inputTemp = ""; // ล้างข้อมูลที่กรอกไว้
inputHumidity = ""; // ล้างข้อมูลที่กรอกไว้
isSettingTemp = true;
isSettingHumidity = false;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Input Clear");
delay(100);
lcd.clear();
mode = 1;
}
else if (key == '#'){
if (mode == 2 && isSettingTemp && inputTemp != "") {
targetTemp = inputTemp.toFloat(); // แปลงค่าเป็น float และบันทึกเป็น targetTemp
isSettingTemp = false;
isSettingHumidity = true;
inputTemp = ""; // รีเซ็ตค่าอินพุต
lcd.clear();
mode = 3;
} else if (mode == 3 && isSettingHumidity && inputHumidity != "") {
targetHumidity = inputHumidity.toFloat(); // แปลงค่าเป็น float และบันทึกเป็น targetHumidity
inputHumidity = ""; // รีเซ็ตค่าอินพุต
isSettingHumidity = false;
lcd.clear();
mode = 1;
}
}
// รับค่าตัวเลขจากคีย์แพด
else if (key >= '0' && key <= '9') {
if (isSettingTemp) {
inputTemp += key; // สะสมตัวเลขที่ผู้ใช้กรอกเข้าไปสำหรับอุณหภูมิ
lcd.setCursor(0, 1);
lcd.print(inputTemp);
} else if (isSettingHumidity) {
inputHumidity += key; // สะสมตัวเลขที่ผู้ใช้กรอกเข้าไปสำหรับความชื้น
lcd.setCursor(0, 1);
lcd.print(inputHumidity);
}
}
}
}