// Using NO library but blocking loop

#define dirPin 2
#define stepPin 3
#define stepsPerRevolution 200
#define buttonPin 4
#define rgbLED 8
bool buttonState = 0;

void setup() {
  randomSeed(analogRead(A0));
  Serial.begin(115200);
  pinMode(rgbLED, OUTPUT);
  pinMode(rgbLED + 1, OUTPUT);
  pinMode(dirPin, OUTPUT);
  pinMode(stepPin, OUTPUT);
  pinMode(buttonPin, INPUT);
}

void loop() {
  buttonState = digitalRead(buttonPin);
  if (buttonState == HIGH)
    setStep();
}

void setStep()
{
  int speed = random(250, 1500); // motor speed (minimum, maximum)
  int rotations = random(3) + 1; // number of rotations +1 for non-zero
  int direction = random(2); // direction 0 = CW or 1 = CCW

  Serial.print("DIRECTION: ");
  Serial.print((direction == 0) ? " CW" : "CCW");
  Serial.print(" ROTATIONS: ");
  Serial.print(rotations);
  Serial.print(" SPEED: ");
  Serial.println(2000 - speed);

  digitalWrite(rgbLED + direction, HIGH);
  rotate (speed, rotations, direction);
  digitalWrite(rgbLED + direction, LOW);
  delay(250);
  digitalWrite(rgbLED + !direction, HIGH);
  rotate (speed, rotations, !direction);
  digitalWrite(rgbLED + !direction, LOW);
}

void rotate(int speed, int rotations, bool direction) {
  digitalWrite(dirPin, direction);

  for (int i = 0; i < rotations * stepsPerRevolution; i++) {
    digitalWrite(stepPin, HIGH);
    delayMicroseconds(speed);
    digitalWrite(stepPin, LOW);
    delayMicroseconds(speed);
  }
}

/*
            +-------------------------+
   LOW=DSBL | ENABLE    A4988    VMOT | 8-35vdc ---+ 100uf electro cap
  microstep | MS1                 GND | gnd -------+ pwr spike protect
  microstep | MS2                  2B | stepper 2B
  microstep | MS3                  2A | stepper 2A
        RST | RESET                1A | stepper 1A
        SLP | SLEEP                1B | stepper 1B
      Pin 3 | STEP                VDD | 5vdc
      Pin 2 | DIR                 GND | gnd
            +-------------------------+

          MS1	MS2	 MS3   Step resolution
          Low  Low	Low   Full step
          High Low  Low   1/2 step
          Low  High Low   1/4 step
          High High Low   1/8 step
          High High High  1/16 step

          SET DRIVER CURRENT LIMIT
          1. Power A4988 driver (Vdd, GND)
          2. Connect RST to SLP
          3. Disconnect motor
          4. Apply USB power
          5. Calculate current limit: Current Limit = Vref ÷ (8 × Rcs)
          6. A current limit of 1A (standard) needs Vref of 540mV
          7. Adjust POT while measuring Vref at GND to POT (metal screw)
          8. If the motor is making a lot of noise,  lower the current limit
*/
nano:12
nano:11
nano:10
nano:9
nano:8
nano:7
nano:6
nano:5
nano:4
nano:3
nano:2
nano:GND.2
nano:RESET.2
nano:0
nano:1
nano:13
nano:3.3V
nano:AREF
nano:A0
nano:A1
nano:A2
nano:A3
nano:A4
nano:A5
nano:A6
nano:A7
nano:5V
nano:RESET
nano:GND.1
nano:VIN
nano:12.2
nano:5V.2
nano:13.2
nano:11.2
nano:RESET.3
nano:GND.3
stepper1:A-
stepper1:A+
stepper1:B+
stepper1:B-
A4988
drv1:ENABLE
drv1:MS1
drv1:MS2
drv1:MS3
drv1:RESET
drv1:SLEEP
drv1:STEP
drv1:DIR
drv1:GND.1
drv1:VDD
drv1:1B
drv1:1A
drv1:2A
drv1:2B
drv1:GND.2
drv1:VMOT
vcc1:VCC
gnd1:GND
btn1:1.l
btn1:2.l
btn1:1.r
btn1:2.r
rgb1:R
rgb1:COM
rgb1:G
rgb1:B
r1:1
r1:2
r2:1
r2:2
r3:1
r3:2
PRESS
r4:1
r4:2