From f0679635da042455a1c13c5902ad5e5b908e850a Mon Sep 17 00:00:00 2001 From: Julian Appel Date: Sun, 26 Jan 2025 20:27:48 +0100 Subject: [PATCH] First working version with comments --- seilbahn_basics/seilbahn_basics.ino | 407 ++++++++++++++++++++-------- 1 file changed, 296 insertions(+), 111 deletions(-) diff --git a/seilbahn_basics/seilbahn_basics.ino b/seilbahn_basics/seilbahn_basics.ino index 63a6b77..e750d40 100644 --- a/seilbahn_basics/seilbahn_basics.ino +++ b/seilbahn_basics/seilbahn_basics.ino @@ -1,26 +1,39 @@ //Pindefinitionen -#define BTN_ONOFF 2 -#define BTN_SERVICE 3 -#define BTN_FAHRGAST 4 -#define BTN_QUIT 5 +#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 -#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 buttonStateAnlageEinAus = false; +bool currentButtonStateAnlageEinAus = false; -bool currentButtonStateService; -bool buttonStateService; +bool buttonStateStationBesetztUnbesetzt = false; +bool currentButtonStateStationBesetztUnbesetzt = false; -bool currentButtonStateFahrgast; -bool buttonStateFahrgast; +bool buttonStateServicebetrieb = false; +bool currentButtonStateServicebetrieb = false; -bool currentButtonStateQuit; -bool buttonStateQuit; +bool buttonStateFahrgastbetrieb = false; +bool currentButtonStateFahrgastbetrieb = false; + +bool buttonStateQuitBetrieb = false; +bool currentButtonStateQuitBetrieb = false; // Anlagenzustände enum @@ -32,105 +45,209 @@ enum FAHRGAST, } anlagenzustand; +// Fahrtrichtungen +enum +{ + STOP, + VORWÄRTS, + RÜCKWÄRTS, +} fahrtrichtung; + void setup() { anlagenzustand = AUS; - // TODO: pinMode + 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_ONOFF, LOW); - digitalWrite(LED_SERVICE, LOW); - digitalWrite(LED_FAHRGAST, LOW); - digitalWrite(LED_QUIT, LOW); - + 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 - currentButtonStateAnlageEinAus = digitalRead(BTN_ONOFF) == LOW; // Taster abfragen und aktuellen Zustand zwischenspeichern - if (currentButtonStateAnlageEinAus && !buttonStateAnlageEinAus) // Aktuellen Zustand mit vorherigem vergleichen + // Taster abfragen und aktuellen Zustand zwischenspeichern + currentButtonStateAnlageEinAus = digitalRead(KNOPF_ANLAGE_EIN_AUS) == LOW; + // Aktuellen Zustand mit vorherigem vergleichen + if (currentButtonStateAnlageEinAus && !buttonStateAnlageEinAus) { - 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 - } + // 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 Fahrgastzustand, sobald der Zustandswechsel durch den Nutzer quittiert wird - +// Anlage wechselt in den Servicezustand, sobald der Zustandswechsel durch den Nutzer quittiert wird case SERVICE_QUITTIEREN: { // ========== LEDs entsprechend des Zustands setzen - digitalWrite(LED_QUIT, HIGH); - // EVTL blinken - - // ========== Quittieren Button abfragen - currentButtonStateQuit = digitalRead(BTN_QUIT) == LOW; // Taster abfragen und aktuellen Zustand zwischenspeichern - if (currentButtonStateQuit && !buttonStateQuit) // Aktuellen Zustand mit vorherigem vergleichen + 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) { - 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; + // 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_SERVICE, HIGH); - digitalWrite(LED_FAHRGAST, LOW); + 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 STOP: + { + + break; + } + // Anlage fährt vorwärts + case VORWÄRTS: + { + + break; + } + // Anlage fährt rückwärts + case RÜCKWÄRTS: + { + + break; + } + default: + { + break; + } + } // ========== Ein/Aus Button abfragen - currentButtonStateAnlageEinAus = digitalRead(BTN_ONOFF) == LOW; // Taster abfragen und aktuellen Zustand zwischenspeichern - if (currentButtonStateAnlageEinAus && !buttonStateAnlageEinAus) // Aktuellen Zustand mit vorherigem vergleichen + // Taster abfragen und aktuellen Zustand zwischenspeichern + currentButtonStateAnlageEinAus = digitalRead(KNOPF_ANLAGE_EIN_AUS) == LOW; + // Aktuellen Zustand mit vorherigem vergleichen + if (currentButtonStateAnlageEinAus && !buttonStateAnlageEinAus) { - 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 - } + // 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 - currentButtonStateFahrgast = digitalRead(BTN_FAHRGAST) == LOW; // Taster abfragen und aktuellen Zustand zwischenspeichern - if (currentButtonStateFahrgast && !buttonStateFahrgast) // Aktuellen Zustand mit vorherigem vergleichen + // Taster abfragen und aktuellen Zustand zwischenspeichern + currentButtonStateFahrgastbetrieb = digitalRead(KNOPF_FAHRGASTBETRIEB) == LOW; + // Aktuellen Zustand mit vorherigem vergleichen + if (currentButtonStateFahrgastbetrieb && !buttonStateFahrgastbetrieb) { - 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; + // 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 "FAHRGAST_QUITTIEREN" versetzen + anlagenzustand = FAHRGAST_QUITTIEREN; + // Speichern des ButtonStates als Vergleichswert für den nächsten Durchlauf + buttonStateFahrgastbetrieb = currentButtonStateFahrgastbetrieb; + } } break; @@ -138,64 +255,131 @@ void loop() { // #################### 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 + 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) { - 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; + // 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_SERVICE, LOW); - digitalWrite(LED_FAHRGAST, HIGH); + 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; + } + } // ========== Ein/Aus Button abfragen - currentButtonStateAnlageEinAus = digitalRead(BTN_ONOFF) == LOW; // Taster abfragen und aktuellen Zustand zwischenspeichern - if (currentButtonStateAnlageEinAus && !buttonStateAnlageEinAus) // Aktuellen Zustand mit vorherigem vergleichen + // Taster abfragen und aktuellen Zustand zwischenspeichern + currentButtonStateAnlageEinAus = digitalRead(KNOPF_ANLAGE_EIN_AUS) == LOW; + // Aktuellen Zustand mit vorherigem vergleichen + if (currentButtonStateAnlageEinAus && !buttonStateAnlageEinAus) { - 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 - } + // 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 - currentButtonStateService = digitalRead(BTN_SERVICE) == LOW; // Taster abfragen und aktuellen Zustand zwischenspeichern - if (currentButtonStateService && !buttonStateService) // Aktuellen Zustand mit vorherigem vergleichen + // Taster abfragen und aktuellen Zustand zwischenspeichern + currentButtonStateServicebetrieb = digitalRead(KNOPF_SERVICEBETRIEB) == LOW; + // Aktuellen Zustand mit vorherigem vergleichen + if (currentButtonStateServicebetrieb && !buttonStateServicebetrieb) { - 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; + // 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; @@ -207,4 +391,5 @@ void loop() { break; } } + }