First working version with comments

This commit is contained in:
Julian Appel 2025-01-26 20:27:48 +01:00
parent d8faf85e30
commit f0679635da

View File

@ -1,26 +1,39 @@
//Pindefinitionen //Pindefinitionen
#define BTN_ONOFF 2 #define LED_ANLAGE_EIN_AUS 2
#define BTN_SERVICE 3 #define KNOPF_ANLAGE_EIN_AUS 3
#define BTN_FAHRGAST 4
#define BTN_QUIT 5 #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 // Hilfsvariablen zum merken des Zustands
bool currentButtonStateAnlageEinAus; bool buttonStateAnlageEinAus = false;
bool buttonStateAnlageEinAus; bool currentButtonStateAnlageEinAus = false;
bool currentButtonStateService; bool buttonStateStationBesetztUnbesetzt = false;
bool buttonStateService; bool currentButtonStateStationBesetztUnbesetzt = false;
bool currentButtonStateFahrgast; bool buttonStateServicebetrieb = false;
bool buttonStateFahrgast; bool currentButtonStateServicebetrieb = false;
bool currentButtonStateQuit; bool buttonStateFahrgastbetrieb = false;
bool buttonStateQuit; bool currentButtonStateFahrgastbetrieb = false;
bool buttonStateQuitBetrieb = false;
bool currentButtonStateQuitBetrieb = false;
// Anlagenzustände // Anlagenzustände
enum enum
@ -32,105 +45,209 @@ enum
FAHRGAST, FAHRGAST,
} anlagenzustand; } anlagenzustand;
// Fahrtrichtungen
enum
{
STOP,
VORWÄRTS,
RÜCKWÄRTS,
} fahrtrichtung;
void setup() { void setup() {
anlagenzustand = AUS; 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() { void loop() {
switch(anlagenzustand) switch(anlagenzustand)
{ {
// #################### Anlage ausgeschaltet // #################### Anlage ausgeschaltet
case AUS: case AUS:
{ {
// ========== LEDs entsprechend des Zustands setzen // ========== LEDs entsprechend des Zustands setzen
digitalWrite(LED_ONOFF, LOW); digitalWrite(LED_ANLAGE_EIN_AUS, LOW);
digitalWrite(LED_SERVICE, LOW); digitalWrite(LED_STATION_BESETZT_UNBESETZT, LOW);
digitalWrite(LED_FAHRGAST, LOW); digitalWrite(LED_SERVICEBETRIEB, LOW);
digitalWrite(LED_QUIT, 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 // ========== Ein/Aus Button abfragen
currentButtonStateAnlageEinAus = digitalRead(BTN_ONOFF) == LOW; // Taster abfragen und aktuellen Zustand zwischenspeichern // Taster abfragen und aktuellen Zustand zwischenspeichern
if (currentButtonStateAnlageEinAus && !buttonStateAnlageEinAus) // Aktuellen Zustand mit vorherigem vergleichen currentButtonStateAnlageEinAus = digitalRead(KNOPF_ANLAGE_EIN_AUS) == LOW;
// Aktuellen Zustand mit vorherigem vergleichen
if (currentButtonStateAnlageEinAus && !buttonStateAnlageEinAus)
{ {
delay(20); // Warten zum entprellen // Warten zum entprellen
currentButtonStateAnlageEinAus = digitalRead(BTN_ONOFF) == LOW; // Taster abfragen und aktuellen Zustand zwischenspeichern delay(20);
if(currentButtonStateAnlageEinAus == LOW) // Prüfen ob immernoch gedrückt // Taster abfragen und aktuellen Zustand zwischenspeichern
{ currentButtonStateAnlageEinAus = digitalRead(KNOPF_ANLAGE_EIN_AUS) == LOW;
// Taster erfolgreich gedrückt => Anlage einschalten // Prüfen ob immernoch gedrückt
digitalWrite(LED_ONOFF, HIGH); // Betriebs LED einschalten if (currentButtonStateAnlageEinAus == LOW)
anlagenzustand = SERVICE; // Anlage in den Zustand "SERVICE" versetzen und damit starten {
} // 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; buttonStateAnlageEinAus = currentButtonStateAnlageEinAus;
}
} }
break; break;
} }
// #################### Anlage im Service-quittieren Zustand // #################### 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: case SERVICE_QUITTIEREN:
{ {
// ========== LEDs entsprechend des Zustands setzen // ========== LEDs entsprechend des Zustands setzen
digitalWrite(LED_QUIT, HIGH); digitalWrite(LED_QUIT_BETRIEB, HIGH);
// EVTL blinken 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 // ========== Quittieren Button abfragen
currentButtonStateQuit = digitalRead(BTN_QUIT) == LOW; // Taster abfragen und aktuellen Zustand zwischenspeichern // Taster abfragen und aktuellen Zustand zwischenspeichern
if (currentButtonStateQuit && !buttonStateQuit) // Aktuellen Zustand mit vorherigem vergleichen currentButtonStateQuitBetrieb = digitalRead(KNOPF_QUIT_BETRIEB) == LOW;
// Aktuellen Zustand mit vorherigem vergleichen
if (currentButtonStateQuitBetrieb && !buttonStateQuitBetrieb)
{ {
delay(20); // Warten zum entprellen // Warten zum entprellen
currentButtonStateQuit = digitalRead(BTN_QUIT) == LOW; // Taster abfragen und aktuellen Zustand zwischenspeichern delay(20);
if(currentButtonStateQuit == LOW) // Prüfen ob immernoch gedrückt // Taster abfragen und aktuellen Zustand zwischenspeichern
{ currentButtonStateQuitBetrieb = digitalRead(KNOPF_QUIT_BETRIEB) == LOW;
// Taster erfolgreich gedrückt => Zustand wechseln // Prüfen ob immernoch gedrückt
digitalWrite(LED_QUIT, LOW); // LED_QUIT ausschalten if (currentButtonStateQuitBetrieb == LOW)
anlagenzustand = SERVICE; // Anlage in den Zustand "SERVICE" versetzen {
} // Anlage in den Zustand "SERVICE" versetzen
buttonStateQuit = currentButtonStateQuit; anlagenzustand = SERVICE;
digitalWrite(LED_QUIT_BETRIEB, LOW);
// Speichern des ButtonStates als Vergleichswert für den nächsten Durchlauf
buttonStateQuitBetrieb = currentButtonStateQuitBetrieb;
}
} }
break; break;
} }
// #################### Anlage im Servicezustand // #################### Anlage im Servicezustand
case SERVICE: case SERVICE:
{ {
// ========== LEDs entsprechend des Zustands setzen // ========== LEDs entsprechend des Zustands setzen
digitalWrite(LED_SERVICE, HIGH); digitalWrite(LED_SERVICEBETRIEB, HIGH);
digitalWrite(LED_FAHRGAST, LOW); 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 // ========== Ein/Aus Button abfragen
currentButtonStateAnlageEinAus = digitalRead(BTN_ONOFF) == LOW; // Taster abfragen und aktuellen Zustand zwischenspeichern // Taster abfragen und aktuellen Zustand zwischenspeichern
if (currentButtonStateAnlageEinAus && !buttonStateAnlageEinAus) // Aktuellen Zustand mit vorherigem vergleichen currentButtonStateAnlageEinAus = digitalRead(KNOPF_ANLAGE_EIN_AUS) == LOW;
// Aktuellen Zustand mit vorherigem vergleichen
if (currentButtonStateAnlageEinAus && !buttonStateAnlageEinAus)
{ {
delay(20); // Warten zum entprellen // Warten zum entprellen
currentButtonStateAnlageEinAus = digitalRead(BTN_ONOFF) == LOW; // Taster abfragen und aktuellen Zustand zwischenspeichern delay(20);
if(currentButtonStateAnlageEinAus == LOW) // Prüfen ob immernoch gedrückt // Taster abfragen und aktuellen Zustand zwischenspeichern
{ currentButtonStateAnlageEinAus = digitalRead(KNOPF_ANLAGE_EIN_AUS) == LOW;
// Taster erfolgreich gedrückt => Anlage ausschalten // Prüfen ob immernoch gedrückt
anlagenzustand = AUS; // Anlage in den Zustand "AUS" versetzen 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; buttonStateAnlageEinAus = currentButtonStateAnlageEinAus;
}
} }
// ========== Fahrgast Button abfragen // ========== Fahrgast Button abfragen
currentButtonStateFahrgast = digitalRead(BTN_FAHRGAST) == LOW; // Taster abfragen und aktuellen Zustand zwischenspeichern // Taster abfragen und aktuellen Zustand zwischenspeichern
if (currentButtonStateFahrgast && !buttonStateFahrgast) // Aktuellen Zustand mit vorherigem vergleichen currentButtonStateFahrgastbetrieb = digitalRead(KNOPF_FAHRGASTBETRIEB) == LOW;
// Aktuellen Zustand mit vorherigem vergleichen
if (currentButtonStateFahrgastbetrieb && !buttonStateFahrgastbetrieb)
{ {
delay(20); // Warten zum entprellen // Warten zum entprellen
currentButtonStateFahrgast = digitalRead(BTN_FAHRGAST) == LOW; // Taster abfragen und aktuellen Zustand zwischenspeichern delay(20);
if(currentButtonStateFahrgast == LOW) // Prüfen ob immernoch gedrückt // Taster abfragen und aktuellen Zustand zwischenspeichern
{ currentButtonStateFahrgastbetrieb = digitalRead(KNOPF_FAHRGASTBETRIEB) == LOW;
// Taster erfolgreich gedrückt => Zustand wechseln // Prüfen ob immernoch gedrückt
anlagenzustand = FAHRGAST_QUITTIEREN; // Anlage in den Zustand "FAHRGAST_QUITTIEREN" versetzen if (currentButtonStateFahrgastbetrieb == LOW)
} {
buttonStateFahrgast = currentButtonStateFahrgast; // Anlage in den Zustand "FAHRGAST_QUITTIEREN" versetzen
anlagenzustand = FAHRGAST_QUITTIEREN;
// Speichern des ButtonStates als Vergleichswert für den nächsten Durchlauf
buttonStateFahrgastbetrieb = currentButtonStateFahrgastbetrieb;
}
} }
break; break;
@ -138,64 +255,131 @@ void loop() {
// #################### Anlage im Fahrgast-quittieren Zustand // #################### Anlage im Fahrgast-quittieren Zustand
// Anlage wechselt in den Fahrgastzustand, sobald der Zustandswechsel durch den Nutzer quittiert wird // Anlage wechselt in den Fahrgastzustand, sobald der Zustandswechsel durch den Nutzer quittiert wird
case FAHRGAST_QUITTIEREN: case FAHRGAST_QUITTIEREN:
{ {
// ========== LEDs entsprechend des Zustands setzen // ========== LEDs entsprechend des Zustands setzen
digitalWrite(LED_QUIT, HIGH); 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 // ========== Quittieren Button abfragen
currentButtonStateQuit = digitalRead(BTN_QUIT) == LOW; // Taster abfragen und aktuellen Zustand zwischenspeichern // Taster abfragen und aktuellen Zustand zwischenspeichern
if (currentButtonStateQuit && !buttonStateQuit) // Aktuellen Zustand mit vorherigem vergleichen currentButtonStateQuitBetrieb = digitalRead(KNOPF_QUIT_BETRIEB) == LOW;
// Aktuellen Zustand mit vorherigem vergleichen
if (currentButtonStateQuitBetrieb && !buttonStateQuitBetrieb)
{ {
delay(20); // Warten zum entprellen // Warten zum entprellen
currentButtonStateQuit = digitalRead(BTN_QUIT) == LOW; // Taster abfragen und aktuellen Zustand zwischenspeichern delay(20);
if(currentButtonStateQuit == LOW) // Prüfen ob immernoch gedrückt // Taster abfragen und aktuellen Zustand zwischenspeichern
{ currentButtonStateQuitBetrieb = digitalRead(KNOPF_QUIT_BETRIEB) == LOW;
// Taster erfolgreich gedrückt => Zustand wechseln // Prüfen ob immernoch gedrückt
digitalWrite(LED_QUIT, LOW); // LED_QUIT ausschalten if (currentButtonStateQuitBetrieb == LOW)
anlagenzustand = FAHRGAST; // Anlage in den Zustand "FAHRGAST" versetzen {
} // Anlage in den Zustand "SERVICE" versetzen
buttonStateQuit = currentButtonStateQuit; anlagenzustand = SERVICE;
digitalWrite(LED_QUIT_BETRIEB, LOW);
// Speichern des ButtonStates als Vergleichswert für den nächsten Durchlauf
buttonStateQuitBetrieb = currentButtonStateQuitBetrieb;
}
} }
break; break;
} }
// #################### Anlage im Fahrgastzustand // #################### Anlage im Fahrgastzustand
case FAHRGAST: case FAHRGAST:
{ {
// ========== LEDs entsprechend des Zustands setzen // ========== LEDs entsprechend des Zustands setzen
digitalWrite(LED_SERVICE, LOW); digitalWrite(LED_SERVICEBETRIEB, LOW);
digitalWrite(LED_FAHRGAST, HIGH); 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 // ========== Ein/Aus Button abfragen
currentButtonStateAnlageEinAus = digitalRead(BTN_ONOFF) == LOW; // Taster abfragen und aktuellen Zustand zwischenspeichern // Taster abfragen und aktuellen Zustand zwischenspeichern
if (currentButtonStateAnlageEinAus && !buttonStateAnlageEinAus) // Aktuellen Zustand mit vorherigem vergleichen currentButtonStateAnlageEinAus = digitalRead(KNOPF_ANLAGE_EIN_AUS) == LOW;
// Aktuellen Zustand mit vorherigem vergleichen
if (currentButtonStateAnlageEinAus && !buttonStateAnlageEinAus)
{ {
delay(20); // Warten zum entprellen // Warten zum entprellen
currentButtonStateAnlageEinAus = digitalRead(BTN_ONOFF) == LOW; // Taster abfragen und aktuellen Zustand zwischenspeichern delay(20);
if(currentButtonStateAnlageEinAus == LOW) // Prüfen ob immernoch gedrückt // Taster abfragen und aktuellen Zustand zwischenspeichern
{ currentButtonStateAnlageEinAus = digitalRead(KNOPF_ANLAGE_EIN_AUS) == LOW;
// Taster erfolgreich gedrückt => Anlage ausschalten // Prüfen ob immernoch gedrückt
anlagenzustand = AUS; // Anlage in den Zustand "AUS" versetzen 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; buttonStateAnlageEinAus = currentButtonStateAnlageEinAus;
}
} }
// ========== Service Button abfragen // ========== Service Button abfragen
currentButtonStateService = digitalRead(BTN_SERVICE) == LOW; // Taster abfragen und aktuellen Zustand zwischenspeichern // Taster abfragen und aktuellen Zustand zwischenspeichern
if (currentButtonStateService && !buttonStateService) // Aktuellen Zustand mit vorherigem vergleichen currentButtonStateServicebetrieb = digitalRead(KNOPF_SERVICEBETRIEB) == LOW;
// Aktuellen Zustand mit vorherigem vergleichen
if (currentButtonStateServicebetrieb && !buttonStateServicebetrieb)
{ {
delay(20); // Warten zum entprellen // Warten zum entprellen
currentButtonStateService = digitalRead(BTN_SERVICE) == LOW; // Taster abfragen und aktuellen Zustand zwischenspeichern delay(20);
if(currentButtonStateService == LOW) // Prüfen ob immernoch gedrückt // Taster abfragen und aktuellen Zustand zwischenspeichern
{ currentButtonStateServicebetrieb = digitalRead(KNOPF_SERVICEBETRIEB) == LOW;
// Taster erfolgreich gedrückt => Zustand wechseln // Prüfen ob immernoch gedrückt
anlagenzustand = SERVICE_QUITTIEREN; // Anlage in den Zustand "SERVICE_QUITTIEREN" versetzen if (currentButtonStateServicebetrieb == LOW)
} {
buttonStateService = currentButtonStateService; // Anlage in den Zustand "SERVICE_QUITTIEREN" versetzen
anlagenzustand = SERVICE_QUITTIEREN;
// Speichern des ButtonStates als Vergleichswert für den nächsten Durchlauf
buttonStateServicebetrieb = currentButtonStateServicebetrieb;
}
} }
break; break;
@ -207,4 +391,5 @@ void loop() {
break; break;
} }
} }
} }