#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Keypad.h>

#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define SDA_PIN 20
#define SCL_PIN 21
#define OLED_RESET -1

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

const int triggerPins[] = {2, 3, 4, 5};
const int echoPins[] = {6, 7, 8, 9};
const int sensorCount = 4;
const int thresholdDistance = 100;
const int ledCount = 10;
const int ledPins[] = {22, 23, 24, 25, 26, 27, 28, 29, 30, 31};
const int buzzerPin = 32;
const int buzzerThresholdDistance = 50;

const byte ROWS = 4;
const byte COLS = 3;

char keys[ROWS][COLS] = {
  {'1', '2', '3'},
  {'4', '5', '6'},
  {'7', '8', '9'},
  {'*', '0', '#'}
};
byte rowPins[ROWS] = {34, 35, 36, 37};
byte colPins[COLS] = {38, 39, 40};

Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);

const char correctPass[] = "3510";

bool systemActive = false;

void setup() {
  Serial.begin(9600);
  Wire.begin();

  if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
    Serial.println(F("SSD1306 başlatılamadı!"));
    for (;;);
  }

  display.clearDisplay();
  display.setTextSize(1);
  display.setTextColor(SSD1306_WHITE);
  display.setCursor(0, 0);
  display.println("Lutfen sifre girin ardindan # ye basin:");
  display.display();

  pinMode(buzzerPin, OUTPUT);
}

void loop() {
  char key = keypad.getKey();
  if (key) {
    checkPassword(key);
  }

  if (systemActive) {
    for (int i = 0; i < sensorCount; i++) {
      int distance = getDistance(i);

      display.setCursor(0, i * 10);
      display.print("Sensor");
      display.print(i + 1);
      display.print(":");
      display.print(distance);
      display.println("cm");

      updateLEDBar(distance);
      updateBuzzer(distance);
      determineDirection(i, distance);
    }

    display.display();
    delay(1000);
    display.clearDisplay();
  }
}

int getDistance(int index) {
  pinMode(triggerPins[index], OUTPUT);
  digitalWrite(triggerPins[index], LOW);
  delayMicroseconds(2);
  digitalWrite(triggerPins[index], HIGH);
  delayMicroseconds(10);
  digitalWrite(triggerPins[index], LOW);

  pinMode(echoPins[index], INPUT);
  long duration = pulseIn(echoPins[index], HIGH);

  return duration * 0.034 / 2;
}

void updateLEDBar(int distance) {
  int ledCountToShow = map(distance, 0, thresholdDistance, 0, ledCount);
  for (int i = 0; i < ledCount; i++) {
    if (i < ledCountToShow) {
      analogWrite(ledPins[i], 255);
    } else {
      analogWrite(ledPins[i], 0);
    }
    delay(10);
  }
}

void determineDirection(int index, int distance) {
  display.setCursor(80, index * 10);
  if (index == 0) {
    display.print(" SagOn");
  } else if (index == 1) {
    display.print(" SolOn");
  } else if (index == 2) {
    display.print(" SagArka");
  } else if (index == 3) {
    display.print(" SolArka");
  }
}

void updateBuzzer(int distance) {
  if (distance < buzzerThresholdDistance) {
    int buzzerFrequency = map(distance, 0, buzzerThresholdDistance, 1000, 2000);
    tone(buzzerPin, buzzerFrequency);
  } else {
    noTone(buzzerPin);
  }
}

void checkPassword(char key) {
  static char enteredPass[5] = "";
  static byte index = 0;

  if (key == '#') {
    enteredPass[index] = '\0';
    if (strcmp(enteredPass, correctPass) == 0) {
      systemActive = true;
      display.clearDisplay();
      display.setCursor(0, 0);
      display.println("Sistem Aktif");
      display.display();
      delay(2000);
      display.clearDisplay();
    } else {
      display.clearDisplay();
      display.setCursor(0, 0);
      display.println("Hatali Sifre!");
      display.display();
      delay(2000);
      display.clearDisplay();
      display.setCursor(0, 0);
      display.println("Lutfen sifre girin:");
      display.display();
    }
    memset(enteredPass, 0, sizeof(enteredPass));
    index = 0;
  } else if (index < 4) {
    enteredPass[index++] = key;
  }
}
$abcdeabcde151015202530354045505560fghijfghij