#include <Keypad.h>
#include <AccelStepper.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
const uint8_t ROWS = 4;
const uint8_t COLS = 4;
char keys[ROWS][COLS] = {
{ '0', '1', '2', '3'},
{ '4', '5', '6', '7'},
{ '8', '9', 'A', 'B'},
{ 'C', 'D', 'E', 'F'}
};
uint8_t rowPins[ROWS] = {9, 8, 7, 6};
uint8_t colPins[COLS] = {5, 4, 3, 2};
uint8_t rowPins1[ROWS] = {10, 11, 12, 13};
uint8_t colPins1[COLS] = {14, 15, 16, 17};
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
Keypad keypad1 = Keypad(makeKeymap(keys), rowPins1, colPins1, ROWS, COLS);
int kat[16] = {0}; // Active floors
int Asansor[16] = {0}; // Requested floors
int MevcutKat = 0; // Current floor
bool isMoving = false; // Elevator moving status
bool doorIsOpen = false; // Door open status
int direction = 1; // 0 = duruyor, 1 = yukarı, -1 = aşağı
#define MOTOR1_STEP_PIN 22
#define MOTOR1_DIR_PIN 23
#define MOTOR2_STEP_PIN 18
#define MOTOR2_DIR_PIN 19
#define LDR_PIN A0
AccelStepper motor1(AccelStepper::DRIVER, MOTOR1_STEP_PIN, MOTOR1_DIR_PIN);
AccelStepper motor2(AccelStepper::DRIVER, MOTOR2_STEP_PIN, MOTOR2_DIR_PIN);
LiquidCrystal_I2C lcd(0x27, 20, 4);
int targetPosition = 0;
int targetFloor = -1;
int LdrSensorDegeri = 0;
int kapiKapali = 1; // Minimum sensor value
int kapiAcik = 1010; // Maximum sensor value
unsigned long doorOpenTime = 0; // Time the door was opened
const long doorOpenDelay = 3000; // Time to wait before closing the door
// Function prototypes
int getIndexFromKey(char key);
int getNextFloorToMove();
void moveToFloor(int targetFloor);
void handleDoor();
void displayActiveFloors();
void openDoorIfSameFloor(int targetFloor);
void goToActiveFloors();
void closeDoor();
void openDoor();
void setup() {
Serial.begin(9600);
motor1.setMaxSpeed(1000);
motor1.setAcceleration(500);
motor2.setMaxSpeed(1000);
motor2.setAcceleration(500);
pinMode(LDR_PIN, INPUT);
lcd.init();
lcd.backlight();
}
void loop() {
char key = keypad.getKey();
char key1 = keypad1.getKey();
int index = -1;
if (isMoving) {
motor2.run();
if (!motor2.isRunning()) {
MevcutKat = targetFloor;
kat[targetFloor] = 0;
Asansor[targetFloor] = 0;
openDoor();
isMoving = false;
}
}
if (key) {
index = getIndexFromKey(key);
if (index != -1) {
kat[index] = 1; // Mark this floor as active
}
}
if (key1) {
index = getIndexFromKey(key1);
if (index != -1) {
if (index == MevcutKat) {
openDoorIfSameFloor(index); // Open door if on the same floor
} else {
Asansor[index] = 1; // Request this floor
}
}
}
// Manage door operation
handleDoor();
// Move elevator only if not moving and door is closed
if (!isMoving && !doorIsOpen) {
targetFloor = getNextFloorToMove();
if (targetFloor != -1) {
moveToFloor(targetFloor);
}
}
// motor1.run(); // Run door motor
motor2.run(); // Run elevator motor
displayActiveFloors();
}
// Convert key press to index
int getIndexFromKey(char key) {
if (key >= '0' && key <= '9') {
return key - '0';
} else if (key >= 'A' && key <= 'F') {
return key - 'A' + 10;
}
return -1;
}
// Get the next floor to move to
int getNextFloorToMove() {
// Yukarı yönlü kontrol
if (direction == 1) {
for (int i = MevcutKat + 1; i < 16; i++) {
if (kat[i] == 1 || Asansor[i] == 1) {
lcd.setCursor(14, 2);
lcd.print("Yukari");
return i;
}
}
direction = -1; // Yön değiştir
}
// Aşağı yönlü kontrol
if (direction == -1) {
for (int i = MevcutKat - 1; i >= 0; i--) {
if (kat[i] == 1 || Asansor[i] == 1) {
lcd.setCursor(14, 2);
lcd.print("Asagi");
return i;
}
}
direction = 1; // Yön değiştir
}
return -1; // Hiçbir istek yok
}
// Display active floors on LCD
void displayActiveFloors() {
lcd.setCursor(0, 0);
lcd.print("Aktif Katlar:");
lcd.setCursor(0, 1);
for (int i = 0; i < 16; i++) {
lcd.print(kat[i] || Asansor[i] ? "1" : "0");
}
}
// Open door if on the same floor
void openDoorIfSameFloor(int targetFloor) {
if (targetFloor == MevcutKat && !doorIsOpen) {
openDoor();
}
}
// Handle door operation based on LDR
void handleDoor() {
LdrSensorDegeri = analogRead(LDR_PIN);
LdrSensorDegeri = constrain(LdrSensorDegeri, kapiKapali, kapiAcik);
if (doorIsOpen) {
if (LdrSensorDegeri <= 50) { // No obstacle
if (millis() - doorOpenTime >= doorOpenDelay) {
closeDoor();
}
} else {
doorOpenTime = millis(); // Reset timer if obstacle detected
}
} else {
if (LdrSensorDegeri > 100) { // Obstacle detected, open door
openDoor();
}
}
}
// Open the door
void openDoor() {
doorIsOpen = true;
motor1.moveTo(0); // Open door
motor1.runToPosition();
doorOpenTime = millis(); // Start timer
lcd.setCursor(0, 3);
lcd.print("Kapi Aciliyor:");
}
// Close the door
void closeDoor() {
if (doorIsOpen) {
doorIsOpen = false;
motor1.moveTo(200); // Close door
motor1.runToPosition();
lcd.setCursor(0, 3);
lcd.print("Kapi Kapaniyor:");
}
}
// Move to the target floor
void moveToFloor(int hedefKat) {
if (!isMoving) {
isMoving = true;
closeDoor();
lcd.setCursor(0, 2);
lcd.print(" ");
lcd.setCursor(14, 2);
if (hedefKat > MevcutKat) {
direction = 1;
lcd.print("Yukari");
} else if (hedefKat < MevcutKat) {
direction = -1;
lcd.print("Asagi ");
}
delay(500);
lcd.setCursor(0, 2);
lcd.print("Kat no: ");
lcd.print(hedefKat);
int stepsPerFloor = 200;
int mesafe = (hedefKat - MevcutKat) * stepsPerFloor;
targetPosition = motor2.currentPosition() + mesafe;
targetFloor = hedefKat;
motor2.moveTo(targetPosition);
}
}