Загрузка данных


#define PIN_STEP        3
#define PIN_DIR         4
#define PIN_BTN         2
#define PIN_ENA         5   

#define STEP_DELAY_US   100
#define DEBOUNCE_MS     150
#define HOLD_MS         600

bool direction  = true;
bool running    = false;

bool     lastRawState   = HIGH;
bool     confirmedState = HIGH;
unsigned long debounceTime = 0;
unsigned long pressTime    = 0;
bool     holdFired         = false;

void setup() {
  pinMode(PIN_STEP, OUTPUT);
  pinMode(PIN_DIR,  OUTPUT);
  pinMode(PIN_ENA,  OUTPUT);
  pinMode(PIN_BTN,  INPUT);

  digitalWrite(PIN_DIR, HIGH);
  digitalWrite(PIN_ENA, HIGH);  // Драйвер включён по умолчанию
  Serial.begin(9600);
  pinMode(2, INPUT_PULLUP);
}

void loop() {
  checkButton();
  Serial.println(digitalRead(2));
  if (running) doStep();

}

void checkButton() {
  bool reading = digitalRead(PIN_BTN);

  if (reading != lastRawState) {
    debounceTime = millis();
    lastRawState = reading;
  }

  if ((millis() - debounceTime) < DEBOUNCE_MS) return;

  if (reading == LOW && confirmedState == HIGH) {
    confirmedState = LOW;
    pressTime = millis();
    holdFired = false;
  }

  if (reading == LOW && !holdFired) {
    if ((millis() - pressTime) >= HOLD_MS) {
      holdFired = true;
      direction = !direction;
      digitalWrite(PIN_DIR, direction ? HIGH : LOW);
      delayMicroseconds(5);
    }
  }

  if (reading == HIGH && confirmedState == LOW) {
    confirmedState = HIGH;
    if (!holdFired) {
      running = !running;
      digitalWrite(PIN_ENA, running ? LOW : HIGH);
    }
  }
}

void doStep() {
  digitalWrite(PIN_STEP, HIGH);
  delayMicroseconds(5);
  digitalWrite(PIN_STEP, LOW);
  delayMicroseconds(STEP_DELAY_US);
}