#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <DHT.h>
#include <RTClib.h>
// Konfigurasi OLED
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
// Konfigurasi DHT22
#define DHTPIN 12 // Pastikan kabel data ke Pin D13
#define DHTTYPE DHT22 // Ganti ke DHT11 jika kamu memakai sensor warna biru
DHT dht(DHTPIN, DHTTYPE);
// Konfigurasi RTC
RTC_DS1307 rtc;
// Konfigurasi Pin Sensor Lainnya
const int pinLDR = 33;
const int pinPIR = 2;
void setup() {
Serial.begin(115200);
// Inisialisasi OLED
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
for(;;);
}
display.clearDisplay();
display.setTextColor(WHITE);
// Inisialisasi DHT
dht.begin();
// Inisialisasi RTC
if (!rtc.begin()) {
Serial.println("RTC Gagal");
}
pinMode(pinPIR, INPUT);
}
void loop() {
// 1. Baca Data Suhu & Kelembapan (Berikan waktu baca)
float temp = dht.readTemperature();
float hum = dht.readHumidity();
// 2. Baca Data Cahaya
int ldrRaw = analogRead(pinLDR);
// KALIBRASI:
// Jika saat terang maksimal ldrRaw terbaca sekitar 800-1000,
// maka ganti angka 0 menjadi angka terbaca tersebut (misal 800).
// Jika ingin hasil lebih akurat mendekati 500 saat terang:
float lux = map(ldrRaw, 800, 4095, 500, 0);
// Agar nilai tidak melompat melebihi 500 atau dibawah 0 (karena pembatasan map)
lux = constrain(lux, 0, 500);
// 3. Baca Data Gerakan
bool motion = digitalRead(pinPIR);
String motionStatus = (motion) ? "Detected" : "Undetected";
// 4. Baca Waktu RTC
DateTime now = rtc.now();
// --- TAMPILKAN DI OLED ---
display.clearDisplay();
display.setTextSize(1);
display.setCursor(20, 0);
display.print("Nilai Parameter");
// Perbaikan Tampilan Jika nan
display.setCursor(0, 15);
display.print("Temp: ");
if (isnan(temp)) {
display.print("Error"); // Jika nan, tampilkan pesan Error
} else {
display.print(temp); display.print(" C");
}
display.setCursor(0, 25);
display.print("Hum : ");
if (isnan(hum)) {
display.print("Error");
} else {
display.print(hum); display.print(" %");
}
display.setCursor(0, 35);
display.print("Inte: "); display.print(lux); display.print(" Lux");
display.setCursor(0, 45);
display.print("Obj : "); display.print(motionStatus);
display.setCursor(0, 56);
char buffer[20];
sprintf(buffer, "%02d/%02d/%d %02d:%02d:%02d", now.day(), now.month(), now.year(), now.hour(), now.minute(), now.second());
display.print(buffer);
display.display();
delay(2000); // DHT22 butuh minimal 2 detik untuk pembacaan stabil
}