#include <AccelStepper.h>
// Definisi pin
#define START_BUTTON A1
#define RESET_BUTTON A2
#define POTENSIO_A A0
#define POTENSIO_B A3
#define MOTOR1_STEP 12
#define MOTOR1_DIR 11
#define MOTOR2_STEP 9
#define MOTOR2_DIR 8
#define BUZZER_PIN 7
#define RELAY_PIN 10
// Konstanta motor
#define STEPS_PER_REV 200 // Step per 1 putaran penuh
#define DEGREE_TO_STEP (STEPS_PER_REV / 360.0) // Konversi derajat ke step
// Inisialisasi motor stepper
AccelStepper motorA(1, MOTOR1_STEP, MOTOR1_DIR);
AccelStepper motorB(1, MOTOR2_STEP, MOTOR2_DIR);
bool running = false; // Status program
void setup() {
pinMode(START_BUTTON, INPUT_PULLUP);
pinMode(RESET_BUTTON, INPUT_PULLUP);
pinMode(BUZZER_PIN, OUTPUT);
pinMode(RELAY_PIN, OUTPUT);
// Inisialisasi motor
motorA.setMaxSpeed(500);
motorA.setAcceleration(200);
motorB.setMaxSpeed(500);
motorB.setAcceleration(200);
// Matikan buzzer & relay
digitalWrite(BUZZER_PIN, LOW);
digitalWrite(RELAY_PIN, LOW); // Pastikan relay OFF saat awal
}
void loop() {
// Cek tombol start
if (digitalRead(START_BUTTON) == LOW && !running) {
running = true;
digitalWrite(RELAY_PIN, HIGH); // Nyalakan relay saat tombol start ditekan
delay(1000); // Tunggu 1000ms sebelum menjalankan motor
jalankanSiklus();
}
// Cek tombol reset
if (digitalRead(RESET_BUTTON) == LOW) {
resetMotor();
}
// Jika tidak sedang menjalankan siklus otomatis, kontrol manual dengan potensiometer
if (!running) {
kontrolPotensiometer();
}
}
void jalankanSiklus() {
// Urutan gerakan motor sesuai logika
gerakMotor(22.5, 200);
gerakMotor(45, 400);
gerakMotor(67.5, 400);
gerakMotor(90, 400);
gerakMotor(112.5, 400);
gerakMotor(135, 400);
gerakMotor(157.5, 400);
gerakMotor(180, 400);
gerakMotor(202.5, 400);
gerakMotor(225, 400);
gerakMotor(247.5, 400);
gerakMotor(270, 400);
gerakMotor(292.5, 400);
gerakMotor(315, 400);
gerakMotor(337.5, 400);
gerakMotor(360, 200);
// Matikan relay setelah siklus selesai
digitalWrite(RELAY_PIN, LOW);
// Bunyi buzzer sebagai tanda selesai
bunyiBuzzer();
running = false;
}
void gerakMotor(float derajatA, int stepB) {
motorA.move(derajatA * DEGREE_TO_STEP);
motorB.move(stepB);
while (motorA.distanceToGo() != 0 || motorB.distanceToGo() != 0) {
motorA.run();
motorB.run();
}
}
void bunyiBuzzer() {
for (int i = 0; i < 3; i++) {
digitalWrite(BUZZER_PIN, HIGH);
delay(200);
digitalWrite(BUZZER_PIN, LOW);
delay(200);
}
}
void resetMotor() {
motorA.stop();
motorB.stop();
motorA.setCurrentPosition(0);
motorB.setCurrentPosition(0);
digitalWrite(BUZZER_PIN, LOW);
digitalWrite(RELAY_PIN, LOW);
running = false;
}
void kontrolPotensiometer() {
int potValueA = analogRead(POTENSIO_A);
int potValueB = analogRead(POTENSIO_B);
// Konversi nilai potensiometer ke kecepatan motor (-500 s/d 500)
int speedA = map(potValueA, 0, 1023, -500, 500);
int speedB = map(potValueB, 0, 1023, -500, 500);
// Set kecepatan dan arah motor
motorA.setSpeed(speedA);
motorB.setSpeed(speedB);
// Jalankan motor dalam mode real-time
motorA.runSpeed();
motorB.runSpeed();
}