/**************
Name: Ivan Ivanov
Datum: 11.04.2024
Übung: Rollo Steuerung mit Statemachine
**********/
#define LEDOBEN 5
#define LEDUNTEN 6
#define TASTERAUF 2
#define TASTERZU 3
#define ROLLO_LAUFZEIT 5000 // 5 Sekunden
#define STOPP_ZEIT_UNTEN 2000 // Rollo stoppt nach 2 Sekunden unten
#define STOPP_ZEIT_OBEN 3000 // Rollo stoppt nach 3 Sekunden oben
enum Zustand {
OBEN,
ZU,
AUF,
UNTEN,
STOP
};
Zustand state = STOP;
unsigned long rolloStartTime = 0;
bool tasterAufPressed = false;
bool tasterZuPressed = false;
void setup() {
pinMode(LEDOBEN, OUTPUT);
pinMode(LEDUNTEN, OUTPUT);
pinMode(TASTERAUF, INPUT_PULLUP);
pinMode(TASTERZU, INPUT_PULLUP);
}
void loop() {
switch (state) {
case OBEN:
digitalWrite(LEDOBEN, HIGH);
digitalWrite(LEDUNTEN, LOW);
break;
case ZU:
digitalWrite(LEDOBEN, LOW);
blinkLED(LEDUNTEN);
break;
case AUF:
blinkLED(LEDOBEN);
digitalWrite(LEDUNTEN, LOW);
break;
case UNTEN:
digitalWrite(LEDOBEN, LOW);
digitalWrite(LEDUNTEN, HIGH);
break;
case STOP:
digitalWrite(LEDOBEN, LOW);
digitalWrite(LEDUNTEN, LOW);
break;
}
delay(100);
// Taster überprüfen
if (digitalRead(TASTERAUF) == LOW && !tasterAufPressed) {
tasterAufPressed = true;
startRollo(AUF);
} else if (digitalRead(TASTERZU) == LOW && !tasterZuPressed) {
tasterZuPressed = true;
startRollo(ZU);
}
// Überprüfe ob Rollo gestoppt werden muss
if (state == UNTEN && millis() - rolloStartTime >= STOPP_ZEIT_UNTEN) {
state = STOP;
} else if (state == OBEN && millis() - rolloStartTime >= STOPP_ZEIT_OBEN) {
state = STOP;
}
// Zurücksetzen der Tasterzustände
if (digitalRead(TASTERAUF) == HIGH) {
tasterAufPressed = false;
}
if (digitalRead(TASTERZU) == HIGH) {
tasterZuPressed = false;
}
}
void startRollo(Zustand newState) {
state = newState;
rolloStartTime = millis();
}
void blinkLED(int pin) {
static unsigned long previousMillis = 0;
static bool ledState = LOW;
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= 500) {
previousMillis = currentMillis;
if (ledState == LOW) {
ledState = HIGH;
} else {
ledState = LOW;
}
digitalWrite(pin, ledState);
}
}