#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <AccelStepper.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
AccelStepper stepper;
#define potentiometer A0 //10k Variable Resistor
#define bt_F A1 // Clockwise Button
#define bt_S A2 // Stop Button
#define bt_B A3 // Anticlockwise Button
#define dirPin 8 //8Pin of Arduino--Direction of stepper motor driver
#define stepPin 9 //9Pin of Arduino--Step of stepper motor driver
#define enPin 10 //10Pin of Arduino--Enabled of stepper motor driver
int read_ADC;
long Speed_LCD;
long Speed_Delay;
long Speed;
int Mode = 1, flag = 0;
//-------------------------------------------------------------------------
long myMap(long x, long in_min, long in_max, long out_min, long out_max) {
return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}
//-------------------------------------------------------------------------
void setup() { // put your setup code here, to run once
//Serial.begin(115200);
lcd.init();
lcd.backlight();
lcd.clear();
pinMode(potentiometer, INPUT); // declare potentiometer as input
pinMode(bt_F, INPUT_PULLUP); // declare bt_F as input
pinMode(bt_S, INPUT_PULLUP); // declare bt_S as input
pinMode(bt_B, INPUT_PULLUP); // declare bt_B as input
pinMode(dirPin, OUTPUT); // declare as output for Direction of stepper motor driver
pinMode(stepPin, OUTPUT); // declare as output for Step of stepper motor driver
pinMode(enPin, OUTPUT); // declare as output for Enabled of stepper motor driver
//stepper.setMaxSpeed(600);
lcd.begin(16, 2);
lcd.setCursor(0, 0);
lcd.print("Start Up");
lcd.setCursor(0, 1);
lcd.print("Page");
delay(2000); // Waiting for a while
lcd.clear();
}
//-------------------------------------------------------------------------
void loop() {
static uint32_t lastUI = 0;
if (millis() - lastUI > 100) {
lastUI = millis();
read_ADC = analogRead(potentiometer); // read analogue to digital value 0 to 1023
Speed_Delay = myMap(read_ADC, 0, 1023, 2000, 250); //value map for Microstep resolution Delay
//Speed = myMap(read_ADC, 0, 1023, 2000, 0); //speed
Speed_LCD = myMap(read_ADC, 0, 1023, 0, 100); //value map to Display on the LCD
lcd.setCursor(0, 0);
lcd.print(" Speed: ");
lcd.print(Speed_LCD);
lcd.print("% ");
if (digitalRead (bt_F) == 0) {
Mode = 2; //For Clockwise
digitalWrite(enPin, LOW);
}
if (digitalRead (bt_S) == 0) { //For Stop
if (flag == 0) {
flag = 1;
if (Mode > 1)Mode = 1;
else {
Mode = !Mode;
if (Mode == 0)digitalWrite(enPin, HIGH);
else digitalWrite(enPin, LOW);
}
delay(100);
}
} else {
flag = 0;
}
if (digitalRead (bt_B) == 0) {
Mode = 3; //For Anticlockwise
digitalWrite(enPin, LOW);
}
lcd.setCursor(0, 1);
if (Mode == 0)lcd.print(" Free ");
else if (Mode == 1)lcd.print(" Stop ");
else if (Mode == 2)lcd.print(" Clockwise ");
else if (Mode == 3)lcd.print(" Anticlockwise ");
}
if (Speed_LCD > 0 && Mode > 1) {
if (Mode == 2)digitalWrite(dirPin, LOW); // Stepper motor rotates CW (Clockwise)
else digitalWrite(dirPin, HIGH);// Stepper motor rotates CCW (Anticlockwise)
//Serial.print(read_ADC);
//Serial.print(" = ");
//Serial.println(Speed_Delay);
digitalWrite(stepPin, HIGH);
delayMicroseconds(250);
digitalWrite(stepPin, LOW);
delayMicroseconds(Speed_Delay);
//stepper.setSpeed(Speed);
//stepper.runSpeed();
}
}