//Pindefinitionen #define LED_ANLAGE_EIN_AUS 2 #define KNOPF_ANLAGE_EIN_AUS 3 #define LED_STATION_BESETZT_UNBESETZT 4 #define KNOPF_STATION_BESETZT_UNBESETZT 5 #define LED_SERVICEBETRIEB 6 #define KNOPF_SERVICEBETRIEB 7 #define LED_FAHRGASTBETRIEB 22 #define KNOPF_FAHRGASTBETRIEB 23 #define LED_ROT_EREIGNISANZEIGE 13 #define LED_GELB_EREIGNISANZEIGE 12 #define LED_GRUEN_EREIGNISANZEIGE 11 #define LED_QUIT_BETRIEB 9 #define KNOPF_QUIT_BETRIEB 10 // Hilfsvariablen zum merken des Zustands bool buttonStateAnlageEinAus = false; bool currentButtonStateAnlageEinAus = false; bool buttonStateStationBesetztUnbesetzt = false; bool currentButtonStateStationBesetztUnbesetzt = false; bool buttonStateServicebetrieb = false; bool currentButtonStateServicebetrieb = false; bool buttonStateFahrgastbetrieb = false; bool currentButtonStateFahrgastbetrieb = false; bool buttonStateQuitBetrieb = false; bool currentButtonStateQuitBetrieb = false; // Anlagenzustände enum { AUS, SERVICE_QUITTIEREN, SERVICE, FAHRGAST_QUITTIEREN, FAHRGAST, } anlagenzustand; // Fahrtrichtungen enum Fahrtrichtung { HALT, NOTHALT, WARTE_START, VORWAERTS_QUITTIEREN, VORWAERTS, RUECKWAERTS_QUITTIEREN, RUECKWAERTS, } fahrtrichtung; Fahrtrichtung vorherigerichtung = HALT; void quittierenButtonAbfragen() { // Button Code [...] if(fahrtrichtung == NOTHALT || fahrtrichtung == HALT) { fahrtrichtung = WARTE_START; } else if(fahrtrichtung == VORWAERTS_QUITTIEREN) { fahrtrichtung = WARTE_START; } else if(fahrtrichtung == RUECKWAERTS_QUITTIEREN) { fahrtrichtung = WARTE_START; } // Button Code [...] } void startButtonAbfragen() { // Button Code [...] if(vorherigerichtung == VORWAERTS) { fahrtrichtung = RUECKWAERTS; } else if(vorherigerichtung == RUECKWAERTS) { fahrtrichtung = VORWAERTS; } else { fahrtrichtung = VORWAERTS; } // Button Code [...] } void haltButtonAbfragen() { // Button Code [...] fahrtrichtung = HALT; // Button Code [...] } void nothaltButtonAbfragen() { // Button Code [...] fahrtrichtung = NOTHALT; // Button Code [...] } void vorwaertsButtonAbfragen() { // Button Code [...] fahrtrichtung = VORWAERTS_QUITTIEREN; // Button Code [...] } void rueckwaertsButtonAbfragen() { // Button Code [...] fahrtrichtung = RUECKWAERTS_QUITTIEREN; // Button Code [...] } void setup() { anlagenzustand = AUS; fahrtrichtung = HALT; Serial.begin(9600); // Pindefinitonen pinMode(LED_ANLAGE_EIN_AUS, OUTPUT); pinMode(KNOPF_ANLAGE_EIN_AUS, INPUT_PULLUP); pinMode(LED_STATION_BESETZT_UNBESETZT, OUTPUT); pinMode(KNOPF_STATION_BESETZT_UNBESETZT, INPUT_PULLUP); pinMode(LED_SERVICEBETRIEB, OUTPUT); pinMode(KNOPF_SERVICEBETRIEB, INPUT_PULLUP); pinMode(LED_FAHRGASTBETRIEB, OUTPUT); pinMode(KNOPF_FAHRGASTBETRIEB, INPUT_PULLUP); pinMode(LED_QUIT_BETRIEB, OUTPUT); pinMode(KNOPF_QUIT_BETRIEB, INPUT_PULLUP); pinMode(LED_ROT_EREIGNISANZEIGE, OUTPUT); pinMode(LED_GELB_EREIGNISANZEIGE, OUTPUT); pinMode(LED_GRUEN_EREIGNISANZEIGE, OUTPUT); } void loop() { switch(anlagenzustand) { // #################### Anlage ausgeschaltet case AUS: { // ========== LEDs entsprechend des Zustands setzen digitalWrite(LED_ANLAGE_EIN_AUS, LOW); digitalWrite(LED_STATION_BESETZT_UNBESETZT, LOW); digitalWrite(LED_SERVICEBETRIEB, LOW); digitalWrite(LED_FAHRGASTBETRIEB, LOW); digitalWrite(LED_ROT_EREIGNISANZEIGE, LOW); digitalWrite(LED_GELB_EREIGNISANZEIGE, LOW); digitalWrite(LED_GRUEN_EREIGNISANZEIGE, LOW); digitalWrite(LED_QUIT_BETRIEB, LOW); // ========== Ein/Aus Button abfragen // Taster abfragen und aktuellen Zustand zwischenspeichern currentButtonStateAnlageEinAus = digitalRead(KNOPF_ANLAGE_EIN_AUS) == LOW; // Aktuellen Zustand mit vorherigem vergleichen if (currentButtonStateAnlageEinAus && !buttonStateAnlageEinAus) { // Warten zum entprellen delay(20); // Taster abfragen und aktuellen Zustand zwischenspeichern currentButtonStateAnlageEinAus = digitalRead(KNOPF_ANLAGE_EIN_AUS) == LOW; // Prüfen ob immernoch gedrückt if (currentButtonStateAnlageEinAus == LOW) { // Anlage in den Zustand "SERVICE" versetzen und damit starten anlagenzustand = SERVICE; digitalWrite(LED_ANLAGE_EIN_AUS, HIGH); digitalWrite(LED_STATION_BESETZT_UNBESETZT, HIGH); // Speichern des ButtonStates als Vergleichswert für den nächsten Durchlauf buttonStateAnlageEinAus = currentButtonStateAnlageEinAus; } } break; } // #################### Anlage im Service-quittieren Zustand // Anlage wechselt in den Servicezustand, sobald der Zustandswechsel durch den Nutzer quittiert wird case SERVICE_QUITTIEREN: { // ========== LEDs entsprechend des Zustands setzen digitalWrite(LED_QUIT_BETRIEB, HIGH); digitalWrite(LED_GELB_EREIGNISANZEIGE, HIGH); digitalWrite(LED_GRUEN_EREIGNISANZEIGE, LOW); // ========== Ein/Aus Button abfragen // Taster abfragen und aktuellen Zustand zwischenspeichern currentButtonStateAnlageEinAus = digitalRead(KNOPF_ANLAGE_EIN_AUS) == LOW; // Aktuellen Zustand mit vorherigem vergleichen if (currentButtonStateAnlageEinAus && !buttonStateAnlageEinAus) { // Warten zum entprellen delay(20); // Taster abfragen und aktuellen Zustand zwischenspeichern currentButtonStateAnlageEinAus = digitalRead(KNOPF_ANLAGE_EIN_AUS) == LOW; // Prüfen ob immernoch gedrückt if (currentButtonStateAnlageEinAus == LOW) { // Anlage in den Zustand "AUS" versetzen und damit stoppen anlagenzustand = AUS; // Speichern des ButtonStates als Vergleichswert für den nächsten Durchlauf buttonStateAnlageEinAus = currentButtonStateAnlageEinAus; } } // ========== Quittieren Button abfragen // Taster abfragen und aktuellen Zustand zwischenspeichern currentButtonStateQuitBetrieb = digitalRead(KNOPF_QUIT_BETRIEB) == LOW; // Aktuellen Zustand mit vorherigem vergleichen if (currentButtonStateQuitBetrieb && !buttonStateQuitBetrieb) { // Warten zum entprellen delay(20); // Taster abfragen und aktuellen Zustand zwischenspeichern currentButtonStateQuitBetrieb = digitalRead(KNOPF_QUIT_BETRIEB) == LOW; // Prüfen ob immernoch gedrückt if (currentButtonStateQuitBetrieb == LOW) { // Anlage in den Zustand "SERVICE" versetzen anlagenzustand = SERVICE; digitalWrite(LED_QUIT_BETRIEB, LOW); // Speichern des ButtonStates als Vergleichswert für den nächsten Durchlauf buttonStateQuitBetrieb = currentButtonStateQuitBetrieb; } } break; } // #################### Anlage im Servicezustand case SERVICE: { // ========== LEDs entsprechend des Zustands setzen digitalWrite(LED_SERVICEBETRIEB, HIGH); digitalWrite(LED_FAHRGASTBETRIEB, LOW); digitalWrite(LED_ROT_EREIGNISANZEIGE, HIGH); digitalWrite(LED_GELB_EREIGNISANZEIGE, LOW); digitalWrite(LED_GRUEN_EREIGNISANZEIGE, LOW); // ========== Fahrtrichtungsabhängige Steuerung switch(fahrtrichtung) { // Anlage steht case HALT: { quittierenButtonAbfragen(); vorwaertsButtonAbfragen(); rueckwaertsButtonAbfragen(); break; } // Anlage steht case NOTHALT: { quittierenButtonAbfragen(); vorwaertsButtonAbfragen(); rueckwaertsButtonAbfragen(); break; } // Anlage steht case WARTE_START: { startButtonAbfragen(); break; } // Anlage fährt vorwärts case VORWAERTS_QUITTIEREN: { break; } // Anlage fährt vorwärts case VORWAERTS: { haltButtonAbfragen(); nothaltButtonAbfragen(); break; } // Anlage fährt rückwärts case RUECKWAERTS_QUITTIEREN: { break; } // Anlage fährt rückwärts case RUECKWAERTS: { haltButtonAbfragen(); nothaltButtonAbfragen(); break; } default: { break; } } // ========== Ein/Aus Button abfragen // Taster abfragen und aktuellen Zustand zwischenspeichern currentButtonStateAnlageEinAus = digitalRead(KNOPF_ANLAGE_EIN_AUS) == LOW; // Aktuellen Zustand mit vorherigem vergleichen if (currentButtonStateAnlageEinAus && !buttonStateAnlageEinAus) { // Warten zum entprellen delay(20); // Taster abfragen und aktuellen Zustand zwischenspeichern currentButtonStateAnlageEinAus = digitalRead(KNOPF_ANLAGE_EIN_AUS) == LOW; // Prüfen ob immernoch gedrückt if (currentButtonStateAnlageEinAus == LOW) { // Anlage in den Zustand "AUS" versetzen und damit stoppen anlagenzustand = AUS; // Speichern des ButtonStates als Vergleichswert für den nächsten Durchlauf buttonStateAnlageEinAus = currentButtonStateAnlageEinAus; } } // ========== Fahrgast Button abfragen // Taster abfragen und aktuellen Zustand zwischenspeichern currentButtonStateFahrgastbetrieb = digitalRead(KNOPF_FAHRGASTBETRIEB) == LOW; // Aktuellen Zustand mit vorherigem vergleichen if (currentButtonStateFahrgastbetrieb && !buttonStateFahrgastbetrieb) { // Warten zum entprellen delay(20); // Taster abfragen und aktuellen Zustand zwischenspeichern currentButtonStateFahrgastbetrieb = digitalRead(KNOPF_FAHRGASTBETRIEB) == LOW; // Prüfen ob immernoch gedrückt if (currentButtonStateFahrgastbetrieb == LOW) { // Anlage in den Zustand "SERVICE_QUITTIEREN" versetzen anlagenzustand = SERVICE_QUITTIEREN; // Speichern des ButtonStates als Vergleichswert für den nächsten Durchlauf buttonStateFahrgastbetrieb = currentButtonStateFahrgastbetrieb; } } break; } // #################### Anlage im Fahrgast-quittieren Zustand // Anlage wechselt in den Fahrgastzustand, sobald der Zustandswechsel durch den Nutzer quittiert wird case FAHRGAST_QUITTIEREN: { // ========== LEDs entsprechend des Zustands setzen digitalWrite(LED_QUIT_BETRIEB, HIGH); digitalWrite(LED_GELB_EREIGNISANZEIGE, HIGH); digitalWrite(LED_ROT_EREIGNISANZEIGE, LOW); // ========== Ein/Aus Button abfragen // Taster abfragen und aktuellen Zustand zwischenspeichern currentButtonStateAnlageEinAus = digitalRead(KNOPF_ANLAGE_EIN_AUS) == LOW; // Aktuellen Zustand mit vorherigem vergleichen if (currentButtonStateAnlageEinAus && !buttonStateAnlageEinAus) { // Warten zum entprellen delay(20); // Taster abfragen und aktuellen Zustand zwischenspeichern currentButtonStateAnlageEinAus = digitalRead(KNOPF_ANLAGE_EIN_AUS) == LOW; // Prüfen ob immernoch gedrückt if (currentButtonStateAnlageEinAus == LOW) { // Anlage in den Zustand "AUS" versetzen und damit stoppen anlagenzustand = AUS; // Speichern des ButtonStates als Vergleichswert für den nächsten Durchlauf buttonStateAnlageEinAus = currentButtonStateAnlageEinAus; } } // ========== Quittieren Button abfragen // Taster abfragen und aktuellen Zustand zwischenspeichern currentButtonStateQuitBetrieb = digitalRead(KNOPF_QUIT_BETRIEB) == LOW; // Aktuellen Zustand mit vorherigem vergleichen if (currentButtonStateQuitBetrieb && !buttonStateQuitBetrieb) { // Warten zum entprellen delay(20); // Taster abfragen und aktuellen Zustand zwischenspeichern currentButtonStateQuitBetrieb = digitalRead(KNOPF_QUIT_BETRIEB) == LOW; // Prüfen ob immernoch gedrückt if (currentButtonStateQuitBetrieb == LOW) { // Anlage in den Zustand "SERVICE" versetzen anlagenzustand = SERVICE; digitalWrite(LED_QUIT_BETRIEB, LOW); // Speichern des ButtonStates als Vergleichswert für den nächsten Durchlauf buttonStateQuitBetrieb = currentButtonStateQuitBetrieb; } } break; } // #################### Anlage im Fahrgastzustand case FAHRGAST: { // ========== LEDs entsprechend des Zustands setzen digitalWrite(LED_SERVICEBETRIEB, LOW); digitalWrite(LED_FAHRGASTBETRIEB, HIGH); digitalWrite(LED_GRUEN_EREIGNISANZEIGE, HIGH); digitalWrite(LED_GELB_EREIGNISANZEIGE, LOW); // ========== Fahrtrichtungsabhängige Steuerung switch(fahrtrichtung) { // Anlage steht case STOP: { break; } // Anlage fährt vorwärts case VORWÄRTS: { break; } // Anlage fährt rückwärts case RÜCKWÄRTS: { break; } default: { break; } } // ========== Vorwärts Button abfragen vorwaertsButtonAbfragen(); // ========== Ein/Aus Button abfragen // Taster abfragen und aktuellen Zustand zwischenspeichern currentButtonStateAnlageEinAus = digitalRead(KNOPF_ANLAGE_EIN_AUS) == LOW; // Aktuellen Zustand mit vorherigem vergleichen if (currentButtonStateAnlageEinAus && !buttonStateAnlageEinAus) { // Warten zum entprellen delay(20); // Taster abfragen und aktuellen Zustand zwischenspeichern currentButtonStateAnlageEinAus = digitalRead(KNOPF_ANLAGE_EIN_AUS) == LOW; // Prüfen ob immernoch gedrückt if (currentButtonStateAnlageEinAus == LOW) { // Anlage in den Zustand "AUS" versetzen und damit stoppen anlagenzustand = AUS; // Speichern des ButtonStates als Vergleichswert für den nächsten Durchlauf buttonStateAnlageEinAus = currentButtonStateAnlageEinAus; } } // ========== Service Button abfragen // Taster abfragen und aktuellen Zustand zwischenspeichern currentButtonStateServicebetrieb = digitalRead(KNOPF_SERVICEBETRIEB) == LOW; // Aktuellen Zustand mit vorherigem vergleichen if (currentButtonStateServicebetrieb && !buttonStateServicebetrieb) { // Warten zum entprellen delay(20); // Taster abfragen und aktuellen Zustand zwischenspeichern currentButtonStateServicebetrieb = digitalRead(KNOPF_SERVICEBETRIEB) == LOW; // Prüfen ob immernoch gedrückt if (currentButtonStateServicebetrieb == LOW) { // Anlage in den Zustand "SERVICE_QUITTIEREN" versetzen anlagenzustand = SERVICE_QUITTIEREN; // Speichern des ButtonStates als Vergleichswert für den nächsten Durchlauf buttonStateServicebetrieb = currentButtonStateServicebetrieb; } } break; } // #################### default: { break; } } }