// ====================================================================
// KODE SISTEM: LOCKOUT TOTAL + TIMING 2 DETIK + BEEP BUZZER PIN 5
// ====================================================================
const int PIN_STEP = 9; // Hubungkan ke pin STEP di driver A4988
const int PIN_RELAY = 2; // Hubungkan ke Terminal 16 Relay DPDT
const int PIN_TOMBOL = 3; // Hubungkan ke Tombol Pemicu (Push Button)
const int PIN_READ_DIR = 4; // Jalur baca arah (Hubungkan ke pin DIR A4988)
const int PIN_BUZZER = 5; // KABEL BARU: Hubungkan ke kaki Positif (+) Buzzer
// Variabel untuk mengunci aksi. Mulai dari -1 agar tombol bisa ditekan pertama kali.
int statusArahTerakhir = -1;
void setup() {
pinMode(PIN_RELAY, OUTPUT);
pinMode(PIN_BUZZER, OUTPUT); // Mengatur Pin 5 sebagai Output Buzzer
pinMode(PIN_TOMBOL, INPUT_PULLUP); // Tombol menggunakan pull-up internal [cite: 248]
pinMode(PIN_READ_DIR, INPUT); // Pin 4 membaca tegangan arah dari switch [cite: 248]
// Pastikan koil relay aktif konstan agar switch berfungsi meneruskan arus [cite: 248]
digitalWrite(PIN_RELAY, HIGH);
// Kondisi awal: Motor DIAM dan Buzzer MATI
noTone(PIN_STEP);
digitalWrite(PIN_BUZZER, LOW);
}
void loop() {
// 1. Cek apakah tombol di pin 3 ditekan [cite: 248]
if (digitalRead(PIN_TOMBOL) == LOW) {
// 2. Baca kondisi arah fisik saat ini (1 untuk HIGH, 0 untuk LOW) [cite: 248]
int arahSekarang = digitalRead(PIN_READ_DIR);
// 3. JIKA arahnya masih SAMA dengan putaran terakhir, sistem MENOLAK GERAK [cite: 248]
if (arahSekarang == statusArahTerakhir) {
// Tombol diabaikan total, motor dan buzzer tetap diam [cite: 248]
return;
}
// --- LOGIKA UTAMA: JALAN KARENA ARAH SWITCH SUDAH BERUBAH ---
// Simpan arah baru ini ke memori pengunci [cite: 248]
statusArahTerakhir = arahSekarang;
// Menyalakan Buzzer (bunyi konstan) bersamaan dengan menyalanya motor
digitalWrite(PIN_BUZZER, HIGH);
tone(PIN_STEP, 500); // Motor pengganti mulai berputar [cite: 248]
delay(2000); // Berjalan bersama-sama selama tepat 2 detik [cite: 248]
// Otomatis menghentikan motor dan mematikan buzzer setelah 2 detik
noTone(PIN_STEP);
digitalWrite(PIN_BUZZER, LOW);
// Antispam/Debounce: Menunggu sampai tombol dilepas sepenuhnya oleh user [cite: 248]
while (digitalRead(PIN_TOMBOL) == LOW) {
delay(10);
}
}
}BATERAI/PSU
TOMBOL JALANIN HIDROLIK