// ALFIAN CENTER
// SUBSCRIBE
#include <Servo.h> // Library untuk mengontrol motor servo
// --- Stepper Motor ---
#define STEP_PIN 2 // Pin untuk sinyal STEP ke motor stepper
#define DIR_PIN 3 // Pin untuk arah gerak motor stepper
#define ENABLE_PIN 4 // Pin untuk mengaktifkan driver motor stepper
// --- Servo Pintu ---
#define SERVO_PIN 9 // Pin yang digunakan untuk motor servo pintu
Servo pintu; // Membuat objek servo dengan nama 'pintu'
// --- Tombol ---
#define BTN_NAIK 5 // Pin untuk tombol naik lantai
#define BTN_TURUN 6 // Pin untuk tombol turun lantai
#define BTN_BUKA 7 // Pin untuk tombol buka pintu
#define BTN_TUTUP 8 // Pin untuk tombol tutup pintu
// ALFIAN CENTER
// SUBSCRIBE
// --- Variabel Umum ---
int currentFloor = 1; // Menyimpan posisi lantai saat ini (1 = bawah)// ALFIAN CENTER // SUBSCRIBE
const int stepsPerFloor = 2000; // Jumlah langkah motor stepper untuk berpindah 1 lantai
int delayStep = 800; // Delay antar langkah motor stepper dalam mikrodetik
// ALFIAN CENTER
// SUBSCRIBE
void setup() {
pinMode(STEP_PIN, OUTPUT); // Set pin STEP sebagai output
pinMode(DIR_PIN, OUTPUT); // Set pin arah sebagai output
pinMode(ENABLE_PIN, OUTPUT); // Set pin ENABLE sebagai output
digitalWrite(ENABLE_PIN, LOW); // Aktifkan driver stepper (LOW = aktif untuk sebagian besar driver)
pinMode(BTN_NAIK, INPUT_PULLUP); // Konfigurasi tombol naik dengan pull-up
pinMode(BTN_TURUN, INPUT_PULLUP); // Konfigurasi tombol turun dengan pull-up
pinMode(BTN_BUKA, INPUT_PULLUP); // Konfigurasi tombol buka pintu dengan pull-up
pinMode(BTN_TUTUP, INPUT_PULLUP); // Konfigurasi tombol tutup pintu dengan pull-up
pintu.attach(SERVO_PIN); // Hubungkan servo ke pin yang ditentukan
closeDoor(); // Tutup pintu saat awal program
}
// ALFIAN CENTER
// SUBSCRIBE
void loop() {
if (digitalRead(BTN_BUKA) == LOW) { // Jika tombol buka ditekan
openDoor(); // Buka pintu
delay(500); // Delay untuk debounce
}
if (digitalRead(BTN_TUTUP) == LOW) { // Jika tombol tutup ditekan
closeDoor(); // Tutup pintu
delay(500); // Delay untuk debounce
}
if (digitalRead(BTN_NAIK) == LOW && currentFloor == 1) { // Jika tombol naik ditekan dan posisi di lantai 1
moveToFloor(2); // Pindah ke lantai 2
}
if (digitalRead(BTN_TURUN) == LOW && currentFloor == 2) { // Jika tombol turun ditekan dan posisi di lantai 2
moveToFloor(1); // Pindah ke lantai 1
}
}
// --- Fungsi Pindah Lantai ---
void moveToFloor(int targetFloor) {
int floorDifference = targetFloor - currentFloor; // Hitung selisih lantai
int stepCount = abs(floorDifference) * stepsPerFloor; // Hitung jumlah step yang dibutuhkan
digitalWrite(DIR_PIN, floorDifference > 0 ? HIGH : LOW); // Tentukan arah gerakan stepper (HIGH = naik)
closeDoor(); // Tutup pintu sebelum lift bergerak
delay(500); // Tunggu sebentar setelah pintu tertutup
for (int i = 0; i < stepCount; i++) { // Loop sebanyak step yang dibutuhkan
digitalWrite(STEP_PIN, HIGH); // Kirim sinyal HIGH ke stepper
delayMicroseconds(delayStep); // Delay mikrodetik antar sinyal
digitalWrite(STEP_PIN, LOW); // Kirim sinyal LOW ke stepper
delayMicroseconds(delayStep); // Delay mikrodetik antar sinyal
}
currentFloor = targetFloor; // Perbarui posisi lantai saat ini
openDoor(); // Buka pintu setelah sampai di lantai tujuan
delay(5000); // Tunggu 5 detik agar penumpang bisa keluar/masuk
closeDoor(); // Tutup kembali pintu
}
// --- Fungsi Pintu ---
void openDoor() {
pintu.write(90); // Gerakkan servo ke sudut 90 derajat (buka pintu)
}
void closeDoor() {
pintu.write(0); // Gerakkan servo ke sudut 0 derajat (tutup pintu)
}
@AlfianCenter