#define MOTOR_EN 9 // PWM-Pin (Enable)
#define MOTOR_IN1 10 // Richtung
#define MOTOR_IN2 8 // Richtung
enum State { STARTUP, RUN, COOLDOWN, OFF, FULLPOWER, FULLSTOP };
State state = STARTUP;
unsigned long stateStartTime = 0;
unsigned long currentMillis = 0;
int pwmValue = 0; // für sanftes Hoch-/Runterfahren
void setup() {
pinMode(MOTOR_EN, OUTPUT);
pinMode(MOTOR_IN1, OUTPUT);
pinMode(MOTOR_IN2, OUTPUT);
digitalWrite(MOTOR_IN1, HIGH); // Richtung festlegen
digitalWrite(MOTOR_IN2, LOW);
Serial.begin(9600);
stateStartTime = millis();
}
void loop() {
currentMillis = millis();
switch (state) {
case STARTUP: // Schnell hochfahren
if (pwmValue < 255) {
pwmValue += 15; // Schrittgröße
analogWrite(MOTOR_EN, pwmValue);
delay(30); // kurze Rampenzeit
} else {
state = RUN;
stateStartTime = currentMillis;
}
break;
case RUN: // 3s an
analogWrite(MOTOR_EN, 255);
if (currentMillis - stateStartTime >= 3000) {
state = COOLDOWN;
stateStartTime = currentMillis;
}
break;
case COOLDOWN: // Schnell herunterfahren
if (pwmValue > 0) {
pwmValue -= 15;
analogWrite(MOTOR_EN, pwmValue);
delay(30);
} else {
state = OFF;
stateStartTime = currentMillis;
}
break;
case OFF: // 2s aus
analogWrite(MOTOR_EN, 0);
if (currentMillis - stateStartTime >= 2000) {
state = FULLPOWER; // -> weiter zum neuen Zyklus
stateStartTime = currentMillis;
}
break;
case FULLPOWER: // Direkt volle Leistung, 3s
analogWrite(MOTOR_EN, 255);
if (currentMillis - stateStartTime >= 3000) {
state = FULLSTOP;
stateStartTime = currentMillis;
}
break;
case FULLSTOP: // Motor aus, 2s
analogWrite(MOTOR_EN, 0);
if (currentMillis - stateStartTime >= 2000) {
state = STARTUP; // von vorne beginnen
stateStartTime = currentMillis;
}
break;
}
}