// ESP32 + PIR + LDR Modülü + Röle + OLED
// Akıllı Aydınlatma — karanlık + hareket → ışık 30sn yansın
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define PIR_PIN 14
#define LDR_PIN 34
#define RELAY_PIN 5
#define LIGHT_ON_MS 30000 // 30 sn yanık kal
#define LDR_DARK 2000 // Bu değerin ÜSTÜ karanlık (LDR modülü ters)
#define SCREEN_W 128
#define SCREEN_H 64
#define OLED_ADDR 0x3C
Adafruit_SSD1306 oled(SCREEN_W, SCREEN_H, &Wire, -1);
bool lightOn = false;
unsigned long lastMotionMs = 0;
int ldrVal = 0;
bool motionState = false;
// ============ Helpers ============
void lcdAt(int x, int y, uint8_t size, const String &text) {
oled.setTextSize(size);
oled.setCursor(x, y);
oled.print(text);
}
void centered(uint8_t y, uint8_t size, const String &text) {
int charW = 6 * size;
int w = text.length() * charW;
int x = (128 - w) / 2;
if (x < 0) x = 0;
lcdAt(x, y, size, text);
}
// ============ Ekranlar ============
void drawSplash() {
oled.clearDisplay();
oled.setTextColor(SSD1306_WHITE);
lcdAt(6, 10, 2, "BlueGrays");
lcdAt(2, 40, 1, "Akilli Aydinlatma");
oled.drawRoundRect(2, 2, 124, 60, 6, SSD1306_WHITE);
oled.display();
}
void drawStatus() {
oled.clearDisplay();
oled.setTextColor(SSD1306_WHITE);
// Ust: baslik
lcdAt(0, 0, 1, "> Akilli Aydinlatma");
oled.drawLine(0, 10, 127, 10, SSD1306_WHITE);
// ORTA: buyuk durum (size 3) + tek satir aciklama (size 1)
if (lightOn) {
unsigned long remain = (LIGHT_ON_MS - (millis() - lastMotionMs)) / 1000;
centered(16, 3, "ACIK");
centered(44, 1, String(remain) + " saniye kaldi");
} else if (ldrVal < LDR_DARK) {
centered(16, 3, "GUNDUZ");
centered(44, 1, "Aydinlik ortam");
} else {
centered(16, 3, "BEKLE");
centered(44, 1, "Hareket bekliyor");
}
// Alt cizgi
oled.drawLine(0, 53, 127, 53, SSD1306_WHITE);
// ALT: Sensor bilgileri tek satir
lcdAt(0, 55, 1, "LDR:" + String(ldrVal));
lcdAt(72, 55, 1, "PIR:" + String(motionState ? "VAR" : "YOK"));
oled.display();
}
// ============ SETUP ============
void setup() {
pinMode(PIR_PIN, INPUT);
pinMode(RELAY_PIN, OUTPUT);
digitalWrite(RELAY_PIN, LOW);
Wire.begin();
if (!oled.begin(SSD1306_SWITCHCAPVCC, OLED_ADDR)) {
while (1);
}
drawSplash();
delay(2500);
analogReadResolution(12);
}
// ============ LOOP ============
void loop() {
ldrVal = analogRead(LDR_PIN);
motionState = digitalRead(PIR_PIN) == HIGH;
// Karanlık + hareket → ışık yak, timer sıfırla
if (motionState && ldrVal >= LDR_DARK) {
if (!lightOn) {
lightOn = true;
digitalWrite(RELAY_PIN, HIGH);
}
lastMotionMs = millis();
}
// Süre bitti
if (lightOn && (millis() - lastMotionMs > LIGHT_ON_MS)) {
lightOn = false;
digitalWrite(RELAY_PIN, LOW);
}
// 500ms'de bir ekran
static unsigned long lastDraw = 0;
if (millis() - lastDraw > 500) {
lastDraw = millis();
drawStatus();
}
delay(50);
}