#include <DHT.h>
#include <LiquidCrystal_I2C.h>
#define DHTPIN 5
#define DHTTYPE DHT22
#define RELAY_HEATER 16
#define RELAY_FAN 4
DHT dht(DHTPIN, DHTTYPE);
LiquidCrystal_I2C lcd(0x27, 16, 2);
unsigned long lastFanToggle = 0;
bool fanState = false;
bool finished = false;
void setup() {
Serial.begin(9600);
dht.begin();
lcd.init();
lcd.backlight();
pinMode(RELAY_HEATER, OUTPUT);
pinMode(RELAY_FAN, OUTPUT);
digitalWrite(RELAY_HEATER, LOW);
digitalWrite(RELAY_FAN, LOW);
}
void loop() {
float h = dht.readHumidity();
float t = dht.readTemperature();
lcd.setCursor(0, 0);
lcd.print("Temp: ");
lcd.print(t);
lcd.print(" C ");
lcd.setCursor(0, 1);
lcd.print("Hum: ");
lcd.print(h);
lcd.print(" % ");
if (isnan(h) || isnan(t)) {
Serial.println("Sensor error!");
return;
}
if (!finished) {
// CASE 1: Proses berjalan
if (h > 40 && t < 100) {
digitalWrite(RELAY_HEATER, HIGH);
// Kipas 2s ON 5s OFF
unsigned long now = millis();
if (fanState && now - lastFanToggle >= 2000) {
fanState = false;
digitalWrite(RELAY_FAN, LOW);
lastFanToggle = now;
} else if (!fanState && now - lastFanToggle >= 5000) {
fanState = true;
digitalWrite(RELAY_FAN, HIGH);
lastFanToggle = now;
}
}
// CASE 2: Target tercapai
else if (h <= 40 && t >= 100) {
digitalWrite(RELAY_HEATER, LOW);
digitalWrite(RELAY_FAN, LOW);
lcd.clear();
lcd.setCursor(3, 0);
lcd.print("Process Done");
lcd.setCursor(4, 1);
lcd.print("Finish!");
finished = true;
}
// CASE 3: Hanya suhu tinggi tapi kelembapan belum cukup
else {
digitalWrite(RELAY_HEATER, LOW);
if (t > 30) {
digitalWrite(RELAY_FAN, HIGH);
} else {
digitalWrite(RELAY_FAN, LOW);
}
}
}
delay(500); // Sampling
}