// Lépések számának beállítása egy teljes fordulathoz (Nema 17 motor esetén általában 200 lépés)
const int stepsPerRevolution = 200;
// A4988 vezérlőhöz kapcsolt Arduino kivezetések
const int stepPin = 2;
const int dirPin = 3;
// Potméter és gomb kivezetése
const int potPin = A0;
const int buttonPin = 4;
// Várakozási idő korlátok milliszekundumban
const int minDelay = 250; // Minimum várakozási idő (0,25 másodperc)
const int maxDelay = 2000; // Maximum várakozási idő (2 másodperc)
// Gomb állapotok
bool isRunning = false;
bool lastButtonState = HIGH; // Kezdetben feltételezzük, hogy a gomb nincs lenyomva
bool buttonState = HIGH; // Kezdetben a gomb nincs lenyomva
// Gomb debounce idő
unsigned long lastDebounceTime = 0;
unsigned long debounceDelay = 50; // 50 milliszekundum
long timedelay = 0;
long motortime = 0;
int delayTime = 0;
bool pressed = false;
long lastPressed = 0;
void setup() {
// A4988 kivezetések beállítása kimenetként
pinMode(stepPin, OUTPUT);
pinMode(dirPin, OUTPUT);
// Gomb kivezetés beállítása bemenetként és belső felhúzó ellenállás aktiválása
pinMode(buttonPin, INPUT_PULLUP);
// Soros kommunikáció indítása
Serial.begin(9600);
// Kezdeti irány beállítása
digitalWrite(dirPin, HIGH);
Serial.println("Kezdő állapot: motor áll.");
}
void loop() {
// Gomb állapotának leolvasása
int reading = digitalRead(buttonPin);
// Ha a gomb állapota megváltozott (debouncing kezelés)
if (reading != lastButtonState) {
lastDebounceTime = millis();
}
// Csak akkor váltunk állapotot, ha a debounce késleltetés lejárt
if ((millis() - lastDebounceTime) > debounceDelay) {
// Ha a gomb állapota megváltozott
if (reading != buttonState) {
buttonState = reading;
// Ha a gomb lenyomott állapotban van
if (buttonState == LOW) {
// Állapot változtatása
isRunning = !isRunning;
lastPressed = millis();
// Jelenlegi állapot kiírása a Serial Monitorra
if (isRunning) {
Serial.println("Motor elindult.");
} else {
Serial.println("Motor megállt.");
}
}
}
}
if(pressed){
isRunning = ! isRunning;
Serial.println("Motor megállt.");
}
// Gomb állapotának frissítése
lastButtonState = reading;
pressed = false;
// Ha a motor fut, akkor forgat
if (isRunning && millis() - timedelay >= delayTime) {
// Teljes fordulat megtétele
for (int i = 0; i < stepsPerRevolution; i++) {
digitalWrite(stepPin, HIGH);
delayMicroseconds(800); // 800 microseconds delay
digitalWrite(stepPin, LOW);
delayMicroseconds(800); // 800 microseconds delay
reading = digitalRead(buttonPin);
if(reading == lastButtonState){
lastPressed = millis();
}
if(millis() - lastPressed > debounceDelay){
if(reading != buttonState){
buttonState = reading;
}
if(buttonState == LOW){
pressed = true;
lastPressed = millis();
}
}
}
// Potméter értékének beolvasása
int potValue = analogRead(potPin);
Serial.print("Potméter érték: ");
Serial.println(potValue);
reading = digitalRead(buttonPin);
if(reading != lastButtonState){
lastPressed = millis();
}
if(millis() - lastPressed > debounceDelay){
if(reading == buttonState){
buttonState = reading;
}
if(buttonState == LOW){
pressed = true;
lastPressed = millis();
}
}
// Várakozási idő számítása
delayTime = map(potValue, 0, 1023, minDelay, maxDelay);
Serial.print("Várakozási idő: ");
Serial.print(delayTime);
Serial.println(" ms");
timedelay = millis();
}
}