constexpr byte ledPin_Rechtslauf {7};
constexpr byte ledPin_Linkslauf {8};
constexpr byte endSchalter_Rechtslauf {9};
constexpr byte endSchalter_Linkslauf {10};
constexpr byte endschalter_mitte {6};
constexpr byte tasterPin_Rechtslauf {11};
constexpr byte tasterPin_Linkslauf {12};
constexpr byte tasterPin_Mitte {5}; // Neuer Taster für die Mitte
constexpr bool AN = HIGH;
constexpr bool AUS = !AN;
constexpr bool GEDRUEKT = LOW;
enum class Status {Reset, Linkslauf, Rechtslauf, LinksErreicht, RechtsErreicht, MitteErreicht, FahrtZurMitte} status = Status::Reset;
void setup() {
Serial.begin(9600);
pinMode(ledPin_Rechtslauf, OUTPUT);
pinMode(ledPin_Linkslauf, OUTPUT);
pinMode(endSchalter_Rechtslauf, INPUT_PULLUP);
pinMode(endSchalter_Linkslauf, INPUT_PULLUP);
pinMode(endschalter_mitte, INPUT_PULLUP);
pinMode(tasterPin_Rechtslauf, INPUT_PULLUP);
pinMode(tasterPin_Linkslauf, INPUT_PULLUP);
pinMode(tasterPin_Mitte, INPUT_PULLUP);
digitalWrite(ledPin_Rechtslauf, AUS);
digitalWrite(ledPin_Linkslauf, AUS);
Serial.println(F("System bereit. Drücke einen Taster zum Start."));
}
void loop() {
switch (status) {
case Status::Reset:
digitalWrite(ledPin_Rechtslauf, AUS);
digitalWrite(ledPin_Linkslauf, AUS);
if (digitalRead(tasterPin_Rechtslauf) == GEDRUEKT) {
Serial.println(F("Starte Fahrt nach Rechts"));
status = Status::Rechtslauf;
digitalWrite(ledPin_Rechtslauf, AN);
} else if (digitalRead(tasterPin_Linkslauf) == GEDRUEKT) {
Serial.println(F("Starte Fahrt nach Links"));
status = Status::Linkslauf;
digitalWrite(ledPin_Linkslauf, AN);
} else if (digitalRead(tasterPin_Mitte) == GEDRUEKT) {
Serial.println(F("Starte Fahrt zur Mitte"));
status = Status::FahrtZurMitte;
digitalWrite(ledPin_Rechtslauf, AN); // Beide LEDs leuchten
digitalWrite(ledPin_Linkslauf, AN);
}
break;
case Status::Rechtslauf:
if (digitalRead(endSchalter_Rechtslauf) == GEDRUEKT) {
Serial.println(F("Rechter Endschlag erreicht"));
status = Status::RechtsErreicht;
digitalWrite(ledPin_Rechtslauf, AUS);
} else {
digitalWrite(ledPin_Rechtslauf, AN);
}
break;
case Status::Linkslauf:
if (digitalRead(endSchalter_Linkslauf) == GEDRUEKT) {
Serial.println(F("Linker Endschlag erreicht"));
status = Status::LinksErreicht;
digitalWrite(ledPin_Linkslauf, AUS);
} else {
digitalWrite(ledPin_Linkslauf, AN);
}
break;
case Status::FahrtZurMitte:
if (digitalRead(endschalter_mitte) == GEDRUEKT) {
Serial.println(F("Mitte erreicht"));
status = Status::MitteErreicht;
digitalWrite(ledPin_Rechtslauf, AUS);
digitalWrite(ledPin_Linkslauf, AUS);
} else {
// Beide LEDs leuchten während der Fahrt zur Mitte
digitalWrite(ledPin_Rechtslauf, AN);
digitalWrite(ledPin_Linkslauf, AN);
}
break;
case Status::LinksErreicht:
digitalWrite(ledPin_Linkslauf, AUS);
if (digitalRead(tasterPin_Rechtslauf) == GEDRUEKT) {
Serial.println(F("Starte Fahrt nach Rechts"));
status = Status::Rechtslauf;
digitalWrite(ledPin_Rechtslauf, AN);
} else if (digitalRead(tasterPin_Mitte) == GEDRUEKT) {
Serial.println(F("Starte Fahrt zur Mitte"));
status = Status::FahrtZurMitte;
digitalWrite(ledPin_Rechtslauf, AN); // Beide LEDs leuchten
digitalWrite(ledPin_Linkslauf, AN);
}
break;
case Status::RechtsErreicht:
digitalWrite(ledPin_Rechtslauf, AUS);
if (digitalRead(tasterPin_Linkslauf) == GEDRUEKT) {
Serial.println(F("Starte Fahrt nach Links"));
status = Status::Linkslauf;
digitalWrite(ledPin_Linkslauf, AN);
} else if (digitalRead(tasterPin_Mitte) == GEDRUEKT) {
Serial.println(F("Starte Fahrt zur Mitte"));
status = Status::FahrtZurMitte;
digitalWrite(ledPin_Rechtslauf, AN); // Beide LEDs leuchten
digitalWrite(ledPin_Linkslauf, AN);
}
break;
case Status::MitteErreicht:
digitalWrite(ledPin_Rechtslauf, AUS);
digitalWrite(ledPin_Linkslauf, AUS);
if (digitalRead(tasterPin_Rechtslauf) == GEDRUEKT) {
Serial.println(F("Starte Fahrt nach Rechts"));
status = Status::Rechtslauf;
digitalWrite(ledPin_Rechtslauf, AN);
} else if (digitalRead(tasterPin_Linkslauf) == GEDRUEKT) {
Serial.println(F("Starte Fahrt nach Links"));
status = Status::Linkslauf;
digitalWrite(ledPin_Linkslauf, AN);
}
break;
default:
Serial.println(F("Unbekannter Status. System wird zurückgesetzt."));
status = Status::Reset;
digitalWrite(ledPin_Rechtslauf, AUS);
digitalWrite(ledPin_Linkslauf, AUS);
break;
}
}