diff --git a/seilbahn_basics/seilbahn_basics.ino b/seilbahn_basics/seilbahn_basics.ino index 7daed76..16eda8f 100644 --- a/seilbahn_basics/seilbahn_basics.ino +++ b/seilbahn_basics/seilbahn_basics.ino @@ -18,6 +18,20 @@ #define LED_QUIT_BETRIEB 9 #define KNOPF_QUIT_BETRIEB 10 +#define LED_START_BETRIEB 36 +#define KNOPF_START_BETRIEB 37 + +#define LED_HALT 38 +#define KNOPF_HALT 39 + +#define LED_NOTHALT 40 +#define KNOPF_NOTHALT 41 + +#define LED_VORWAERTS 30 +#define KNOPF_VORWAERTS 31 + +#define LED_RUECKWAERTS 32 +#define KNOPF_RUECKWAERTS 33 // Hilfsvariablen zum merken des Zustands bool buttonStateAnlageEinAus = false; @@ -35,6 +49,15 @@ bool currentButtonStateFahrgastbetrieb = false; bool buttonStateQuitBetrieb = false; bool currentButtonStateQuitBetrieb = false; +bool buttonStateStart = false; +bool currentButtonStateStart = false; + +bool buttonStateHalt = false; +bool currentButtonStateHalt = false; + +bool buttonStateNothalt = false; +bool currentButtonStateNothalt = false; + bool buttonStateVorwaerts = false; bool currentButtonStateVorwaerts = false; @@ -54,65 +77,150 @@ enum // Fahrtrichtungen enum Fahrtrichtung { - HALT, - NOTHALT, - WARTE_START, - VORWAERTS_QUITTIEREN, - VORWAERTS, - RUECKWAERTS_QUITTIEREN, - RUECKWAERTS, + HALT, // Anlage steht + NOTHALT, // Anlage steht (Notstop) + VORWAERTS_QUITTIEREN, // Richtungsknopf vorwärts gedrückt, warte auf quittieren + WARTE_START_VORWAERTS, // Anlage steht und wartet auf starten (in die entsprechende Richtung) + VORWAERTS, // Anlage fährt vorwärts + RUECKWAERTS_QUITTIEREN, // Richtungsknopf rückwärts gedrückt, warte auf quittieren + WARTE_START_RUECKWAERTS, // Anlage steht und wartet auf starten (in die entsprechende Richtung) + RUECKWAERTS, // Anlage fährt rückwärts } fahrtrichtung; -Fahrtrichtung vorherigerichtung = HALT; +Fahrtrichtung vorherigeRichtung = HALT; void quittierenButtonAbfragen() { - // Button Code [...] - if(fahrtrichtung == NOTHALT || fahrtrichtung == HALT) + // ========== 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) { - fahrtrichtung = WARTE_START; - } - else if(fahrtrichtung == VORWAERTS_QUITTIEREN) - { - fahrtrichtung = WARTE_START; - } - else if(fahrtrichtung == RUECKWAERTS_QUITTIEREN) - { - fahrtrichtung = WARTE_START; - } - // Button Code [...] + // Knopf gedrückt => Code ausführen + // ============================================================ + switch(fahrtrichtung) + { + case HALT: + case NOTHALT: + if(vorherigeRichtung == RUECKWAERTS) + { + fahrtrichtung = WARTE_START_RUECKWAERTS; + } + else + { + fahrtrichtung = WARTE_START_VORWAERTS; + } + break; + + case VORWAERTS_QUITTIEREN: + fahrtrichtung = WARTE_START_VORWAERTS; + break; + + case RUECKWAERTS_QUITTIEREN: + fahrtrichtung = WARTE_START_RUECKWAERTS; + break; + } + // ============================================================ + // Speichern des ButtonStates als Vergleichswert für den nächsten Durchlauf + buttonStateQuitBetrieb = currentButtonStateQuitBetrieb; + } + } } void startButtonAbfragen() { - // Button Code [...] - if(vorherigerichtung == VORWAERTS) + // ========== Start Button abfragen + // Taster abfragen und aktuellen Zustand zwischenspeichern + currentButtonStateStart = digitalRead(KNOPF_START_BETRIEB) == LOW; + // Aktuellen Zustand mit vorherigem vergleichen + if (currentButtonStateStart && !buttonStateStart) + { + // Warten zum entprellen + delay(20); + // Taster abfragen und aktuellen Zustand zwischenspeichern + currentButtonStateStart = digitalRead(KNOPF_START_BETRIEB) == LOW; + // Prüfen ob immernoch gedrückt + if (currentButtonStateStart == LOW) { - fahrtrichtung = RUECKWAERTS; - } - else if(vorherigerichtung == RUECKWAERTS) - { - fahrtrichtung = VORWAERTS; - } - else - { - fahrtrichtung = VORWAERTS; - } - // Button Code [...] + // Knopf gedrückt => Code ausführen + // ============================================================ + switch(fahrtrichtung) + { + case WARTE_START_VORWAERTS: + fahrtrichtung = VORWAERTS; + vorherigeRichtung = VORWAERTS; + break; + + case WARTE_START_RUECKWAERTS: + fahrtrichtung = RUECKWAERTS; + vorherigeRichtung = RUECKWAERTS; + break; + } + // ============================================================ + // Speichern des ButtonStates als Vergleichswert für den nächsten Durchlauf + buttonStateStart = currentButtonStateStart; + } + } } +// FERTIG void haltButtonAbfragen() { - // Button Code [...] - fahrtrichtung = HALT; - // Button Code [...] + // ========== Start Button abfragen + // Taster abfragen und aktuellen Zustand zwischenspeichern + currentButtonStateHalt = digitalRead(KNOPF_START_BETRIEB) == LOW; + // Aktuellen Zustand mit vorherigem vergleichen + if (currentButtonStateHalt && !buttonStateHalt) + { + // Warten zum entprellen + delay(20); + // Taster abfragen und aktuellen Zustand zwischenspeichern + currentButtonStateHalt = digitalRead(KNOPF_START_BETRIEB) == LOW; + // Prüfen ob immernoch gedrückt + if (currentButtonStateHalt == LOW) + { + // Knopf gedrückt => Code ausführen + // ============================================================ + fahrtrichtung = HALT; + // ============================================================ + // Speichern des ButtonStates als Vergleichswert für den nächsten Durchlauf + buttonStateHalt = currentButtonStateHalt; + } + } } +//FERTIG void nothaltButtonAbfragen() { - // Button Code [...] - fahrtrichtung = NOTHALT; - // Button Code [...] + // ========== Start Button abfragen + // Taster abfragen und aktuellen Zustand zwischenspeichern + currentButtonStateNothalt = digitalRead(KNOPF_START_BETRIEB) == LOW; + // Aktuellen Zustand mit vorherigem vergleichen + if (currentButtonStateNothalt && !buttonStateNothalt) + { + // Warten zum entprellen + delay(20); + // Taster abfragen und aktuellen Zustand zwischenspeichern + currentButtonStateNothalt = digitalRead(KNOPF_START_BETRIEB) == LOW; + // Prüfen ob immernoch gedrückt + if (currentButtonStateNothalt == LOW) + { + // Knopf gedrückt => Code ausführen + // ============================================================ + fahrtrichtung = NOTHALT; + // ============================================================ + // Speichern des ButtonStates als Vergleichswert für den nächsten Durchlauf + buttonStateNothalt = currentButtonStateNothalt; + } + } } //FERTIG @@ -133,8 +241,9 @@ void vorwaertsButtonAbfragen() { // Knopf gedrückt => Code ausführen // ============================================================ - fahrtrichtung = VORWAERTS_QUITTIEREN; - // ============================================================ + // In jeder beliebigen Fahrtrichtung, Fahrtrichtung Ändern (HALT, NOTHALT, RUECKWAERTS_QUITTIEREN, ) + fahrtrichtung = VORWAERTS_QUITTIEREN; + // ============================================================ // Speichern des ButtonStates als Vergleichswert für den nächsten Durchlauf buttonStateVorwaerts = currentButtonStateVorwaerts; } @@ -159,8 +268,8 @@ void rueckwaertsButtonAbfragen() { // Knopf gedrückt => Code ausführen // ============================================================ - fahrtrichtung = RUECKWAERTS_QUITTIEREN; - // ============================================================ + fahrtrichtung = RUECKWAERTS_QUITTIEREN; + // ============================================================ // Speichern des ButtonStates als Vergleichswert für den nächsten Durchlauf buttonStateRueckwaerts = currentButtonStateRueckwaerts; } @@ -284,7 +393,6 @@ void loop() { buttonStateQuitBetrieb = currentButtonStateQuitBetrieb; } } - break; } @@ -304,48 +412,64 @@ void loop() { // Anlage steht case HALT: { - quittierenButtonAbfragen(); - vorwaertsButtonAbfragen(); - rueckwaertsButtonAbfragen(); + quittierenButtonAbfragen(); // => "WARTE_START" Anhand Richtung + vorwaertsButtonAbfragen(); // => "VORWAERTS_QUITTIEREN" + rueckwaertsButtonAbfragen(); // => "RUECKWAERTS_QUITTIEREN" break; } // Anlage steht case NOTHALT: { - quittierenButtonAbfragen(); - vorwaertsButtonAbfragen(); - rueckwaertsButtonAbfragen(); + quittierenButtonAbfragen(); // => "WARTE_START" + vorwaertsButtonAbfragen(); // => "VORWAERTS_QUITTIEREN" + rueckwaertsButtonAbfragen(); // => "RUECKWAERTS_QUITTIEREN" break; } // Anlage steht - case WARTE_START: - { - startButtonAbfragen(); - break; - } + + // Anlage fährt vorwärts case VORWAERTS_QUITTIEREN: { - + quittierenButtonAbfragen(); // => "WARTE_START_VORWAERTS" + haltButtonAbfragen(); // => "HALT" + nothaltButtonAbfragen(); // => "NOTHALT" + rueckwaertsButtonAbfragen(); // => "RUECKWAERTS_QUITTIEREN" + break; + } + + case WARTE_START_VORWAERTS: + { + startButtonAbfragen(); // => "VORWAERTS" break; } // Anlage fährt vorwärts case VORWAERTS: { - haltButtonAbfragen(); - nothaltButtonAbfragen(); + haltButtonAbfragen(); // => "HALT" + nothaltButtonAbfragen(); // => "NOTHALT" break; } // Anlage fährt rückwärts case RUECKWAERTS_QUITTIEREN: { + quittierenButtonAbfragen(); // => "WARTE_START_RUECKWAERTS" + haltButtonAbfragen(); // => "HALT" + nothaltButtonAbfragen(); // => "NOTHALT" + vorwaertsButtonAbfragen(); // => "VORWAERTS_QUITTIEREN" + break; + } + + case WARTE_START_RUECKWAERTS: + { + startButtonAbfragen(); // => "RUECKWAERTS" break; } // Anlage fährt rückwärts case RUECKWAERTS: { - haltButtonAbfragen(); - nothaltButtonAbfragen(); + haltButtonAbfragen(); // => "HALT" + nothaltButtonAbfragen(); // => "NOTHALT" break; } default: @@ -469,13 +593,13 @@ void loop() { break; } // Anlage fährt vorwärts - case VORWÄRTS: + case VORWAERTS: { break; } // Anlage fährt rückwärts - case RÜCKWÄRTS: + case RUECKWAERTS: { break;