//
// Globale Konstanten definieren
//
constexpr byte DIR_PIN {4};
constexpr byte STEP_PIN {5};
constexpr byte ANALOG_PIN {A0};

constexpr unsigned int STEPS_PER_REVOLUTION {200};
constexpr unsigned int STEPPER_DELAY_US {2000};   // Microskunden!
constexpr byte HYSTERESE {1};

// Struktur für die Daten, die zur Steuerung des Steppers erforderlich sind deklarieren
struct Steps {
  unsigned int analogValue;
  unsigned int prevAnalogValue;
  unsigned int position;
  unsigned int count;
};

//
// Feststellen ob eine Bewegung im Uhrzeigersinn (CW) oder Gegenuhrzeigersinn (CCW)
// erforderlich ist. Das Ergebnis ist abhängig von dem gemessenen Potentiometerwert
//
void prepareSteps(byte pin, Steps& st) {
  if (st.analogValue > st.prevAnalogValue) {
    digitalWrite(pin, HIGH);
    st.count = st.analogValue - st.position;
    st.position += st.count;
  } else {
    digitalWrite(pin, LOW);
    st.count = st.position - st.analogValue;
    st.position -= st.count;
  }
  st.prevAnalogValue = st.analogValue;
}

//
// Den Schrittmotor um die errechnete Anzahl an Schritten CW oder CCW bewegen.
//
void driveStepper(byte pin, unsigned int stepCount) {
  for (size_t x = 0; x < stepCount; ++x) {
    digitalWrite(pin, HIGH);
    delayMicroseconds(STEPPER_DELAY_US);
    digitalWrite(pin, LOW);
    delayMicroseconds(STEPPER_DELAY_US);
  }
}

void setup() {
  pinMode(STEP_PIN, OUTPUT);
  pinMode(DIR_PIN, OUTPUT);
}

void loop() {
  static Steps steps {0, 0, 0, 0};   // Strutur anlegen und Member mit 0 initialisieren.

  // Potentiometerwert lesen und auf die maximale Schrittzahl für eine Umdrehung des
  // Steppermotors umrechnen.
  steps.analogValue = map(analogRead(ANALOG_PIN), 0, 1023, 0, STEPS_PER_REVOLUTION);

  // Wenn sich der gelesenen Analogwert verändert hat den Stepper entsprechend bewegen.
  if (steps.analogValue >= steps.prevAnalogValue + HYSTERESE ||
      steps.analogValue <= steps.prevAnalogValue - HYSTERESE) {
    prepareSteps(DIR_PIN, steps);
    driveStepper(STEP_PIN, steps.count);
  }
}
0
1023
A4988