#include <LiquidCrystal.h>
#include <Servo.h>
#include <DHT.h>
// --- PIN DEFINITIONS ---
#define PIN_DHT A1 // TUKAR: Guna label A1 terus
#define DHTTYPE DHT22
#define PIN_BUZZER 6
#define PIN_HEATER 9
#define PIN_SERVO 8
// LED Status Pins
#define LED_RED 13
#define LED_GREEN 10
#define LED_BLUE 7
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
Servo ventServo;
DHT dht(PIN_DHT, DHTTYPE);
void setup() {
pinMode(PIN_HEATER, OUTPUT);
pinMode(PIN_BUZZER, OUTPUT);
pinMode(LED_RED, OUTPUT);
pinMode(LED_GREEN, OUTPUT);
pinMode(LED_BLUE, OUTPUT);
lcd.begin(16, 2);
lcd.print("System Loading..");
dht.begin();
ventServo.attach(PIN_SERVO);
ventServo.write(0);
// DHT22 perlukan masa untuk "ready"
delay(2000);
lcd.clear();
}
void loop() {
// Baca Suhu & Humidity
float temp = dht.readTemperature();
float humidity = dht.readHumidity();
// Jika masih error, papar mesej Checking supaya tak "stuck"
if (isnan(temp) || isnan(humidity)) {
lcd.setCursor(0, 0);
lcd.print("Checking Sensor.");
return;
}
// Paparan LCD (Baris 1)
lcd.setCursor(0, 0);
lcd.print("T:");
lcd.print(temp, 1);
lcd.print("C ");
lcd.setCursor(9, 0);
lcd.print("H:");
lcd.print(humidity, 0);
lcd.print("% ");
// Logik Kawalan (Baris 2)
lcd.setCursor(0, 1);
if (temp < 35.0) {
lcd.print("Stat: HEATING ");
digitalWrite(PIN_HEATER, HIGH);
digitalWrite(LED_RED, HIGH);
digitalWrite(LED_GREEN, LOW);
digitalWrite(LED_BLUE, LOW);
noTone(PIN_BUZZER);
ventServo.write(0);
}
else if (temp >= 35.0 && temp <= 37.5) {
lcd.print("Stat: IDEAL ");
digitalWrite(PIN_HEATER, LOW);
digitalWrite(LED_RED, LOW);
digitalWrite(LED_GREEN, HIGH);
digitalWrite(LED_BLUE, LOW);
noTone(PIN_BUZZER);
ventServo.write(0);
}
else {
lcd.print("ALARM: TOO HOT!");
digitalWrite(PIN_HEATER, LOW);
digitalWrite(LED_RED, LOW);
digitalWrite(LED_GREEN, LOW);
digitalWrite(LED_BLUE, HIGH);
tone(PIN_BUZZER, 1000);
ventServo.write(90);
}
delay(2000); // WAJIB 2 saat untuk DHT22
}