// ===== PIN A4988 =====
#define STEP_PIN 25
#define DIR_PIN 26
#define EN_PIN 27 // aktif LOW
// ===== PIN TOMBOL (6) =====
int btnPins[6] = {12, 13, 14, 15, 16, 17};
// ===== TARGET POSISI (ANALOGI JAM) =====
long targets[6] = {
0, // Jam 12 (0°)
33, // Jam 2 (60°)
67, // Jam 4 (120°)
100, // Jam 6 (180°)
133, // Jam 8 (240°)
167 // Jam 10 (300°)
};
// ===== STATUS POSISI =====
long currentPosition = 0;
long targetPosition = 0;
bool lastBtnState[6] = {HIGH, HIGH, HIGH, HIGH, HIGH, HIGH};
const int stepDelay = 600; // µs
void setup() {
Serial.begin(115200);
pinMode(STEP_PIN, OUTPUT);
pinMode(DIR_PIN, OUTPUT);
pinMode(EN_PIN, OUTPUT);
for (int i = 0; i < 6; i++) {
pinMode(btnPins[i], INPUT_PULLUP);
}
digitalWrite(EN_PIN, LOW); // enable A4988
Serial.println("READY - 6 BUTTON CLOCK MODE");
}
void loop() {
readButtons();
moveStepper();
}
// ===== DETEKSI TEKAN TOMBOL (EDGE) =====
void readButtons() {
for (int i = 0; i < 6; i++) {
bool state = digitalRead(btnPins[i]);
// HIGH → LOW = tombol ditekan
if (lastBtnState[i] == HIGH && state == LOW) {
targetPosition = targets[i];
Serial.print("BTN ");
Serial.print(i + 1);
Serial.print(" | Target step: ");
Serial.println(targetPosition);
}
lastBtnState[i] = state;
}
}
// ===== GERAK STEPPER =====
void moveStepper() {
if (currentPosition == targetPosition) return;
if (currentPosition < targetPosition) {
digitalWrite(DIR_PIN, HIGH); // CW
stepOnce();
currentPosition++;
} else {
digitalWrite(DIR_PIN, LOW); // CCW
stepOnce();
currentPosition--;
}
}
// ===== SATU STEP =====
void stepOnce() {
digitalWrite(STEP_PIN, HIGH);
delayMicroseconds(stepDelay);
digitalWrite(STEP_PIN, LOW);
delayMicroseconds(stepDelay);
}