#include <AccelStepper.h>
#include <Toggle.h>
#define dirPin 8
#define stepPin 9
// Define button pins
#define buttonPinUP 2
#define buttonPinDOWN 3
AccelStepper stepper(AccelStepper::DRIVER, stepPin, dirPin);
Toggle buttonUp, buttonDown;
enum {STOPPED, GOING_UP, GOING_DOWN, SLOWING} state = STOPPED;
const float maxSpeed = 400;
const float acceleration = 25;
const long veryFar = 1000000;
const long slowingRampFactor = 2; // x speed steps to slow down
void manageButtons() {
switch (state) {
case STOPPED:
buttonUp.poll();
if (buttonUp.onPress()) {
Serial.println("Going Up");
stepper.move(veryFar);
state = GOING_UP;
} else {
buttonDown.poll();
if (buttonDown.onPress()) {
Serial.println("Going Down");
stepper.move(-veryFar);
state = GOING_DOWN;
}
}
break;
case GOING_UP:
buttonUp.poll();
if (buttonUp.onRelease()) {
long stepsToSlowDown = slowingRampFactor * stepper.speed();
Serial.println("Up and Slowing down");
stepper.move(stepsToSlowDown);
state = SLOWING;
}
break;
case GOING_DOWN:
buttonDown.poll();
if (buttonDown.onRelease()) {
long stepsToSlowDown = slowingRampFactor * stepper.speed();
Serial.println("Down and Slowing down");
stepper.move(stepsToSlowDown);
state = SLOWING;
}
break;
case SLOWING:
if (stepper.distanceToGo() == 0) {
stepper.setCurrentPosition(0);
state = STOPPED;
break;
}
}
}
void setup() {
Serial.begin(115200);
stepper.setMaxSpeed(maxSpeed);
stepper.setAcceleration(acceleration);
stepper.setCurrentPosition(0);
buttonUp.begin(buttonPinUP);
buttonDown.begin(buttonPinDOWN);
Serial.println("Ready");
}
void loop() {
manageButtons();
stepper.run();
}