#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);
}