#include <Wire.h> // Library untuk komunikasi I2C
#include <LiquidCrystal_I2C.h> // Library LCD I2C
#include <Servo.h> // Library Servo
LiquidCrystal_I2C lcd(0x27, 16, 2); // Inisialisasi LCD dengan alamat I2C 0x27
Servo doorServo; // Servo untuk pintu lift
// Pin untuk motor stepper A4988
const int stepPin = 3; // STEP motor stepper
const int dirPin = 2; // Arah putaran motor stepper
const int enablePin = 4;// Mengaktifkan/mematikan motor stepper
const int buzzer = A0; // Buzzer untuk notifikasi
// Tombol lantai
const int button1 = 11;
const int button2 = 12;
const int button3 = 13;
// Tombol manual buka/tutup pintu
const int openDoorButton = 5;
const int closeDoorButton = 6;
// LED indikator lantai
const int led1 = 7;
const int led2 = 8;
const int led3 = 9;
int currentFloor = 1; // Lantai awal lift
bool doorOpen = false; // Status pintu (terbuka/tutup)
// ALFIAN CENTER
// SUBSCRIBE
void setup() {
pinMode(stepPin, OUTPUT);
pinMode(dirPin, OUTPUT);
pinMode(enablePin, OUTPUT);
pinMode(buzzer, OUTPUT);
pinMode(button1, INPUT_PULLUP);
pinMode(button2, INPUT_PULLUP);
pinMode(button3, INPUT_PULLUP);
pinMode(openDoorButton, INPUT_PULLUP);
pinMode(closeDoorButton, INPUT_PULLUP);
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
pinMode(led3, OUTPUT);
lcd.init();
lcd.backlight();
doorServo.attach(10); // *Servo pindah ke pin 10*
digitalWrite(enablePin, LOW); // Aktifkan stepper
closeDoor(); // Tutup pintu di awal
updateLCD(); // Perbarui tampilan LCD
}
// ALFIAN CENTER
// SUBSCRIBE
void loop() {
if (digitalRead(button1) == LOW && currentFloor != 1) {
moveToFloor(1);
}
if (digitalRead(button2) == LOW && currentFloor != 2) {
moveToFloor(2);
}
if (digitalRead(button3) == LOW && currentFloor != 3) {
moveToFloor(3);
}
if (digitalRead(openDoorButton) == LOW) {
openDoor();
}
if (digitalRead(closeDoorButton) == LOW) {
closeDoor();
}
}
// Fungsi untuk memindahkan lift ke lantai tujuan
void moveToFloor(int targetFloor) {
int stepCount = abs(targetFloor - currentFloor) * 2000;
digitalWrite(dirPin, targetFloor > currentFloor ? HIGH : LOW);
for (int i = 0; i < stepCount; i++) {
digitalWrite(stepPin, HIGH);
delayMicroseconds(800);
digitalWrite(stepPin, LOW);
delayMicroseconds(800);
}
currentFloor = targetFloor;
updateLEDs();
updateLCD();
buzzNotification();
openDoor();
delay(5000);
closeDoor();
}
// Fungsi untuk memperbarui LED lantai
void updateLEDs() {
digitalWrite(led1, currentFloor == 1 ? HIGH : LOW);
digitalWrite(led2, currentFloor == 2 ? HIGH : LOW);
digitalWrite(led3, currentFloor == 3 ? HIGH : LOW);
}
// Fungsi untuk memperbarui LCD
void updateLCD() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Lantai: ");
lcd.print(currentFloor);
lcd.setCursor(0, 1);
lcd.print(doorOpen ? "Pintu: Terbuka" : "Pintu: Tertutup");
}
// Fungsi untuk bunyi buzzer saat lift tiba
void buzzNotification() {
tone(buzzer, 1000, 500);
}
// Fungsi untuk membuka pintu lift
void openDoor() {
doorServo.write(90); // *Buka pintu*
doorOpen = true;
updateLCD();
}
// Fungsi untuk menutup pintu lift
void closeDoor() {
doorServo.write(0); // *Tutup pintu*
doorOpen = false;
updateLCD();
}