Lathe Leadscrew Arduino Code
Lathe Leadscrew Arduino Code
//button variables
const int n = 2;
const int buttonPin[n] = {3,4};
int buttonState[n] = {LOW,LOW};
int lastButtonState[n]= {LOW,LOW};
bool buttonFlags[n] = {LOW, LOW};
//screen variables
const int x = 2;
int currentX = 0;
int currentY = 0;
String screens[x][5] = {{"TPI","Dir","LatheRPM ","ServoRPM","tpi/mm"},
{"Pitch","Dir","LatheRPM","ServoRPM","tpi/mm"}};
//lathe parameters
float servoRPM = 0.00;
//int direction = 1;
// =========================== setup ========================================
void setup()
{
lcd.init();
lcd.backlight();
lcd.begin(20,4);
Serial.begin(9600);
for(int i=0; i < n; i++)
{
pinMode(buttonPin[i], INPUT);
//Serial.print("Button: ");
//Serial.println(buttonPin[i]);
}
pinMode(SensorPin, INPUT);
endTime = 0;
printScreen();
// stepper stuff
stepper.setEnablePin(8);
stepper.disableOutputs();
stepper.setMaxSpeed(2502);
stepper.setAcceleration(300);
}
// =========================== main loop ====================================
void loop()
{
setButtonFlags();
resolveButtonFlags();
sendData();
speedSensor();
if (digitalRead(leftPin) == HIGH)
{
//direction = 1;
lcd.setCursor(4,1);
lcd.print("CW ");
lcd.setCursor(9,3);
lcd.println(servoRPM);
lcd.rightToLeft();
lcd.print(" ");
lcd.leftToRight();
lcd.setCursor(9,2);
lcd.println(lcdRPM);
lcd.rightToLeft();
lcd.print(" ");
lcd.leftToRight();
delay(5);
stepper.enableOutputs();
stepper.setSpeed(stepperRPM);
stepper.run();
while(stepper.isRunning())
{
speedSensor();
stepper.setSpeed(stepperRPM);
stepper.run();
if(digitalRead(leftPin)==LOW)
{
stepper.disableOutputs();
lcd.setCursor(4,1);
lcd.print("OFF");
break;
}
}
}
else if (digitalRead(rightPin) == HIGH)
{
//direction = -1.00;
lcd.setCursor(4,1);
lcd.print("CCW");
lcd.setCursor(9,3);
lcd.println(servoRPM);
lcd.rightToLeft();
lcd.print(" ");
lcd.leftToRight();
lcd.setCursor(9,2);
lcd.println(lcdRPM);
lcd.rightToLeft();
lcd.print(" ");
lcd.leftToRight();
delay(5);
stepper.enableOutputs();
stepper.setSpeed(-stepperRPM);
stepper.run();
while(stepper.isRunning())
{
speedSensor();
stepper.setSpeed(-1*stepperRPM);
stepper.run();
if(digitalRead(rightPin)==LOW)
{
stepper.disableOutputs();
lcd.setCursor(4,1);
lcd.print("OFF");
break;
}
}
}
}
// =========================== set input flags ===========================
void setButtonFlags()
{
for(int i=0; i < n; i++)
{
buttonState[i] = digitalRead(buttonPin[i]);
delay[1];
if(buttonState[i] != lastButtonState[i])
{
if(buttonState[i] == HIGH)
{
//Serial.print("Button: ");
//Serial.println(buttonPin[i]);
buttonFlags[i] = HIGH;
}
}
lastButtonState[i] = buttonState[i];
}
}
// =========================== resolve button flags =========================
void resolveButtonFlags()
{
for(int i = 0; i < n; i++)
{
if(buttonFlags[i] == HIGH)
{
buttonAction(i);
buttonFlags[i] = LOW;
printScreen();
}
}
}
// =========================== button action ===============================
void buttonAction(int button)
{
if (button == 0)
{
if (currentX == x-1)
{
currentX = 0;
}
else
{
currentX++;
}
}
if (button == 1)
{
if (currentX == 0)
{
if(currentTPI == nTPI-1)
{
currentTPI = 0;
}
else
{
currentTPI++;
}
}
else if (currentX == 1)
{
if(currentPitch == nPitch-1)
{
currentPitch = 0;
}
else
{
currentPitch++;
}
}
}
}
// =========================== print screen ===========================
void printScreen()
{
lcd.clear();
lcd.print(screens[currentX][0]);
lcd.setCursor(0,1);
lcd.print(screens[currentX][1]);
lcd.setCursor(0,2);
lcd.print(screens[currentX][2]);
lcd.setCursor(0,3);
lcd.print(screens[currentX][3]);
lcd.setCursor(14,0);
lcd.print(screens[currentX][4]);
if(currentX == 0)
{
lcd.setCursor(4,0);
lcd.println(tpi[currentTPI]);
lcd.rightToLeft();
lcd.print(" ");
lcd.leftToRight();
lcd.setCursor(4,1);
lcd.print("OFF");
}
else if (currentX == 1)
{
lcd.setCursor(6,0);
lcd.println(pitch[currentPitch]);
lcd.rightToLeft();
lcd.print(" ");
lcd.leftToRight();
lcd.setCursor(4,1);
lcd.print("OFF");
}
}
// =========================== Speed Sensor loop ===========================
void speedSensor()
{
time = millis();
int currentSensorState = digitalRead(SensorPin);
if (currentSensorState != lastSensorState)
{
lastDebounceTime = millis();
}