#include <AccelStepper.h>
#include <LiquidCrystal_I2C.h>
// Define pins
#define STEP_PIN 8
#define DIR_PIN 9
#define FORWARD_BTN 6
#define BACKWARD_BTN 7
#define RESET_BTN 10
#define FORWARD_LED 4
#define BACKWARD_LED 5
#define RESET_LED 3
// Motor parameters
const float MAX_SPEED = 800.0;
const float ACCELERATION = 400.0;
// Create instances
AccelStepper stepper(1, STEP_PIN, DIR_PIN);
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Variables
bool lastForwardState = HIGH;
bool lastBackwardState = HIGH;
void setup() {
// Initialize stepper
stepper.setMaxSpeed(MAX_SPEED);
stepper.setAcceleration(ACCELERATION);
// Initialize LCD
lcd.init();
lcd.backlight();
// Setup pins
pinMode(FORWARD_BTN, INPUT_PULLUP);
pinMode(BACKWARD_BTN, INPUT_PULLUP);
pinMode(RESET_BTN, INPUT_PULLUP);
pinMode(FORWARD_LED, OUTPUT);
pinMode(BACKWARD_LED, OUTPUT);
pinMode(RESET_LED, OUTPUT);
// Initial display
updateDisplay();
}
void loop() {
// Read buttons
bool currentForwardState = digitalRead(FORWARD_BTN);
bool currentBackwardState = digitalRead(BACKWARD_BTN);
bool resetState = digitalRead(RESET_BTN);
// Handle reset
if (resetState == LOW) {
resetMotor();
delay(200); // Simple debounce
return;
}
// Handle forward movement
if (currentForwardState == LOW) {
digitalWrite(FORWARD_LED, HIGH);
digitalWrite(BACKWARD_LED, LOW);
moveForward();
updateDisplay();
}
// Handle backward movement
else if (currentBackwardState == LOW) {
digitalWrite(FORWARD_LED, LOW);
digitalWrite(BACKWARD_LED, HIGH);
moveBackward();
updateDisplay();
}
// Handle stop
else {
if (lastForwardState == LOW || lastBackwardState == LOW) {
digitalWrite(FORWARD_LED, LOW);
digitalWrite(BACKWARD_LED, LOW);
updateDisplay();
}
stepper.stop();
}
// Update button states
lastForwardState = currentForwardState;
lastBackwardState = currentBackwardState;
}
void moveForward() {
stepper.setSpeed(MAX_SPEED);
stepper.runSpeed();
}
void moveBackward() {
stepper.setSpeed(-MAX_SPEED);
stepper.runSpeed();
}
void resetMotor() {
// Visual indication
digitalWrite(RESET_LED, HIGH);
// Stop the motor
stepper.stop();
// Reset position to zero
stepper.setCurrentPosition(0);
// Display reset message
lcd.clear();
lcd.print("Reset");
delay(500);
// Turn off reset LED
digitalWrite(RESET_LED, LOW);
// Update display
updateDisplay();
}
void updateDisplay() {
lcd.clear();
// Display position from stepper
lcd.setCursor(0, 0);
lcd.print("Pos: ");
lcd.print(stepper.currentPosition());
// Display blank second line
lcd.setCursor(0, 1);
lcd.print("Steps: ");
lcd.print(abs(stepper.currentPosition()));
}