#define PUMPE A0
#define START_TASTER 2 // Reset
#define RESET_TASTER 3 // Start
#define LED_1 4 // Leermeldung S1
#define LED_2 5 // Niveau 1 S2
#define LED_3 6 // Niveau 2 S3
#define LED_4 7 // Temperatur Sensor S4
#define LED_11 1 // Drucksensor S5
#define LED_5 8 // Zulaufventil 1 Q1
#define LED_6 9 // Zulaufventil 2 Q2
#define LED_7 10 // Ablassventil Q3
#define LED_8 11 // Druckablassventil Q4
#define LED_9 12 // Heizung H
#define LED_10 13 // Rührmotor M
int leds[] = {
LED_1, LED_2, LED_3, LED_4, LED_5,
LED_6, LED_7, LED_8, LED_9, LED_10,
LED_11
};
const int NUM_LEDS = sizeof(leds) / sizeof(leds[0]);
// Zeiten
const unsigned long STEP_TIME = 5000;
const unsigned long FILL_TIME = 5000;
const unsigned long DEBOUNCE = 50;
const unsigned long BLINK_INTERVAL = 500;
// Systemvariablen
int step = 0; // 0 = warten auf Start
unsigned long stepStart = 0;
bool filling = false;
unsigned long fillStart = 0;
bool blinkState = false;
unsigned long lastBlink = 0;
unsigned long lastStartPress = 0;
unsigned long lastResetPress = 0;
// SETUP
void setup() {
pinMode(START_TASTER, INPUT_PULLUP);
pinMode(RESET_TASTER, INPUT_PULLUP);
pinMode(PUMPE, OUTPUT);
pinMode(LED_11, OUTPUT);
for (int i = 0; i < NUM_LEDS; i++)
pinMode(leds[i], OUTPUT);
resetSystem();
}
void loop() {
// --- Reset ---
if (isResetPressed()) {
resetSystem();
}
// --- Warten auf Start ---
if (step == 0) {
if (isStartPressed()) {
step = 1;
stepStart = millis();
}
return;
}
// --- LED-Anzeige für aktuellen Schritt ---
handleStepLEDs();
// --- Füllvorgang in Schritt 5 ---
handleFilling();
if (step == 3 && digitalRead(LED_9) == LOW) {
digitalWrite(LED_11, HIGH);
} else {
digitalWrite(LED_11, LOW);
}
// --- Schrittwechsel ---
if (millis() - stepStart >= STEP_TIME) {
step++;
stepStart = millis();
if (step > NUM_LEDS) step = 0; // zurück zu Warten
}
}
bool isStartPressed() {
if (!digitalRead(START_TASTER)) {
if (millis() - lastStartPress > DEBOUNCE) {
lastStartPress = millis();
return true;
}
}
return false;
}
bool isResetPressed() {
if (!digitalRead(RESET_TASTER)) {
if (millis() - lastResetPress > DEBOUNCE) {
lastResetPress = millis();
return true;
}
}
return false;
}
void resetSystem() {
step = 0;
filling = false;
digitalWrite(PUMPE, LOW);
digitalWrite(LED_11, LOW);
for (int i = 0; i < NUM_LEDS; i++)
digitalWrite(leds[i], LOW);
}
void handleStepLEDs() {
// Blinklogik nur in Schritt 5
if (step == 5 && filling) {
if (millis() - lastBlink >= BLINK_INTERVAL) {
blinkState = !blinkState;
digitalWrite(LED_5, blinkState);
lastBlink = millis();
}
return;
}
for (int i = 0; i < NUM_LEDS; i++)
digitalWrite(leds[i], LOW);
digitalWrite(leds[step - 1], HIGH);
}
void handleFilling() {
if (step == 5 && !filling) {
filling = true;
fillStart = millis();
digitalWrite(PUMPE, HIGH);
blinkState = true;
lastBlink = millis();
}
if (filling && millis() - fillStart >= FILL_TIME) {
filling = false;
digitalWrite(PUMPE, LOW);
digitalWrite(LED_5, LOW);
}
}
Augänge/ventile
Sensoren
Start
Reset