#include <AccelStepper.h>

const byte STEP_PIN = 2;
const byte DIR_PIN  = 3;
const byte EN_PIN   = 8;
const byte SSR_PIN  = 9;
const byte POT_PIN  = A0;

const long STEPS_PER_REV = 400;   // your driver setting
const int SEGMENTS = 20;
const int STEPS_PER_SEGMENT = STEPS_PER_REV / SEGMENTS;

const float MIN_RPM = 1.0;
const float MAX_RPM = 120.0;

const unsigned int PULSE_US = 300;   // lamp on-time pulse
const int POT_DEADBAND = 3;

AccelStepper stepper(AccelStepper::DRIVER, STEP_PIN, DIR_PIN);

long nextFlashStep = 0;
bool lampOn = false;
unsigned long lampOffTime = 0;
int lastPot = -1000;

void setup() {
  pinMode(EN_PIN, OUTPUT);
  pinMode(SSR_PIN, OUTPUT);
  digitalWrite(EN_PIN, LOW);     // enable driver (change if yours is active HIGH)
  digitalWrite(SSR_PIN, LOW);

  stepper.setMaxSpeed(3000);
  stepper.setAcceleration(3000);
}

void loop() {
  int pot = analogRead(POT_PIN);

  if (abs(pot - lastPot) > POT_DEADBAND) {
    lastPot = pot;
  }

  float rpm = MIN_RPM + (MAX_RPM - MIN_RPM) * (pot / 1023.0);
  float stepsPerSecond = (rpm * STEPS_PER_REV) / 60.0;
  stepper.setSpeed(stepsPerSecond);

  stepper.runSpeed();

  long pos = stepper.currentPosition();

  if (pos >= nextFlashStep) {
    digitalWrite(SSR_PIN, HIGH);
    lampOn = true;
    lampOffTime = micros() + PULSE_US;
    nextFlashStep += STEPS_PER_SEGMENT;
  }

  if (lampOn && (long)(micros() - lampOffTime) >= 0) {
    digitalWrite(SSR_PIN, LOW);
    lampOn = false;
  }
}