#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <AccelStepper.h>
#include <Encoder.h>
#define STEP_PIN_1 2
#define DIR_PIN_1 3
#define STEP_PIN_2 4
#define DIR_PIN_2 5
#define POT_PIN A0
#define ENCODER_A 7
#define ENCODER_B 8
#define ENCODER_BUTTON 9
AccelStepper stepper1(AccelStepper::DRIVER, STEP_PIN_1, DIR_PIN_1);
AccelStepper stepper2(AccelStepper::DRIVER, STEP_PIN_2, DIR_PIN_2);
Encoder myEnc(ENCODER_A, ENCODER_B);
LiquidCrystal_I2C lcd(0x27, 16, 2); // Set the LCD I2C address
float encoderValue = 0.10;
float speedMultiplier = 1.0;
void setup() {
pinMode(ENCODER_BUTTON, INPUT_PULLUP);
stepper1.setMaxSpeed(1000);
stepper2.setMaxSpeed(1000);
Serial.begin(9600);
lcd.init();
lcd.backlight();
}
void loop() {
// Read potentiometer value
int potValue = analogRead(POT_PIN);
float speed1 = map(potValue, 0, 1023, 0, 1000);
// Read encoder value
long newPosition = myEnc.read();
encoderValue = (newPosition / 4) * 0.05; // Encoder steps to value in steps of 0.05
if (encoderValue < 0.10) encoderValue = 0.10;
if (encoderValue > 3.00) encoderValue = 3.00;
// Display encoder value on LCD
lcd.setCursor(0, 0);
lcd.print("Value: ");
lcd.print(encoderValue, 2);
// Check encoder button
if (digitalRead(ENCODER_BUTTON) == LOW) {
speedMultiplier = encoderValue;
lcd.setCursor(0, 1);
lcd.print("Selected: ");
lcd.print(speedMultiplier, 2);
}
// Calculate speed for stepper 2
float speed2 = speed1 * speedMultiplier;
// Set speeds for steppers
stepper1.setSpeed(speed1);
stepper1.runSpeed();
stepper2.setSpeed(speed2);
stepper2.runSpeed();
delay(10); // Small delay for debounce
}