// Forum: https://forum.arduino.cc/t/using-accelstepper-to-execute-premade-set-of-movements/1248919
// Sketch by r3dex3
// At this moment, this is the sketch of post #10 from the forum.
// This Wokwi project: https://wokwi.com/projects/395587471345920001
// 

#include <AccelStepper.h>

AccelStepper StepperR(AccelStepper::DRIVER, 9, 6);
AccelStepper StepperL(AccelStepper::DRIVER, 3, 2);

const int halfTime = 10000;
const int fTime = 10000;
const int bTime = 10000;
const int rTime = 10000;
const int lTime = 10000;

int currentAction = 0;
unsigned long startTime;
bool actionComplete = false;
unsigned long lastPrintTime = 0;
const unsigned long printInterval = 1000;

const int numberOfMoveTos = 7;
int test[numberOfMoveTos] = {1,1,1,1,1,1,1};

int stepsPerRev = 400;
float revPerSq = (50/2*PI*3.81);

void setup() {

  Serial.begin(115200);

  StepperR.setMaxSpeed(200);
  StepperL.setMaxSpeed(200);

  StepperR.setAcceleration(10);
  StepperL.setAcceleration(10);

  startTime = millis();
  lastPrintTime = millis();

  pinMode(13, OUTPUT);
}

void loop() {
  unsigned long currentTime = millis();
  unsigned long elapsedTime = currentTime - startTime;

  switch (test[currentAction]) 
  {  
    case 1:
      {
        if (!actionComplete) 
        {
          startTime = millis();
          long desiredPositionR = (StepperR.currentPosition() + (stepsPerRev*revPerSq));
          long desiredPositionL = (StepperL.currentPosition() - (stepsPerRev*revPerSq));
          StepperR.moveTo(desiredPositionR);
          StepperL.moveTo(desiredPositionL);
          actionComplete = true;
        }
        else if (currentTime - startTime >= fTime) 
        {
          Serial.println("Forward");
          actionComplete = false;
          currentAction++;
        }
        break;
      }
    case 2:
      {
        if (!actionComplete) 
        {
          startTime = millis();
          long desiredPositionR = (StepperR.currentPosition() - (stepsPerRev*revPerSq));
          long desiredPositionL = (StepperL.currentPosition() + (stepsPerRev*revPerSq));
          StepperR.moveTo(desiredPositionR);
          StepperL.moveTo(desiredPositionL);
          actionComplete = true;
        }
        else if (currentTime - startTime >= bTime) 
        {
          Serial.println("Backward");
          actionComplete = false;
          currentAction++;
        }
        break;
      }

    case 3:
      {
        if (!actionComplete) 
        {
          startTime = millis();
          long desiredPositionR = (StepperR.currentPosition() + (stepsPerRev));
          long desiredPositionL = (StepperL.currentPosition() + (stepsPerRev));
          StepperR.moveTo(desiredPositionR);
          StepperL.moveTo(desiredPositionL);
          actionComplete = true;
        }
        else if (currentTime - startTime >= lTime) 
        {
          Serial.println("Left");
          actionComplete = false;
          currentAction++;
        }
        break;
      }

    case 4:
      {
        if (!actionComplete) 
        {
          startTime = millis();
          long desiredPositionR = (StepperR.currentPosition() - (stepsPerRev));
          long desiredPositionL = (StepperL.currentPosition() - (stepsPerRev));
          StepperR.moveTo(desiredPositionR);
          StepperL.moveTo(desiredPositionL);
          actionComplete = true;
        }
        else if (currentTime - startTime >= rTime) 
        {
          Serial.println("Right");
          actionComplete = false;
          currentAction++;
        }
        break;
      }

    case 5:
      {
        if (!actionComplete) 
        {
          startTime = millis();
          long desiredPositionR = (StepperR.currentPosition() - (0.5*stepsPerRev*revPerSq));
          long desiredPositionL = (StepperL.currentPosition() + (0.5*stepsPerRev*revPerSq));
          StepperR.moveTo(desiredPositionR);
          StepperL.moveTo(desiredPositionL);
          actionComplete = true;
        }
        else if (currentTime - startTime >= halfTime) 
        {
          Serial.println("halfForward");
          actionComplete = false;
          currentAction++;
        }
        break;
      }

    default:
      {
        digitalWrite(13, HIGH); //indicates an error (or the end of the array?)
        StepperR.stop();
        StepperL.stop();
        delay(10000);
        break;
      }
  }

  StepperR.run();
  StepperL.run();
}
A4988
A4988