//use potentiometer 1 to define the number of turns a stepper motor must take (range:1-20)
//use potentiometer 2 to define the speed of the stepper motor (range displayed to user:10-100
//use a screen to display a selection screen for number-of-turns/speed with appropriate labels (i.e. Turns:..... Speed (RPM):.....)
//press a button to execute the turns. While turns are being executed the screen should display a message to user indicating this is happening
//after turns are completed, user should be returned to turn/speed selection screen
#include <AccelStepper.h>
#include <LiquidCrystal_I2C.h>
//Define button connection
#define BUTTON_PIN1 4
//Define stepper motor connections and steps per rev
#define dirPin 8
#define stepPin 9
#define enabPin 10
#define stepsPerRev 200
int mspeed=600; //max motor speed
//Attach pins to servo library
AccelStepper stepper(AccelStepper::DRIVER, stepPin, dirPin);
//Define LCD parameters
#define I2C_ADDR 0x27
#define LCD_COLUMNS 16
#define LCD_LINES 2
//Attach pins to LCD library
LiquidCrystal_I2C lcd(I2C_ADDR, LCD_COLUMNS, LCD_LINES);
//Define 1st potentiometer pin name(*use analog pin)
#define potPin A1
int time_old=0;
int myTime;
int potIn;
int angle;
int speed;
int speed_rpm;
int lcdRf=15;
int pot2In;
int revs;
int steps;
//Define 2nd potentiometer pin name using analog
#define potPin A2
void setup() {
pinMode(BUTTON_PIN1, INPUT);
pinMode(potPin, INPUT);
pinMode(stepPin, OUTPUT);
pinMode(dirPin, OUTPUT);
pinMode(enabPin, OUTPUT);
//Declare "enable" pin as low to turn on the motor(not necessary if the "enable" is disconnected)
digitalWrite(enabPin, LOW);
//Set max speed and current speed for stepper
stepper.setMaxSpeed(mspeed);
stepper.setSpeed(75);
//LCD start sequence
lcd.init(); //turn on LCD
lcd.backlight(); //turn on backlight
delay(500); //wait for screen to start
//print start screen
lcd.setCursor(2,0);
lcd.print("Stepper Speed");
lcd.setCursor(2,1);
lcd.print("Speedometer");
delay(2000); //for the start screen
lcd.clear(); //clear screen
//print the characters that won't change in the main loop
lcd.setCursor(0,0);
lcd.print("Turns:");
lcd.setCursor(0,1);
lcd.print("Speed(RPM):");
//start serial for troubleshooting
Serial.begin(9600);
}
void loop() {
//acquire values
myTime=millis();
potIn=analogRead(A1);
pot2In=analogRead(A2);
//map and redefine values
angle=map(potIn,0,1023,1,20);
speed=map(potIn, 0,1023,0,mspeed);
speed_rpm=speed*6/20; //convert speed to RPM
revs=map(pot2In,0,1023,10,100);
steps=revs*200;
Serial.println();
stepper.setSpeed(speed);
stepper.runSpeed();
//LCD refresh
if((myTime-time_old)>lcdRf){
lcd.setCursor(13,0); //set cursor to only override the part that needs to change
lcd.print(speed_rpm); //print variable
lcd.setCursor(13,1); //set cursor to only override the part that needs to change
lcd.print(speed); //print variable
lcd.print(" "); //erase remaining blocks
time_old=myTime; //save last refresh time in ms
}
//Serial.printIn(speed_rpm); //not needed, here just for testing
}
//check the speed numbers if there are errors