Seilbahn/seilbahn_basics/seilbahn_basics.ino

210 lines
9.0 KiB
C++

//Pindefinitionen
#define BTN_ONOFF 2
#define BTN_SERVICE 3
#define BTN_FAHRGAST 4
#define BTN_QUIT 5
#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 currentButtonStateService;
bool buttonStateService;
bool currentButtonStateFahrgast;
bool buttonStateFahrgast;
bool currentButtonStateQuit;
bool buttonStateQuit;
// Anlagenzustände
enum
{
AUS,
SERVICE_QUITTIEREN,
SERVICE,
FAHRGAST_QUITTIEREN,
FAHRGAST,
} anlagenzustand;
void setup() {
anlagenzustand = AUS;
// TODO: pinMode
}
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);
// ========== Ein/Aus Button abfragen
currentButtonStateAnlageEinAus = digitalRead(BTN_ONOFF) == LOW; // Taster abfragen und aktuellen Zustand zwischenspeichern
if (currentButtonStateAnlageEinAus && !buttonStateAnlageEinAus) // Aktuellen Zustand mit vorherigem vergleichen
{
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
}
buttonStateAnlageEinAus = currentButtonStateAnlageEinAus;
}
break;
}
// #################### Anlage im Service-quittieren Zustand
// Anlage wechselt in den Fahrgastzustand, sobald der Zustandswechsel durch den Nutzer quittiert wird
case SERVICE_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
{
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;
}
break;
}
// #################### Anlage im Servicezustand
case SERVICE:
{
// ========== LEDs entsprechend des Zustands setzen
digitalWrite(LED_SERVICE, HIGH);
digitalWrite(LED_FAHRGAST, LOW);
// ========== Ein/Aus Button abfragen
currentButtonStateAnlageEinAus = digitalRead(BTN_ONOFF) == LOW; // Taster abfragen und aktuellen Zustand zwischenspeichern
if (currentButtonStateAnlageEinAus && !buttonStateAnlageEinAus) // Aktuellen Zustand mit vorherigem vergleichen
{
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 und damit starten
}
buttonStateAnlageEinAus = currentButtonStateAnlageEinAus;
}
// ========== Fahrgast Button abfragen
currentButtonStateFahrgast = digitalRead(BTN_FAHRGAST) == LOW; // Taster abfragen und aktuellen Zustand zwischenspeichern
if (currentButtonStateFahrgast && !buttonStateFahrgast) // Aktuellen Zustand mit vorherigem vergleichen
{
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;
}
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, HIGH);
// ========== Quittieren Button abfragen
currentButtonStateQuit = digitalRead(BTN_QUIT) == LOW; // Taster abfragen und aktuellen Zustand zwischenspeichern
if (currentButtonStateQuit && !buttonStateQuit) // Aktuellen Zustand mit vorherigem vergleichen
{
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;
}
break;
}
// #################### Anlage im Fahrgastzustand
case FAHRGAST:
{
// ========== LEDs entsprechend des Zustands setzen
digitalWrite(LED_SERVICE, LOW);
digitalWrite(LED_FAHRGAST, HIGH);
// ========== Ein/Aus Button abfragen
currentButtonStateAnlageEinAus = digitalRead(BTN_ONOFF) == LOW; // Taster abfragen und aktuellen Zustand zwischenspeichern
if (currentButtonStateAnlageEinAus && !buttonStateAnlageEinAus) // Aktuellen Zustand mit vorherigem vergleichen
{
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 und damit starten
}
buttonStateAnlageEinAus = currentButtonStateAnlageEinAus;
}
// ========== Service Button abfragen
currentButtonStateService = digitalRead(BTN_SERVICE) == LOW; // Taster abfragen und aktuellen Zustand zwischenspeichern
if (currentButtonStateService && !buttonStateService) // Aktuellen Zustand mit vorherigem vergleichen
{
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;
}
break;
}
// ####################
default:
{
break;
}
}
}