#include <DHT.h>
#include <LiquidCrystal_I2C.h>
// ================= KONFIGURASI PIN =================
#define DHT_SENSOR_PIN 23
#define POT_PIN 34
#define BUZZER_PIN 13
#define LED_RED 18 // FAST
#define LED_YELLOW 19 // MEDIUM
#define LED_GREEN 5 // OFF
#define DHT_SENSOR_TYPE DHT22
LiquidCrystal_I2C lcd(0x27, 16, 2);
DHT dht_sensor(DHT_SENSOR_PIN, DHT_SENSOR_TYPE);
void setup() {
Serial.begin(115200);
delay(500);
Serial.println("\n============================================");
Serial.println(" Smart HVAC - Full System");
Serial.println(" ESP32 + DHT22 + LCD + LED + BUZZER");
Serial.println("============================================");
dht_sensor.begin();
lcd.init();
lcd.backlight();
pinMode(LED_RED, OUTPUT);
pinMode(LED_YELLOW, OUTPUT);
pinMode(LED_GREEN, OUTPUT);
pinMode(BUZZER_PIN, OUTPUT);
pinMode(POT_PIN, INPUT);
lcd.setCursor(0, 0);
lcd.print("Smart HVAC Init");
// Beep awal
tone(BUZZER_PIN, 1000, 200);
Serial.println("[INIT] Semua komponen siap!");
delay(1500);
lcd.clear();
}
void loop() {
// ===== 1. BACA SETPOINT =====
int potValue = analogRead(POT_PIN);
float setpoint = map(potValue, 0, 4095, 20, 35);
// ===== 2. BACA SUHU =====
float tempAktual = dht_sensor.readTemperature();
if (isnan(tempAktual)) {
Serial.println("[ERROR] Sensor DHT gagal dibaca!");
lcd.setCursor(0, 0);
lcd.print("Sensor Error! ");
noTone(BUZZER_PIN);
delay(500);
return;
}
int fanLevel = 0;
String fanStatus = "";
// ===== 3. LOGIKA FAN + LED + BUZZER =====
if (tempAktual < (setpoint + 1.0)) {
// OFF
digitalWrite(LED_GREEN, HIGH);
digitalWrite(LED_YELLOW, LOW);
digitalWrite(LED_RED, LOW);
noTone(BUZZER_PIN);
fanLevel = 0;
fanStatus = "OFF";
}
else if (tempAktual <= (setpoint + 4.0)) {
// MEDIUM
digitalWrite(LED_GREEN, LOW);
digitalWrite(LED_YELLOW, HIGH);
digitalWrite(LED_RED, LOW);
tone(BUZZER_PIN, 500, 50); // beep pendek
fanLevel = 1;
fanStatus = "MEDIUM";
}
else {
// FAST (ALARM)
digitalWrite(LED_GREEN, LOW);
digitalWrite(LED_YELLOW, LOW);
digitalWrite(LED_RED, HIGH);
tone(BUZZER_PIN, 1500); // bunyi terus
fanLevel = 2;
fanStatus = "FAST";
}
// ===== 4. SERIAL MONITOR =====
Serial.println("--------------------------------------------");
Serial.print("[HVAC] Waktu : ");
Serial.print(millis() / 1000);
Serial.println(" detik");
Serial.print("[HVAC] Suhu : ");
Serial.print(tempAktual, 1);
Serial.println(" C");
Serial.print("[HVAC] Setpoint : ");
Serial.print(setpoint, 0);
Serial.println(" C");
Serial.print("[HVAC] Error : ");
float err = tempAktual - setpoint;
if (err >= 0) Serial.print("+");
Serial.print(err, 1);
Serial.println(" C");
Serial.print("[HVAC] Fan : ");
Serial.println(fanStatus);
// Bar indikator kecepatan
int pct = (fanLevel == 0) ? 0 : (fanLevel == 1) ? 50 : 100;
int filled = (pct * 20) / 100;
Serial.print("[HVAC] Speed : [");
for (int i = 0; i < 20; i++) {
if (i < filled) Serial.print("#");
else Serial.print("-");
}
Serial.print("] ");
Serial.print(pct);
Serial.println("%");
Serial.println("--------------------------------------------");
// ===== 5. LCD =====
lcd.setCursor(0, 0);
lcd.print("T:");
lcd.print(tempAktual, 1);
lcd.print("C S:");
lcd.print(setpoint, 0);
lcd.print("C ");
lcd.setCursor(0, 1);
lcd.print("STATUS: ");
lcd.print(fanStatus);
lcd.print(" ");
delay(500);
}