#include <Stepper.h>
// Definisi parameter motor stepper
const int stepsPerRevolution = 200; // Jumlah langkah untuk satu putaran penuh (sesuaikan dengan motor Anda)
// Inisialisasi pin tombol, limit switch, dan LED
const int door_switch_in = 2; // Tombol pertama
const int door_switch_out = 3; // Tombol kedua
const int limit_switch_A = 4; // Limit switch untuk menutup
const int limit_switch_B = 5; // Limit switch untuk membuka
const int LEDGreen1 = 6; // LED Green in
const int LEDRed1 = 7; // LED RED out
const int LEDGreen2 = 12; // LED Green Out
const int LEDRed2 = 13; // LED RED out
// Inisialisasi pin stepper
Stepper myStepper(stepsPerRevolution, 8, 9, 10, 11); // Pin yang terhubung ke motor driver
// Variabel status
bool door_is_open = false; // Status pintu (tertutup = false, terbuka = true)
bool last_button_in_state = HIGH; // Menyimpan status terakhir tombol in
bool last_button_out_state = HIGH; // Menyimpan status terakhir tombol out
void setup() {
// Inisialisasi pin tombol, limit switch, dan LED sebagai input/output
pinMode(door_switch_in, INPUT_PULLUP);
pinMode(door_switch_out, INPUT_PULLUP);
pinMode(limit_switch_A, INPUT_PULLUP);
pinMode(limit_switch_B, INPUT_PULLUP);
pinMode(LEDGreen1, OUTPUT);
pinMode(LEDRed1, OUTPUT);
pinMode(LEDGreen2, OUTPUT);
pinMode(LEDRed2, OUTPUT);
// Konfigurasi awal stepper
myStepper.setSpeed(60); // Kecepatan motor dalam RPM
// Inisialisasi Serial Monitor
Serial.begin(9600);
Serial.println("Motor stepper siap.");
}
void loop() {
// Baca status tombol dan limit switch
int button_in_state = digitalRead(door_switch_in);
int button_out_state = digitalRead(door_switch_out);
int limit_A_state = digitalRead(limit_switch_A);
int limit_B_state = digitalRead(limit_switch_B);
// Kontrol LEDin
if (button_in_state == LOW) {
digitalWrite(LEDGreen1, LOW);
digitalWrite(LEDRed1, HIGH);
} else {
digitalWrite(LEDGreen1, HIGH);
digitalWrite(LEDRed1, LOW);
}
// Kontrol LEDout
if (button_out_state == LOW) {
digitalWrite(LEDGreen2, LOW);
digitalWrite(LEDRed2, HIGH);
} else {
digitalWrite(LEDGreen2, HIGH);
digitalWrite(LEDRed2, LOW);
}
// Deteksi jika tombol in ditekan
if (button_in_state == LOW && last_button_in_state == HIGH) {
toggleDoor(limit_A_state, limit_B_state); // Ubah status pintu
delay(500); // Delay untuk debounce tombol
}
// Deteksi jika tombol out ditekan
if (button_out_state == LOW && last_button_out_state == HIGH) {
toggleDoor(limit_A_state, limit_B_state); // Ubah status pintu
delay(500); // Delay untuk debounce tombol
}
// Perbarui status tombol terakhir
last_button_in_state = button_in_state;
last_button_out_state = button_out_state;
}
// Fungsi untuk mengubah status pintu
void toggleDoor(int limit_A_state, int limit_B_state) {
if (door_is_open) {
Serial.println("Menutup pintu...");
// Menutup hingga limit switch A aktif
while (digitalRead(limit_switch_A) == HIGH) {
myStepper.step(-1); // Gerak motor satu langkah per iterasi
if (digitalRead(limit_switch_A) == LOW) {
Serial.println("Limit switch A aktif, berhenti menutup.");
break; // Hentikan gerakan jika limit switch A aktif
}
}
door_is_open = false; // Tandai pintu sudah tertutup
} else {
Serial.println("Membuka pintu...");
// Membuka hingga limit switch B aktif
while (digitalRead(limit_switch_B) == HIGH) {
myStepper.step(1); // Gerak motor satu langkah per iterasi
if (digitalRead(limit_switch_B) == LOW) {
Serial.println("Limit switch B aktif, berhenti membuka.");
break; // Hentikan gerakan jika limit switch B aktif
}
}
door_is_open = true; // Tandai pintu sudah terbuka
}
}