#include <DHT.h>
#include <LiquidCrystal_I2C.h>
// Pin konfigurasi
#define DHTPIN 5//sensor DHT11 terhubung ke pin D5
#define DHTTYPE DHT22// DHT 11
#define RELAY_HEATER 16// Relay untuk heater terhubung ke pin D3
#define RELAY_FAN 4// Relay untuk fan terhubung ke pin D4
#define BUTTON_START 15// Tombol START terhubung ke pin D6
#define BUTTON_RESET 2// Tombol RESET terhubung ke pin D7
DHT dht(DHTPIN, DHTTYPE);
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Status sistem
bool heaterState = false;// Status heater (ON/OFF)
bool isStarted = false;// Status proses (aktif/tidak aktif)
bool finished = false;// Status proses selesai
unsigned long lastHeaterToggle = 0;// Waktu terakhir toggle heater
void setup() {
Serial.begin(9600);// Inisialisasi serial monitor
Serial.println("Inisialisasi Sistem...");// Pesan awal
dht.begin();// Inisialisasi sensor DHT
lcd.init();// Inisialisasi LCD
lcd.backlight();// Nyalakan backlight LCD
pinMode(RELAY_HEATER, OUTPUT);// Set pin relay heater sebagai output
pinMode(RELAY_FAN, OUTPUT);// Set pin relay fan sebagai output
digitalWrite(RELAY_HEATER, HIGH);// Matikan heater (HIGH berarti OFF untuk relay)
digitalWrite(RELAY_FAN, HIGH);// Matikan fan (HIGH berarti OFF untuk relay)
pinMode(BUTTON_START, INPUT_PULLUP);// Set pin tombol START sebagai input dengan pull-up resistor
pinMode(BUTTON_RESET, INPUT_PULLUP);// Set pin tombol RESET sebagai input dengan pull-up resistor
lcd.setCursor(1, 0);
lcd.print("Tekan START Btn");
lcd.setCursor(2, 1);
lcd.print("Untuk Mulai");
Serial.println("Sistem Siap");
Serial.println("Tekan tombol START untuk memulai proses.");
Serial.println("Tekan tombol RESET untuk mereset sistem.");
}
void loop() {
// START button
if (digitalRead(BUTTON_START) == LOW && !isStarted) {// Jika tombol START ditekan dan proses belum dimulai
isStarted = true;// Set status proses menjadi aktif
finished = false;// Set status proses selesai menjadi false
lcd.clear();
lcd.setCursor(2, 0);
lcd.print("Proses Dimulai");
Serial.println("Proses Dimulai");
delay(1000);
}
// RESET button
if (digitalRead(BUTTON_RESET) == LOW) {// Jika tombol RESET ditekan
isStarted = false;// Set status proses menjadi tidak aktif
finished = false;// Set status proses selesai menjadi false
digitalWrite(RELAY_HEATER, HIGH);// Matikan heater
digitalWrite(RELAY_FAN, HIGH);// Matikan fan
lcd.clear();
lcd.setCursor(3, 0);
lcd.print("System Reset");
Serial.println("System Reset");
delay(1000);
lcd.clear();
lcd.setCursor(1, 0);
lcd.print("Tekan START Btn");
lcd.setCursor(2, 1);
lcd.print("Untuk Mulai");
Serial.println("Tekan tombol START untuk memulai proses.");
Serial.println("Tekan tombol RESET untuk mereset sistem.");
return;// Keluar dari loop untuk menghindari pembacaan sensor saat reset
}
if (isStarted && !finished) { // Jika proses aktif dan belum selesai
float h = dht.readHumidity(); // Baca kelembapan
float t = dht.readTemperature(); // Baca suhu dalam Celsius
if (isnan(h) || isnan(t)) { // Cek apakah pembacaan sensor gagal
Serial.println("Sensor Error!");
lcd.setCursor(0, 0);
lcd.print("Sensor Error ");
lcd.setCursor(0, 1);
lcd.print("Cek Koneksi ");
delay(1000);
return;// Keluar dari loop untuk menghindari pembacaan lebih lanjut
}
// Tampilkan data
lcd.setCursor(0, 0);
lcd.print("Temp: ");
lcd.print(t, 1);
lcd.print(" C ");
lcd.setCursor(0, 1);
lcd.print("Hum: ");
lcd.print(h, 1);
lcd.print(" % ");
Serial.print("Suhu: ");
Serial.print(t);
Serial.print(" C, Kelembapan: ");
Serial.print(h);
Serial.println(" %");
unsigned long now = millis();
// CASE 1: Proses aktif (kelembapan tinggi, suhu rendah)
if (h > 40 && t < 60) {
digitalWrite(RELAY_FAN, LOW); // FAN menyala
if (heaterState && now - lastHeaterToggle >= 2000) {// Jika heater menyala lebih dari 2 detik
heaterState = false;
digitalWrite(RELAY_HEATER, HIGH); // OFF heater
lastHeaterToggle = now;// Update waktu terakhir toggle heater
} else if (!heaterState && now - lastHeaterToggle >= 5000) {// Jika heater mati lebih dari 5 detik
heaterState = true;// Nyalakan heater
digitalWrite(RELAY_HEATER, LOW); // ON heater
lastHeaterToggle = now;// Update waktu terakhir toggle heater
}
}
// CASE 2: Proses selesai
else if (h <= 40 && t >= 60) {// Jika kelembapan rendah dan suhu tinggi
digitalWrite(RELAY_HEATER, HIGH);
digitalWrite(RELAY_FAN, HIGH);
lcd.clear();
lcd.setCursor(3, 0);
lcd.print("Process Done");
lcd.setCursor(4, 1);
lcd.print("Finish!");
Serial.println("Proses Selesai - Syarat terpenuhi.");
finished = true;// Set status proses selesai menjadi true
}
// CASE 3: Suhu tinggi tapi kelembapan belum rendah
else {// Jika suhu tinggi tapi kelembapan belum rendah
digitalWrite(RELAY_HEATER, HIGH); // Matikan heater
if (t > 30) {// Jika suhu lebih dari 30 derajat
digitalWrite(RELAY_FAN, LOW); // Nyalakan FAN
} else {// Jika suhu kurang dari atau sama dengan 30 derajat
digitalWrite(RELAY_FAN, HIGH); // Matikan FAN
}
}
}
delay(500);
}