#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 lampPin = 5; // LED Putih
const int fanPin = 6; // LED Biru
const int alarmLed = 7; // LED Merah
const int buzzerPin = 8;
//=======================
// Variabel
//=======================
bool manualMode = false;
bool manualLamp = false;
unsigned long lastLCD = 0;
byte lcdPage = 0;
const int ldrThreshold = 500;
//=======================
void setup() {
pinMode(ldrPin, INPUT);
pinMode(pirPin, INPUT);
pinMode(buttonPin, INPUT_PULLUP);
pinMode(lampPin, OUTPUT);
pinMode(fanPin, OUTPUT);
pinMode(alarmLed, OUTPUT);
pinMode(buzzerPin, OUTPUT);
dht.begin();
lcd.init();
lcd.backlight();
lcd.setCursor(0,0);
lcd.print("SMART CLASSROOM");
lcd.setCursor(0,1);
lcd.print("Initializing...");
delay(2000);
lcd.clear();
}
//=======================
void loop() {
//=======================
// BACA SENSOR
//=======================
float suhu = dht.readTemperature();
float hum = dht.readHumidity();
int ldrValue = analogRead(ldrPin);
bool adaOrang = digitalRead(pirPin);
//=======================
// BUTTON MANUAL
//=======================
static bool lastButton = HIGH;
bool button = digitalRead(buttonPin);
if (lastButton == HIGH && button == LOW) {
manualMode = !manualMode;
if (manualMode)
manualLamp = !manualLamp;
delay(200);
}
lastButton = button;
//=======================
// LAMPU
//=======================
bool lampStatus;
if (manualMode) {
lampStatus = manualLamp;
} else {
lampStatus = (ldrValue < ldrThreshold && adaOrang);
}
digitalWrite(lampPin, lampStatus);
//=======================
// KIPAS
//=======================
bool fanStatus = false;
if (!isnan(suhu)) {
if (suhu > 30)
fanStatus = true;
}
digitalWrite(fanPin, fanStatus);
//=======================
// ALARM
//=======================
bool alarmStatus = false;
if (!isnan(suhu)) {
if (suhu > 35)
alarmStatus = true;
}
digitalWrite(alarmLed, alarmStatus);
if (alarmStatus) {
tone(buzzerPin, 1000);
} else {
noTone(buzzerPin);
}
//=======================
// LCD BERGANTI TIAP 3 DETIK
//=======================
if (millis() - lastLCD >= 3000) {
lastLCD = millis();
lcd.clear();
switch (lcdPage) {
case 0:
lcd.setCursor(0,0);
lcd.print("Suhu:");
lcd.print(suhu,1);
lcd.print((char)223);
lcd.print("C");
lcd.setCursor(0,1);
lcd.print("Hum :");
lcd.print(hum,0);
lcd.print("%");
break;
case 1:
lcd.setCursor(0,0);
lcd.print("Lampu : ");
if (lampStatus)
lcd.print("ON");
else
lcd.print("OFF");
lcd.setCursor(0,1);
lcd.print("Kipas : ");
if (fanStatus)
lcd.print("ON");
else
lcd.print("OFF");
break;
case 2:
lcd.setCursor(0,0);
if (adaOrang)
lcd.print("Ada Orang");
else
lcd.print("Kosong");
lcd.setCursor(0,1);
if (manualMode)
lcd.print("Mode: Manual");
else
lcd.print("Mode: Auto");
break;
case 3:
lcd.setCursor(0,0);
lcd.print("LDR:");
lcd.print(ldrValue);
lcd.setCursor(0,1);
if (ldrValue < ldrThreshold)
lcd.print("Gelap");
else
lcd.print("Terang");
break;
}
lcdPage++;
if (lcdPage > 3)
lcdPage = 0;
}
}