#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <RTClib.h>
#include <DHT.h>
// === KONFIGURASI PIN ===
#define DHTPIN 12
#define PIRPIN 11
#define LDRPIN A3
#define LEDPIN 11
#define FANPIN 10
#define DHTTYPE DHT22
// === INISIALISASI OBJEK ===
LiquidCrystal_I2C lcd(0x27, 20, 4);
RTC_DS3231 rtc;
DHT dht(DHTPIN, DHTTYPE);
// === PARAMETER KONTROL ===
float batasSuhu = 30.0; // suhu batas nyala kipas
int batasLdr = 500; // nilai LDR untuk kondisi gelap
void setup() {
Serial.begin(9600);
lcd.init();
lcd.backlight();
dht.begin();
rtc.begin();
pinMode(PIRPIN, INPUT);
pinMode(LDRPIN, INPUT);
pinMode(LEDPIN, OUTPUT);
pinMode(FANPIN, OUTPUT);
lcd.setCursor(0, 0);
lcd.print("Sistem Otomatis");
lcd.setCursor(0, 1);
lcd.print("Sensor & RTC Ready");
delay(2000);
lcd.clear();
}
void loop() {
// === BACA SENSOR ===
float suhu = dht.readTemperature();
float kelembapan = dht.readHumidity();
int nilaiLdr = analogRead(LDRPIN);
bool gerakan = digitalRead(PIRPIN);
DateTime now = rtc.now();
int jam = now.hour();
int menit = now.minute();
int detik = now.second();
// === KONTROL KIPAS ===
if (suhu > batasSuhu) {
digitalWrite(FANPIN, HIGH);
} else {
digitalWrite(FANPIN, LOW);
}
// === KONTROL LAMPU ===
bool malam = (nilaiLdr > batasLdr); // LDR besar = gelap
bool jamMalam = (jam >= 23 || jam < 5); // malam hari
if (malam || jamMalam) {
digitalWrite(LEDPIN, HIGH);
} else {
digitalWrite(LEDPIN, LOW);
}
// === TAMPILKAN DATA KE LCD ===
lcd.setCursor(0, 0);
lcd.print("Waktu: ");
if (jam < 10) lcd.print("0");
lcd.print(jam);
lcd.print(":");
if (menit < 10) lcd.print("0");
lcd.print(menit);
lcd.setCursor(0, 1);
lcd.print("Suhu: ");
lcd.print(suhu, 1);
lcd.print((char)223);
lcd.print("C ");
lcd.setCursor(0, 2);
lcd.print("Kelembapan: ");
lcd.print(kelembapan, 1);
lcd.print("% ");
lcd.setCursor(0, 3);
lcd.print("Lampu:");
lcd.print(digitalRead(LEDPIN) ? "ON " : "OFF");
lcd.print(" Fan:");
lcd.print(digitalRead(FANPIN) ? "ON " : "OFF");
delay(1000);
}