#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <AccelStepper.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Define the pins for the stepper motor
#define dirPin 8 // Direction pin
#define stepPin 9 // Step pin
#define enPin 10 // Enable pin
// Buttons and potentiometer
#define potentiometer A0
#define bt_F A1
#define bt_S A2
#define bt_B A3
// Create an instance of AccelStepper
AccelStepper stepper(AccelStepper::DRIVER, stepPin, dirPin);
int read_ADC;
long Speed_LCD;
int Mode = 1; // Motor mode (Stop, CW, CCW)
bool motorEnabled = false;
void setup() {
lcd.init();
lcd.backlight();
lcd.clear();
pinMode(potentiometer, INPUT);
pinMode(bt_F, INPUT_PULLUP);
pinMode(bt_S, INPUT_PULLUP);
pinMode(bt_B, INPUT_PULLUP);
pinMode(enPin, OUTPUT);
digitalWrite(enPin, HIGH); // Disable motor initially
// Initialize LCD
lcd.begin(16, 2);
lcd.setCursor(0, 0);
lcd.print("Start Up");
lcd.setCursor(0, 1);
lcd.print("Page");
delay(2000);
lcd.clear();
// Initialize stepper motor
stepper.setMaxSpeed(2000); // Maximum speed in steps/second
stepper.setAcceleration(1000); // Acceleration in steps/second^2
}
void loop() {
static uint32_t lastUI = 0;
if (millis() - lastUI > 100) {
lastUI = millis();
// Read potentiometer value and map to speed
read_ADC = analogRead(potentiometer);
Speed_LCD = map(read_ADC, 0, 1023, 0, 100);
float targetSpeed = map(read_ADC, 0, 1023, 0, 2000); // Map to max speed
// Update motor mode
if (digitalRead(bt_F) == LOW) {
Mode = 2; // Clockwise
stepper.setSpeed(targetSpeed);
motorEnabled = true;
}
if (digitalRead(bt_B) == LOW) {
Mode = 3; // Anticlockwise
stepper.setSpeed(-targetSpeed);
motorEnabled = true;
}
if (digitalRead(bt_S) == LOW) {
Mode = 1; // Stop
motorEnabled = false;
}
// Update LCD
lcd.setCursor(0, 0);
lcd.print(" Speed: ");
lcd.print(Speed_LCD);
lcd.print("% ");
lcd.setCursor(0, 1);
if (!motorEnabled) {
lcd.print(" Stop ");
} else if (Mode == 2) {
lcd.print(" Clockwise ");
} else if (Mode == 3) {
lcd.print(" Anticlockwise ");
}
// Enable or disable motor
digitalWrite(enPin, motorEnabled ? LOW : HIGH);
}
// Run the motor
if (motorEnabled) {
stepper.runSpeed();
}
}