#include <DHT.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// ---------------- Hardware Setup ----------------
#define DHTPIN 2
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
#define MODE_SWITCH 3 // Slide switch Auto/Manual
#define BTN_HEATER 4 // Manual button Heater
#define BTN_FAN 5 // Manual button Fan
#define LED_HEATER 8 // LED merah = heater
#define LED_FAN 9 // LED biru = kipas
#define LED_OK 10 // LED hijau = normal
#define LED_WARN 11 // LED kuning = kelembapan tinggi
#define LED_ERR 12 // LED merah = overheat
LiquidCrystal_I2C lcd(0x27, 20, 4);
// ---------------- Target Control ----------------
float targetTemp = 45.0; // Target suhu °C
float targetHum = 40.0; // Target kelembapan %
void setup() {
Serial.begin(9600);
dht.begin();
lcd.init();
lcd.backlight();
pinMode(MODE_SWITCH, INPUT_PULLUP);
pinMode(BTN_HEATER, INPUT_PULLUP);
pinMode(BTN_FAN, INPUT_PULLUP);
pinMode(LED_HEATER, OUTPUT);
pinMode(LED_FAN, OUTPUT);
pinMode(LED_OK, OUTPUT);
pinMode(LED_WARN, OUTPUT);
pinMode(LED_ERR, OUTPUT);
// Matikan semua awalnya
digitalWrite(LED_HEATER, LOW);
digitalWrite(LED_FAN, LOW);
digitalWrite(LED_OK, LOW);
digitalWrite(LED_WARN, LOW);
digitalWrite(LED_ERR, LOW);
lcd.setCursor(0,0);
lcd.print("Sistem Pengeringan");
lcd.setCursor(0,1);
lcd.print("Teh Cascara v1.0");
delay(2000);
}
void loop() {
float t = dht.readTemperature();
float h = dht.readHumidity();
if (isnan(t) || isnan(h)) {
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Sensor Error!");
delay(1000);
return;
}
bool autoMode = digitalRead(MODE_SWITCH) == HIGH;
bool heaterOn = false;
bool fanOn = false;
if (autoMode) {
// Mode otomatis
if (t < targetTemp - 1) heaterOn = true;
if (t > targetTemp + 1) heaterOn = false;
if (h > targetHum) fanOn = true;
else fanOn = false;
} else {
// Mode manual: tombol
if (digitalRead(BTN_HEATER) == LOW) heaterOn = true;
if (digitalRead(BTN_FAN) == LOW) fanOn = true;
}
// Aktifkan LED heater/fan
digitalWrite(LED_HEATER, heaterOn);
digitalWrite(LED_FAN, fanOn);
// Status indikator
if (t > 60) { // Overheat
digitalWrite(LED_ERR, HIGH);
digitalWrite(LED_OK, LOW);
digitalWrite(LED_WARN, LOW);
heaterOn = false; // safety
} else if (h > targetHum + 10) {
digitalWrite(LED_WARN, HIGH);
digitalWrite(LED_OK, LOW);
digitalWrite(LED_ERR, LOW);
} else {
digitalWrite(LED_OK, HIGH);
digitalWrite(LED_WARN, LOW);
digitalWrite(LED_ERR, LOW);
}
// LCD tampilkan data
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Mode: ");
lcd.print(autoMode ? "AUTO" : "MANUAL");
lcd.setCursor(0,1);
lcd.print("Temp: "); lcd.print(t); lcd.print("C");
lcd.setCursor(0,2);
lcd.print("Hum : "); lcd.print(h); lcd.print("%");
lcd.setCursor(0,3);
lcd.print("Heater:");
lcd.print(heaterOn ? "ON " : "OFF");
lcd.print(" Fan:");
lcd.print(fanOn ? "ON" : "OFF");
delay(1000);
}