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