#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <DHT.h>
#define DHTPIN 2
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Pin
const int ldrPin = A0;
const int pirPin = 3;
const int buttonPin = 4;
const int ledLamp = 5;
const int ledFan = 6;
const int ledAlarm = 7;
const int buzzer = 8;
// Variabel
bool manualMode = false;
bool lampManual = false;
unsigned long lastLCD = 0;
int lcdPage = 0;
void setup() {
pinMode(pirPin, INPUT);
// Menggunakan resistor pull-down eksternal
pinMode(buttonPin, INPUT);
pinMode(ledLamp, OUTPUT);
pinMode(ledFan, OUTPUT);
pinMode(ledAlarm, OUTPUT);
pinMode(buzzer, OUTPUT);
lcd.init();
lcd.backlight();
dht.begin();
}
void loop() {
float suhu = dht.readTemperature();
float hum = dht.readHumidity();
int cahaya = analogRead(ldrPin);
bool orang = digitalRead(pirPin);
// Jika sensor gagal dibaca
if (isnan(suhu) || isnan(hum)) {
lcd.clear();
lcd.print("DHT Error");
delay(1000);
return;
}
// Tombol Manual
if (digitalRead(buttonPin) == HIGH) {
delay(250);
manualMode = !manualMode;
if (manualMode)
lampManual = !lampManual;
while (digitalRead(buttonPin) == HIGH);
}
// Lampu
bool lampStatus;
if (manualMode) {
lampStatus = lampManual;
} else {
lampStatus = (cahaya > 500 && orang);
}
digitalWrite(ledLamp, lampStatus);
// Ventilasi
bool fanStatus = (suhu > 30);
digitalWrite(ledFan, fanStatus);
// Alarm
if (suhu > 35) {
digitalWrite(ledAlarm, HIGH);
tone(buzzer, 1000);
} else {
digitalWrite(ledAlarm, LOW);
noTone(buzzer);
}
// LCD berganti setiap 3 detik
if (millis() - lastLCD >= 3000) {
lastLCD = millis();
lcd.clear();
switch (lcdPage) {
case 0:
lcd.setCursor(0,0);
lcd.print("Temp:");
lcd.print(suhu);
lcd.print((char)223);
lcd.print("C");
lcd.setCursor(0,1);
lcd.print("Hum :");
lcd.print(hum);
lcd.print("%");
break;
case 1:
lcd.setCursor(0,0);
lcd.print("Lamp:");
lcd.print(lampStatus ? "ON " : "OFF");
lcd.setCursor(0,1);
lcd.print("Fan :");
lcd.print(fanStatus ? "ON " : "OFF");
break;
case 2:
lcd.setCursor(0,0);
lcd.print("Ruangan:");
lcd.setCursor(0,1);
if (orang)
lcd.print("Ada Orang");
else
lcd.print("Kosong");
break;
}
lcdPage++;
if (lcdPage > 2)
lcdPage = 0;
}
}