/*
Titel: State Machine (nahe an Original)
Author: Gregor Mausser
Date: 29.04.2026
*/
const int Led_Up = 3;
const int Led_Down = 2;
const int Button_Up = 11;
const int Button_Down = 8;
unsigned long starttime = 0;
long duration = 0;
int direction = 0;
//Überprüfen ob es eine Nummer ist
enum mode {
Up,
Drive_Up,
Down,
Drive_Down
};
mode state = Up;
//Flankenerkennung
bool lastButtonStateUp = HIGH;
bool lastButtonStateDown = HIGH;
void setup() {
Serial.begin(9600);
pinMode(Led_Up, OUTPUT);
pinMode(Led_Down, OUTPUT);
pinMode(Button_Up, INPUT_PULLUP);
pinMode(Button_Down, INPUT_PULLUP);
}
void Flanke_Up() {
bool readingUp = digitalRead(Button_Up);
if (readingUp == LOW && lastButtonStateUp == HIGH) {
state = Drive_Up;
direction = +1;
//Startzeit so setzen, dass aktuelle Position erhalten bleibt
starttime = millis() - duration;
Serial.println("Drive Up");
}
lastButtonStateUp = readingUp;
}
void Flanke_Down() {
bool readingDown = digitalRead(Button_Down);
if (readingDown == LOW && lastButtonStateDown == HIGH) {
state = Drive_Down;
direction = -1;
// wichtig: gleiche Logik!
starttime = millis() - duration;
Serial.println("Drive Down");
}
lastButtonStateDown = readingDown;
}
void Time() {
unsigned long Position = millis();
//Wie lange sich die Rollo bewegt berechnen
long unterschied = Position - starttime;
if (direction == +1) {
duration = unterschied; //hochzählen
}
else if (direction == -1) {
duration = 5000 - unterschied; //runterzählen
}
Serial.print("Dauer: ");
Serial.println(duration);
// Grenzen prüfen
if (duration >= 5000) {
duration = 5000;
state = Up;
Serial.println("Oben erreicht");
}
if (duration <= 0) {
duration = 0;
state = Down;
Serial.println("Unten erreicht");
}
}
void loop() {
Flanke_Up();
Flanke_Down();
switch (state) {
case Up:
digitalWrite(Led_Up, HIGH);
digitalWrite(Led_Down, LOW);
break;
case Down:
digitalWrite(Led_Up, LOW);
digitalWrite(Led_Down, HIGH);
break;
case Drive_Up:
case Drive_Down:
digitalWrite(Led_Up, LOW);
digitalWrite(Led_Down, LOW);
Time();
break;
}
}