#define LED_PIN 6
#define NOT_HALT_SPS 4
#define FREIGABE_SPS 5
#define MOTOR_STEP_PIN 10
#define MOTOR_DIR_PIN 9
#define START_TASTER_PIN 7
#define PROZESS_DAUER 70 // Prozessdauer in Sekunden
#define MOTOR_VERZOEGERUNG 211860 // in Mikrosekunden
#define BLINK_INTERVAL 500 // Blink-Intervall in Millisekunden
bool prozessLaeuft = false; // Status des Prozesses
unsigned long prozessStartzeit = 0; // Startzeit des Prozesses
unsigned long verbleibendeZeit = PROZESS_DAUER; // Restlaufzeit
bool startGedrueckt = false; // Zustandsvariable für den Start-Taster
bool notGedrueckt = false;
// Variablen für LED-Status
bool ledStatus = false; // Aktueller Zustand der LED
unsigned long letzteBlinkzeit = 0; // Zeitstempel für LED-Blinken
void setup() {
pinMode(LED_PIN, OUTPUT);
pinMode(NOT_HALT_SPS, INPUT);
pinMode(FREIGABE_SPS, INPUT);
pinMode(MOTOR_STEP_PIN, OUTPUT);
pinMode(MOTOR_DIR_PIN, OUTPUT);
pinMode(START_TASTER_PIN, INPUT);
Serial.begin(9600);
digitalWrite(LED_PIN, LOW);
digitalWrite(MOTOR_DIR_PIN, HIGH);
}
void loop() {
// Start-Taster prüfen
/*Serial.print("Variable Start: ");
Serial.println(startGedrueckt);
Serial.print("Variable NOT: ");
Serial.println(notGedrueckt);
Serial.print("Variable Zeit: ");
Serial.println(verbleibendeZeit);*/
if (digitalRead(START_TASTER_PIN) == HIGH && !startGedrueckt && verbleibendeZeit > 0) {
startGedrueckt = true; // Tasterstatus merken
notGedrueckt = false;
starteProzess();
Serial.println("Start wurde gedrückt");
}
// Stopp-Signal prüfen
if (digitalRead(NOT_HALT_SPS) == HIGH && prozessLaeuft) {
notGedrueckt = true;
startGedrueckt = false;
stoppeProzess();
} else if (digitalRead(NOT_HALT_SPS) == LOW && verbleibendeZeit > 0 && !prozessLaeuft && notGedrueckt && startGedrueckt) {
// Fortsetzen, wenn Stopp-Signal zurückgesetzt und Restlaufzeit vorhanden
notGedrueckt = false;
starteProzess();
}
// Prozess ausführen
if (prozessLaeuft) {
unsigned long vergangeneZeit = (millis() - prozessStartzeit) / 1000;
if (vergangeneZeit < verbleibendeZeit) {
motorSchritt();
ledBlinken(); // LED blinkt im laufenden Prozess
} else {
stoppeProzess();
}
}
}
void starteProzess() {
prozessLaeuft = true;
prozessStartzeit = millis();
digitalWrite(MOTOR_DIR_PIN, HIGH); // Drehrichtung setzen
}
void stoppeProzess() {
prozessLaeuft = false; // Prozess stoppen
verbleibendeZeit -= (millis() - prozessStartzeit) / 1000; // Restlaufzeit speichern
digitalWrite(LED_PIN, LOW); // LED ausschalten
}
void motorSchritt() {
static unsigned long letzteSchrittzeit = 0;
if (micros() - letzteSchrittzeit >= MOTOR_VERZOEGERUNG) {
letzteSchrittzeit = micros();
// STEP-Signal erzeugen
digitalWrite(MOTOR_STEP_PIN, HIGH); // STEP-Pin HIGH
delayMicroseconds(10); // Kurzer Puls (10 Mikrosekunden)
digitalWrite(MOTOR_STEP_PIN, LOW); // STEP-Pin LOW
}
}
void ledBlinken() {
unsigned long aktuelleZeit = millis();
if (aktuelleZeit - letzteBlinkzeit >= BLINK_INTERVAL) {
letzteBlinkzeit = aktuelleZeit;
ledStatus = !ledStatus; // LED-Zustand umschalten
digitalWrite(LED_PIN, ledStatus ? HIGH : LOW);
}
}
void motorStop() {
// Keine Aktion erforderlich für den A4988
}