Seilbahn/seilbahn_basics/seilbahn_basics.ino

499 lines
16 KiB
C++

//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;
}
}
}