#include <DHT.h> // Library untuk sensor DHT
#include <Wire.h> // Library untuk komunikasi I2C (untuk LCD)
#include <LiquidCrystal_I2C.h> // Library untuk LCD I2C
// --- Definisi Pin ---
#define DHT_PIN 27 // Pin data sensor DHT11
#define DHT_TYPE DHT11 // Tipe sensor DHT yang digunakan (DHT11 atau DHT22)
#define LDR_PIN 34 // Pin ADC untuk sensor LDR (GPIO 34 pada ESP32)
#define PIR_PIN 13 // Pin digital untuk sensor PIR
#define LED_PIN 2 // Pin digital untuk LED (simulasi lampu)
// --- Inisialisasi Objek ---
DHT dht(DHT_PIN, DHT_TYPE);
LiquidCrystal_I2C lcd(0x27, 16, 2); // Alamat I2C LCD (umumnya 0x27 atau 0x3F), 16 kolom, 2 baris
// --- Variabel Global ---
bool lampStatus = false; // Status lampu: false (mati), true (nyala)
unsigned long previousMillis = 0;
const long interval = 2000; // Interval pembacaan sensor (2 detik)
void setup() {
Serial.begin(115200); // Inisialisasi Serial Monitor
Serial.println("Smart Home Dashboard - Starting...");
dht.begin(); // Inisialisasi sensor DHT
lcd.init(); // Inisialisasi LCD
lcd.backlight(); // Nyalakan backlight LCD
lcd.print("Smart Home IoT");
lcd.setCursor(0, 1);
lcd.print("Loading...");
delay(2000);
lcd.clear();
pinMode(LDR_PIN, INPUT); // Pin LDR sebagai input (analog)
pinMode(PIR_PIN, INPUT); // Pin PIR sebagai input (digital)
pinMode(LED_PIN, OUTPUT); // Pin LED sebagai output
digitalWrite(LED_PIN, LOW); // Pastikan lampu mati saat startup
Serial.println("Smart Home Dashboard Ready!");
}
void loop() {
unsigned long currentMillis = millis();
// --- Pembacaan Sensor dan Tampilan Setiap Interval ---
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
// Baca Suhu dan Kelembaban
float h = dht.readHumidity();
float t = dht.readTemperature();
// Cek jika pembacaan gagal
if (isnan(h) || isnan(t)) {
Serial.println("Failed to read from DHT sensor!");
lcd.clear();
lcd.print("DHT Error!");
} else {
Serial.print("Temperature: ");
Serial.print(t);
Serial.print(" *C, Humidity: ");
Serial.print(h);
Serial.println(" %");
lcd.setCursor(0, 0);
lcd.print("T:");
lcd.print(t, 1); // 1 desimal
lcd.print((char)223); // Karakter derajat
lcd.print("C H:");
lcd.print(h, 1);
lcd.print("%");
}
// Baca Intensitas Cahaya (LDR)
int ldrValue = analogRead(LDR_PIN);
// Konversi nilai LDR ke persentase atau tingkat cahaya (misal: gelap, redup, terang)
// Nilai ADC ESP32 biasanya 0-4095
String lightStatus;
if (ldrValue < 500) { // Angka ini bisa disesuaikan tergantung lingkungan Wokwi
lightStatus = "Gelap";
} else if (ldrValue < 2000) {
lightStatus = "Redup";
} else {
lightStatus = "Terang";
}
Serial.print("LDR Value: ");
Serial.print(ldrValue);
Serial.print(" (");
Serial.print(lightStatus);
Serial.println(")");
lcd.setCursor(0, 1);
lcd.print("Cahaya:");
lcd.print(lightStatus);
// Clear sisa baris
for(int i = lcd.print(lightStatus); i < 16; i++) {
lcd.print(" ");
}
}
// --- Pembacaan Sensor PIR (Real-time) ---
int pirState = digitalRead(PIR_PIN);
if (pirState == HIGH) {
Serial.println("Gerakan Terdeteksi!");
// Anda bisa menambahkan notifikasi atau aksi lain di sini
// lcd.setCursor(0, 1); // Bisa juga ditampilkan di LCD, tapi akan berebut dengan cahaya
// lcd.print("Gerak!");
} else {
// Serial.println("Tidak ada gerakan."); // Nonaktifkan jika terlalu banyak output
}
// --- Kontrol Lampu via Serial Monitor ---
if (Serial.available()) {
String command = Serial.readStringUntil('\n');
command.trim(); // Hapus spasi di awal/akhir
command.toLowerCase(); // Ubah ke huruf kecil untuk kemudahan perbandingan
if (command == "lampu on") {
digitalWrite(LED_PIN, HIGH);
lampStatus = true;
Serial.println("Lampu Dinyalakan.");
} else if (command == "lampu off") {
digitalWrite(LED_PIN, LOW);
lampStatus = false;
Serial.println("Lampu Dimatikan.");
} else if (command == "status") {
Serial.print("Status Lampu: ");
Serial.println(lampStatus ? "ON" : "OFF");
Serial.print("Status Gerakan: ");
Serial.println(digitalRead(PIR_PIN) == HIGH ? "TERDETEKSI" : "TIDAK ADA");
} else {
Serial.println("Perintah tidak dikenal. Coba 'lampu on', 'lampu off', atau 'status'.");
}
}
// Update status lampu di Serial Monitor secara berkala (opsional, bisa dihilangkan jika terlalu sering)
// if (currentMillis - previousMillis >= 1000) { // Contoh: update setiap 1 detik
// Serial.print("Status Lampu: ");
// Serial.println(lampStatus ? "ON" : "OFF");
// }
}