#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <DHT.h>
#include <RTClib.h>
const byte LDR_PIN = 33;
const byte PIR_PIN = 2;
#define DHT_PIN 12
#define DHT_TYPE DHT22
DHT dht(DHT_PIN, DHT_TYPE);
RTC_DS3231 rtc;
Adafruit_SSD1306 display(128, 64, &Wire, -1);
void setup() {
Serial.begin(115200);
displayInit();
pinMode(PIR_PIN, INPUT);
rtcInit();
}
void loop() {
float lightIntensity = convertToLux(analogRead(LDR_PIN));
float temp = dht.readTemperature();
float hum = dht.readHumidity();
bool motionDetected = digitalRead(PIR_PIN);
String motionStatus = motionDetected ? "Detected" : "Undetected";
DateTime now = rtc.now();
char currentTime[20];
sprintf(currentTime, "%04d/%02d/%02d %02d:%02d:%02d", now.year(), now.month(), now.day(), now.hour(), now.minute(), now.second());
Serial.print("RTC Time: ");
Serial.println(currentTime);
updateDisplay(temp, hum, lightIntensity, motionStatus, currentTime);
delay(1000);
display.clearDisplay();
}
float convertToLux(int adcValue) {
const float GAMMA = 0.7;
const float RL10 = 33;
float voltage = adcValue / 4095.0 * 3.3;
float resistance = 2000 * voltage / (1 - voltage / 3.3);
return pow(RL10 * 1e3 * pow(10, GAMMA) / resistance, (1 / GAMMA));
}
void rtcInit() {
if (!rtc.begin()) {
Serial.println("RTC module not found");
while (1);
}
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
void displayInit() {
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println("Display init failed");
while (1);
}
delay(2000);
display.clearDisplay();
}
void updateDisplay(float temp, float hum, float lux, String motion, const char* time) {
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(15, 5);
display.println("Sensor Data");
display.setCursor(10, 15);
display.print("Temp: ");
display.print(temp);
display.println(" C");
display.setCursor(10, 25);
display.print("Hum : ");
display.print(hum);
display.println(" %");
display.setCursor(10, 35);
display.print("Lux : ");
display.print(lux);
display.println(" lx");
display.setCursor(10, 45);
display.print("Motion: ");
display.println(motion);
display.setCursor(10, 55);
display.println(time);
display.display();
}