#include <DHT.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Inisialisasi LCD I2C
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Pin konfigurasi
#define DHTPIN 2 // Pin sensor DHT22
#define DHTTYPE DHT22 // Jenis sensor DHT22
#define BUTTON_NORMAL 3
#define BUTTON_PANAS 4
#define BUTTON_DINGIN 5
#define RELAY_HEATER 6
#define RELAY_COOLER 7
// Inisialisasi sensor DHT22
DHT dht(DHTPIN, DHTTYPE);
// Variabel kontrol suhu
float suhu;
int setpoint = 20; // Default suhu normal 20°C
void setup() {
pinMode(BUTTON_NORMAL, INPUT_PULLUP);
pinMode(BUTTON_PANAS, INPUT_PULLUP);
pinMode(BUTTON_DINGIN, INPUT_PULLUP);
pinMode(RELAY_HEATER, OUTPUT);
pinMode(RELAY_COOLER, OUTPUT);
lcd.init();
lcd.clear();
lcd.backlight();
dht.begin();
Serial.begin(9600);
}
void loop() {
// Membaca input tombol
if (digitalRead(BUTTON_NORMAL) == LOW) {
setpoint = 20;
} else if (digitalRead(BUTTON_PANAS) == LOW) {
setpoint = 50;
} else if (digitalRead(BUTTON_DINGIN) == LOW) {
setpoint = 0;
}
// Membaca suhu dari DHT22
suhu = dht.readTemperature();
Serial.print("Suhu: ");
Serial.print(suhu);
Serial.println(" °C");
Serial.print("Setpoint: ");
Serial.print(setpoint);
Serial.println(" °C");
// Tampilkan suhu pada LCD
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Suhu: ");
lcd.print(suhu);
lcd.print(" C");
lcd.setCursor(0, 1);
lcd.print("Setpoint: ");
lcd.print(setpoint);
lcd.print(" C");
// Implementasi Fuzzy Logic sederhana
float heaterOutput = fuzzyHeater(suhu, setpoint);
float coolerOutput = fuzzyCooler(suhu, setpoint);
// Matikan heater dan cooler jika suhu mendekati setpoint
if (abs(suhu - setpoint) <= 1) {
heaterOutput = 0;
coolerOutput = 0;
}
// Mengontrol Heater
digitalWrite(RELAY_HEATER, heaterOutput > 0 ? HIGH : LOW);
// Mengontrol Cooler
digitalWrite(RELAY_COOLER, coolerOutput > 0 ? HIGH : LOW);
// Menampilkan status kontrol pada Serial Monitor
Serial.print("Heater: ");
Serial.println(heaterOutput > 0 ? "ON" : "OFF");
Serial.print("Cooler: ");
Serial.println(coolerOutput > 0 ? "ON" : "OFF");
delay(1000);
}
// Fuzzy Logic untuk Heater
float fuzzyHeater(float suhu, int setpoint) {
if (suhu >= 0 && suhu <= 15) {
return 1.0; // Heater menyala penuh
} else if (suhu >= 16 && suhu <= 19) {
return 0.5; // Heater setengah daya
} else if (suhu >= 20 && suhu <= 30) {
return 0.0; // Heater mati
} else if (suhu >= 31 && suhu <= 49) {
return 0.5; // Heater setengah daya
} else if (suhu >= 50 && suhu <= 90) {
return 1.0; // Heater menyala penuh
} else {
return 0.0;
}
}
// Fuzzy Logic untuk Cooler
float fuzzyCooler(float suhu, int setpoint) {
if (suhu >= 50 && suhu <= 90) {
return 1.0; // Cooler menyala penuh
} else if (suhu >= 31 && suhu <= 49) {
return 0.5; // Cooler setengah daya
} else if (suhu >= 20 && suhu <= 30) {
return 0.0; // Cooler mati
} else if (suhu >= 16 && suhu <= 19) {
return 0.5; // Cooler setengah daya
} else if (suhu >= 0 && suhu <= 15) {
return 1.0; // Cooler menyala penuh
} else {
return 0.0;
}
}