//Pindefinitionen #define BTN_ONOFF 2 #define BTN_SERVICE 3 #define BTN_FAHRGAST 4 #define BTN_QUIT 5 #define LED_ONOFF 8 #define LED_SERVICE 9 #define LED_FAHRGAST 10 #define LED_QUIT 11 // Hilfsvariablen zum merken des Zustands bool currentButtonStateAnlageEinAus; bool buttonStateAnlageEinAus; bool currentButtonStateService; bool buttonStateService; bool currentButtonStateFahrgast; bool buttonStateFahrgast; bool currentButtonStateQuit; bool buttonStateQuit; // Anlagenzustände enum { AUS, SERVICE_QUITTIEREN, SERVICE, FAHRGAST_QUITTIEREN, FAHRGAST, } anlagenzustand; void setup() { anlagenzustand = AUS; // TODO: pinMode } void loop() { switch(anlagenzustand) { // #################### Anlage ausgeschaltet case AUS: { // ========== LEDs entsprechend des Zustands setzen digitalWrite(LED_ONOFF, LOW); digitalWrite(LED_SERVICE, LOW); digitalWrite(LED_FAHRGAST, LOW); digitalWrite(LED_QUIT, LOW); // ========== Ein/Aus Button abfragen currentButtonStateAnlageEinAus = digitalRead(BTN_ONOFF) == LOW; // Taster abfragen und aktuellen Zustand zwischenspeichern if (currentButtonStateAnlageEinAus && !buttonStateAnlageEinAus) // Aktuellen Zustand mit vorherigem vergleichen { delay(20); // Warten zum entprellen currentButtonStateAnlageEinAus = digitalRead(BTN_ONOFF) == LOW; // Taster abfragen und aktuellen Zustand zwischenspeichern if(currentButtonStateAnlageEinAus == LOW) // Prüfen ob immernoch gedrückt { // Taster erfolgreich gedrückt => Anlage einschalten digitalWrite(LED_ONOFF, HIGH); // Betriebs LED einschalten anlagenzustand = SERVICE; // Anlage in den Zustand "SERVICE" versetzen und damit starten } buttonStateAnlageEinAus = currentButtonStateAnlageEinAus; } break; } // #################### Anlage im Service-quittieren Zustand // Anlage wechselt in den Fahrgastzustand, sobald der Zustandswechsel durch den Nutzer quittiert wird case SERVICE_QUITTIEREN: { // ========== LEDs entsprechend des Zustands setzen digitalWrite(LED_QUIT, HIGH); // ========== Quittieren Button abfragen currentButtonStateQuit = digitalRead(BTN_QUIT) == LOW; // Taster abfragen und aktuellen Zustand zwischenspeichern if (currentButtonStateQuit && !buttonStateQuit) // Aktuellen Zustand mit vorherigem vergleichen { delay(20); // Warten zum entprellen currentButtonStateQuit = digitalRead(BTN_QUIT) == LOW; // Taster abfragen und aktuellen Zustand zwischenspeichern if(currentButtonStateQuit == LOW) // Prüfen ob immernoch gedrückt { // Taster erfolgreich gedrückt => Zustand wechseln digitalWrite(LED_QUIT, LOW); // LED_QUIT ausschalten anlagenzustand = SERVICE; // Anlage in den Zustand "SERVICE" versetzen } buttonStateQuit = currentButtonStateQuit; } break; } // #################### Anlage im Servicezustand case SERVICE: { // ========== LEDs entsprechend des Zustands setzen digitalWrite(LED_SERVICE, HIGH); digitalWrite(LED_FAHRGAST, LOW); // ========== Ein/Aus Button abfragen currentButtonStateAnlageEinAus = digitalRead(BTN_ONOFF) == LOW; // Taster abfragen und aktuellen Zustand zwischenspeichern if (currentButtonStateAnlageEinAus && !buttonStateAnlageEinAus) // Aktuellen Zustand mit vorherigem vergleichen { delay(20); // Warten zum entprellen currentButtonStateAnlageEinAus = digitalRead(BTN_ONOFF) == LOW; // Taster abfragen und aktuellen Zustand zwischenspeichern if(currentButtonStateAnlageEinAus == LOW) // Prüfen ob immernoch gedrückt { // Taster erfolgreich gedrückt => Anlage ausschalten anlagenzustand = AUS; // Anlage in den Zustand "AUS" versetzen und damit starten } buttonStateAnlageEinAus = currentButtonStateAnlageEinAus; } // ========== Fahrgast Button abfragen currentButtonStateFahrgast = digitalRead(BTN_FAHRGAST) == LOW; // Taster abfragen und aktuellen Zustand zwischenspeichern if (currentButtonStateFahrgast && !buttonStateFahrgast) // Aktuellen Zustand mit vorherigem vergleichen { delay(20); // Warten zum entprellen currentButtonStateFahrgast = digitalRead(BTN_FAHRGAST) == LOW; // Taster abfragen und aktuellen Zustand zwischenspeichern if(currentButtonStateFahrgast == LOW) // Prüfen ob immernoch gedrückt { // Taster erfolgreich gedrückt => Zustand wechseln anlagenzustand = FAHRGAST_QUITTIEREN; // Anlage in den Zustand "FAHRGAST_QUITTIEREN" versetzen } buttonStateFahrgast = currentButtonStateFahrgast; } 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, HIGH); // ========== Quittieren Button abfragen currentButtonStateQuit = digitalRead(BTN_QUIT) == LOW; // Taster abfragen und aktuellen Zustand zwischenspeichern if (currentButtonStateQuit && !buttonStateQuit) // Aktuellen Zustand mit vorherigem vergleichen { delay(20); // Warten zum entprellen currentButtonStateQuit = digitalRead(BTN_QUIT) == LOW; // Taster abfragen und aktuellen Zustand zwischenspeichern if(currentButtonStateQuit == LOW) // Prüfen ob immernoch gedrückt { // Taster erfolgreich gedrückt => Zustand wechseln digitalWrite(LED_QUIT, LOW); // LED_QUIT ausschalten anlagenzustand = FAHRGAST; // Anlage in den Zustand "FAHRGAST" versetzen } buttonStateQuit = currentButtonStateQuit; } break; } // #################### Anlage im Fahrgastzustand case FAHRGAST: { // ========== LEDs entsprechend des Zustands setzen digitalWrite(LED_SERVICE, LOW); digitalWrite(LED_FAHRGAST, HIGH); // ========== Ein/Aus Button abfragen currentButtonStateAnlageEinAus = digitalRead(BTN_ONOFF) == LOW; // Taster abfragen und aktuellen Zustand zwischenspeichern if (currentButtonStateAnlageEinAus && !buttonStateAnlageEinAus) // Aktuellen Zustand mit vorherigem vergleichen { delay(20); // Warten zum entprellen currentButtonStateAnlageEinAus = digitalRead(BTN_ONOFF) == LOW; // Taster abfragen und aktuellen Zustand zwischenspeichern if(currentButtonStateAnlageEinAus == LOW) // Prüfen ob immernoch gedrückt { // Taster erfolgreich gedrückt => Anlage ausschalten anlagenzustand = AUS; // Anlage in den Zustand "AUS" versetzen und damit starten } buttonStateAnlageEinAus = currentButtonStateAnlageEinAus; } // ========== Service Button abfragen currentButtonStateService = digitalRead(BTN_SERVICE) == LOW; // Taster abfragen und aktuellen Zustand zwischenspeichern if (currentButtonStateService && !buttonStateService) // Aktuellen Zustand mit vorherigem vergleichen { delay(20); // Warten zum entprellen currentButtonStateService = digitalRead(BTN_SERVICE) == LOW; // Taster abfragen und aktuellen Zustand zwischenspeichern if(currentButtonStateService == LOW) // Prüfen ob immernoch gedrückt { // Taster erfolgreich gedrückt => Zustand wechseln anlagenzustand = SERVICE_QUITTIEREN; // Anlage in den Zustand "SERVICE_QUITTIEREN" versetzen } buttonStateService = currentButtonStateService; } break; } // #################### default: { break; } } }