#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 13
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
// Konfigurasi RTC
RTC_DS1307 rtc;
// Konfigurasi Pin Sensor Lainnya
const int pinLDR = 33;
const int pinPIR = 14;
// Fungsi untuk mengonversi nilai ADC menjadi Intensitas (Rumus Program 2)
float hitungIntensitas(int adcValue) {
const float GAMMA = 0.7;
const float RL10 = 33;
// Konversi nilai analog menjadi tegangan
float voltage = adcValue / 4096.0 * 3.3;
// Menghitung resistansi LDR
float resistance = 2000 * voltage / (1 - voltage / 3.3);
// Menghitung nilai lux
float luxValue = pow(RL10 * 1e3 * pow(10, GAMMA) / resistance, (1 / GAMMA));
return luxValue;
}
void setup() {
Serial.begin(115200);
Serial.println("Sistem Monitoring Terpadu v2.0");
// Inisialisasi OLED
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println("OLED Gagal!");
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
float temp = dht.readTemperature();
float hum = dht.readHumidity();
// 2. Baca Data Cahaya (MENGGUNAKAN RUMUS AKURAT PROGRAM 2)
int ldrRaw = analogRead(pinLDR);
float lux = hitungIntensitas(ldrRaw);
// 3. Baca Data Gerakan
bool motion = digitalRead(pinPIR);
String motionStatus = (motion) ? "Detected" : "Undetected";
// 4. Baca Waktu RTC
DateTime now = rtc.now();
// --- LOG SERIAL MONITOR ---
Serial.print("Data -> Suhu: "); Serial.print(temp);
Serial.print(" C | Hum: "); Serial.print(hum);
Serial.print(" % | Lux: "); Serial.println(lux);
// --- TAMPILKAN DI OLED ---
display.clearDisplay();
display.setTextSize(1);
display.setCursor(20, 0);
display.print("Nilai Parameter");
// Suhu
display.setCursor(0, 15);
display.print("Temp: ");
if (isnan(temp)) { display.print("Error"); }
else { display.print(temp); display.print(" C"); }
// Kelembapan
display.setCursor(0, 25);
display.print("Hum : ");
if (isnan(hum)) { display.print("Error"); }
else { display.print(hum); display.print(" %"); }
// Intensitas Cahaya (Hasil rumus intensitas)
display.setCursor(0, 35);
display.print("Inte: ");
display.print(lux);
display.print(" Lux");
// Gerakan
display.setCursor(0, 45);
display.print("Obj : "); display.print(motionStatus);
// Waktu
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(1000);
}