#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <DHT.h>
// Konfigurasi Layar OLED
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
// Konfigurasi Pin Berdasarkan Gambar
#define DHTPIN 13 // Pin Sensor DHT22
#define DHTTYPE DHT22
#define PIR_PIN 27 // Pin Sensor PIR (Gerakan)
#define LDR_PIN 34 // Pin LDR (Analog)
#define RELAY_PIN 14 // Pin Relay (Lampu)
#define BUZZER_PIN 12 // Pin Buzzer
DHT dht(DHTPIN, DHTTYPE);
void setup() {
Serial.begin(115200);
// Inisialisasi Pin
pinMode(PIR_PIN, INPUT);
pinMode(LDR_PIN, INPUT);
pinMode(RELAY_PIN, OUTPUT);
pinMode(BUZZER_PIN, OUTPUT);
// Pastikan kondisi awal mati
digitalWrite(RELAY_PIN, LOW);
digitalWrite(BUZZER_PIN, LOW);
// Inisialisasi OLED
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 allocation failed"));
for(;;);
}
dht.begin();
display.clearDisplay();
display.setTextColor(WHITE);
Serial.println("Sistem Dimulai...");
}
void loop() {
// Membaca data sensor
float h = dht.readHumidity();
float t = dht.readTemperature();
int lux = analogRead(LDR_PIN);
int gerakan = digitalRead(PIR_PIN);
// Cek apakah sensor DHT terbaca dengan benar
if (isnan(h) || isnan(t)) {
Serial.println("Gagal membaca sensor DHT!");
return;
}
// --- LOGIKA UTAMA ---
bool lampuOn = false;
bool buzzerOn = false;
// 1. Logika Lampu: Jika Gelap (<1000 Lux) DAN ada Gerakan
if (lux < 1000 && gerakan == HIGH) {
digitalWrite(RELAY_PIN, HIGH);
lampuOn = true;
} else {
digitalWrite(RELAY_PIN, LOW);
}
// 2. Logika Buzzer: Jika Temp > 30C DAN Kelembapan < 40%
if (t > 30 && h < 40) {
tone(BUZZER_PIN, 800);
buzzerOn = true;
} else {
noTone(BUZZER_PIN);
}
// --- TAMPILAN OLED ---
display.clearDisplay();
display.setTextSize(1);
display.setCursor(0, 0);
display.print("Temp: "); display.print(t); display.print(" C");
display.setCursor(0, 15);
display.print("Hum : "); display.print(h); display.print(" %");
display.setCursor(0, 30);
display.print("Lux : "); display.print(lux);
display.setCursor(0, 50);
display.print("Lampu: "); display.print(lampuOn ? "ON" : "OFF");
display.setCursor(70, 50);
display.print("BZR: "); display.print(buzzerOn ? "ON" : "OFF");
display.display();
// Print ke Serial Monitor untuk debugging
Serial.print("Lux: "); Serial.print(lux);
Serial.print(" | Temp: "); Serial.print(t);
Serial.print(" | Hum: "); Serial.println(h);
delay(500); // Update data setiap 0.5 detik
}