// ESP32 + HC-SR04 + 5 LED (yeşil/sarı/kırmızı) + Buzzer + OLED
// Park Sensörü — yaklaştıkça LED bar dolar, buzzer bip aralığı kısalır
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define TRIG_PIN 25
#define ECHO_PIN 26
#define BUZZER_PIN 5
// LED pinleri (uzaktan yakına)
const int LED_PINS[5] = { 2, 4, 15, 18, 19 };
#define SCREEN_W 128
#define SCREEN_H 64
#define OLED_ADDR 0x3C
Adafruit_SSD1306 oled(SCREEN_W, SCREEN_H, &Wire, -1);
long distanceCm = 999;
unsigned long lastBeepMs = 0;
bool beepState = false;
// ============ Helpers ============
void lcdAt(int x, int y, uint8_t size, const String &t) {
oled.setTextSize(size);
oled.setCursor(x, y);
oled.print(t);
}
void centered(uint8_t y, uint8_t size, const String &t) {
int w = t.length() * 6 * size;
int x = (128 - w) / 2;
if (x < 0) x = 0;
lcdAt(x, y, size, t);
}
long readDistanceCm() {
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
long dur = pulseIn(ECHO_PIN, HIGH, 30000);
if (dur == 0) return 999;
return dur / 58;
}
// ============ Mesafe → LED sayısı, buzzer aralığı, durum ============
int ledsForDistance(long d) {
if (d < 20) return 5;
if (d < 40) return 4;
if (d < 60) return 3;
if (d < 80) return 2;
if (d < 100) return 1;
return 0;
}
int beepIntervalForDistance(long d) {
if (d < 10) return 0; // Sürekli (alarm)
if (d < 20) return 100; // Çok hızlı
if (d < 40) return 250; // Hızlı
if (d < 60) return 500; // Orta
if (d < 80) return 800; // Yavaş
if (d < 100) return 1200; // Çok yavaş
return -1; // Sessiz
}
String statusText(long d) {
if (d < 10) return "TEHLIKE!";
if (d < 20) return "DUR!";
if (d < 40) return "COK YAKIN";
if (d < 60) return "YAKIN";
if (d < 80) return "DIKKAT";
if (d < 100) return "UZAK";
return "SAKIN";
}
// ============ Ekranlar ============
void drawSplash() {
oled.clearDisplay();
oled.setTextColor(SSD1306_WHITE);
centered(10, 2, "BlueGrays");
centered(40, 1, "Park Sensoru v1");
oled.drawRoundRect(2, 2, 124, 60, 6, SSD1306_WHITE);
oled.display();
}
void drawStatus() {
oled.clearDisplay();
oled.setTextColor(SSD1306_WHITE);
// Üst: başlık
lcdAt(0, 0, 1, "> Park Sensoru");
oled.drawLine(0, 10, 127, 10, SSD1306_WHITE);
// Büyük mesafe cm
String d = (distanceCm >= 999) ? "---" : String(distanceCm);
centered(14, 3, d + " cm");
// Durum metni
centered(44, 1, statusText(distanceCm));
oled.drawLine(0, 53, 127, 53, SSD1306_WHITE);
// Alt: LED bar simülasyon (5 dörtgen)
int leds = ledsForDistance(distanceCm);
for (int i = 0; i < 5; i++) {
int x = 10 + i * 22;
if (i < leds) {
oled.fillRect(x, 56, 18, 6, SSD1306_WHITE);
} else {
oled.drawRect(x, 56, 18, 6, SSD1306_WHITE);
}
}
oled.display();
}
// ============ SETUP ============
void setup() {
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
pinMode(BUZZER_PIN, OUTPUT);
digitalWrite(BUZZER_PIN, LOW);
for (int i = 0; i < 5; i++) {
pinMode(LED_PINS[i], OUTPUT);
digitalWrite(LED_PINS[i], LOW);
}
Wire.begin();
if (!oled.begin(SSD1306_SWITCHCAPVCC, OLED_ADDR)) {
while (1);
}
drawSplash();
delay(2500);
}
// ============ LOOP ============
void loop() {
distanceCm = readDistanceCm();
// LED bar güncelle
int leds = ledsForDistance(distanceCm);
for (int i = 0; i < 5; i++) {
digitalWrite(LED_PINS[i], i < leds ? HIGH : LOW);
}
// Buzzer bip yönetimi
int interval = beepIntervalForDistance(distanceCm);
if (interval < 0) {
digitalWrite(BUZZER_PIN, LOW);
beepState = false;
} else if (interval == 0) {
digitalWrite(BUZZER_PIN, HIGH); // Sürekli alarm
} else {
if (millis() - lastBeepMs > interval) {
lastBeepMs = millis();
beepState = !beepState;
digitalWrite(BUZZER_PIN, beepState ? HIGH : LOW);
}
}
// Ekran güncelle (150ms)
static unsigned long lastDraw = 0;
if (millis() - lastDraw > 150) {
lastDraw = millis();
drawStatus();
}
delay(50);
}