#include <ContinuousStepper.h>
#include <JC_Button.h>

const uint8_t pin_stepper_dir  = 2;
const uint8_t pin_stepper_step = 3;
const uint8_t pin_button_left  = 4;
const uint8_t pin_button_right = 5;
const int16_t acceleration     = 100;
const int16_t deceleration     = 50;
const int16_t target_rpm       = 60;

ContinuousStepper<StepperDriver> stepper;
Button button_left( pin_button_left );
Button button_right( pin_button_right );

void spin( const int16_t rpm )
{
  stepper.setAcceleration( acceleration );
  stepper.spin( rpm * 200.f / 60.f );
}

void stop()
{
  stepper.setAcceleration( deceleration );
  stepper.stop();
}

void setup()
{
  Serial.begin( 115200 );
  stepper.begin( pin_stepper_step, pin_stepper_dir );
  button_left.begin();
  button_right.begin();
}

void loop()
{
  stepper.loop();
  button_left.read();
  button_right.read();

  if ( button_left.wasPressed() )
  {
    spin( -target_rpm );
  }
  else if ( button_right.wasPressed() )
  {
    spin( target_rpm );
  }
  else if ( button_left.wasReleased() || button_right.wasReleased() )
  {
    stop();
  }

  const int16_t actual_rpm = round( stepper.speed() / 200.f * 60.f );
  static int16_t previous_rpm = actual_rpm;

  if ( previous_rpm != actual_rpm )
  {
    previous_rpm = actual_rpm;
    Serial.print( F( "Actual speed : " ) );
    Serial.print( actual_rpm );
    Serial.println( F( " RPM" ) );
  }
}
A4988