diff --git a/seilbahn_basics/seilbahn_basics.ino b/seilbahn_basics/seilbahn_basics.ino new file mode 100644 index 0000000..d876044 --- /dev/null +++ b/seilbahn_basics/seilbahn_basics.ino @@ -0,0 +1,209 @@ +//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; + } + } +}