#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <DHT.h>
//==================================================
// KONFIGURASI DHT22
//==================================================
#define DHTPIN 2
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
LiquidCrystal_I2C lcd(0x27, 16, 2);
//==================================================
// DEKLARASI 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;
const int ldrThreshold = 500;
unsigned long lastLCD = 0;
byte lcdPage = 0;
//==================================================
// SETUP
//==================================================
void setup() {
Serial.begin(9600);
dht.begin();
lcd.init();
lcd.backlight();
pinMode(ldrPin, INPUT);
pinMode(pirPin, INPUT);
pinMode(buttonPin, INPUT_PULLUP);
pinMode(lampPin, OUTPUT);
pinMode(fanPin, OUTPUT);
pinMode(alarmLed, OUTPUT);
pinMode(buzzerPin, OUTPUT);
lcd.setCursor(0,0);
lcd.print("SMART CLASSROOM");
lcd.setCursor(0,1);
lcd.print("Initializing...");
delay(2000);
lcd.clear();
}
//==================================================
// LOOP
//==================================================
void loop() {
//==================================================
// MEMBACA DATA SENSOR
//==================================================
float suhu = dht.readTemperature();
float hum = dht.readHumidity();
int ldrValue = analogRead(ldrPin);
bool adaOrang = digitalRead(pirPin);
//==================================================
// SOAL E
// MODE MANUAL
// Jika tombol ditekan,
// lampu menyala manual dan
// kontrol otomatis dinonaktifkan sementara.
//==================================================
static bool lastButton = HIGH;
bool button = digitalRead(buttonPin);
if (lastButton == HIGH && button == LOW) {
manualMode = !manualMode;
delay(250);
}
lastButton = button;
//==================================================
// SOAL A
// LAMPU OTOMATIS
// Lampu menyala jika ruangan gelap
// DAN ada orang.
// Pada mode manual lampu selalu ON.
//==================================================
bool lampStatus;
if (manualMode) {
lampStatus = true;
} else {
lampStatus = (ldrValue < ldrThreshold && adaOrang);
}
digitalWrite(lampPin, lampStatus);
//==================================================
// SOAL B
// VENTILASI OTOMATIS
// Kipas menyala jika suhu > 30°C
//==================================================
bool fanStatus = false;
if (!isnan(suhu)) {
if (suhu > 30) {
fanStatus = true;
}
}
digitalWrite(fanPin, fanStatus);
//==================================================
// SOAL C
// ALARM SUHU TINGGI
// LED Merah dan buzzer aktif
// jika suhu > 35°C
//==================================================
bool alarmStatus = false;
if (!isnan(suhu)) {
if (suhu > 35) {
alarmStatus = true;
}
}
digitalWrite(alarmLed, alarmStatus);
if (alarmStatus) {
tone(buzzerPin, 1000);
} else {
noTone(buzzerPin);
}
//==================================================
// SOAL D
// LCD berganti setiap 3 detik
//==================================================
if (millis() - lastLCD >= 3000) {
lastLCD = millis();
lcd.clear();
switch (lcdPage) {
//==============================
// HALAMAN 1
//==============================
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;
//==============================
// HALAMAN 2
//==============================
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;
//==============================
// HALAMAN 3
//==============================
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;
}
lcdPage++;
if(lcdPage > 2)
lcdPage = 0;
}
//==================================================
// MONITOR SERIAL
//==================================================
Serial.print("LDR : ");
Serial.print(ldrValue);
Serial.print(" | PIR : ");
Serial.print(adaOrang);
Serial.print(" | Suhu : ");
Serial.print(suhu);
Serial.print(" | Hum : ");
Serial.print(hum);
Serial.print(" | Lampu : ");
Serial.print(lampStatus);
Serial.print(" | Kipas : ");
Serial.print(fanStatus);
Serial.print(" | Manual : ");
Serial.println(manualMode);
delay(100);
}