So könnte es mit den neuen Tasten funktionieren.
Die LEDs der Tasten werden noch nicht angesteuert.
#include <Bounce2.h>
const byte relaisPin_Pumpe = 8;
const byte relaisPin_Reinstwasser = 7;
const byte relaisPin_Leitungswasser = 6;
const byte relaisPin_SpuelVorMembran3 = 5;
const byte relaisPin_SpuelVorMembran2 = 4;
const byte relaisPin_SpuelVorMembran1 = 3;
const byte relaisPin_SpuelNachMembran = 2;
// LED Ausgänge
const byte LED_rot_aus = 28;
const byte LED_gelb_wenig = 29;
const byte LED_gruen_mittel = 30;
const byte LED_blau_viel = 31;
// Taster Eingänge
const byte tasterPin1 = 24; // Eingang Taster abbruch / Stop
const byte tasterPin2 = 25; // Eingang Taster wenig
const byte tasterPin3 = 26; // Eingang Taster mittel
const byte tasterPin4 = 27; // Eingang Taster viel
const unsigned long zeit6H = 21600000UL;
const byte relayPins[] = {
relaisPin_SpuelNachMembran, relaisPin_SpuelVorMembran1,
relaisPin_SpuelVorMembran2, relaisPin_SpuelVorMembran3,
relaisPin_Leitungswasser, relaisPin_Reinstwasser,
relaisPin_Pumpe
};
const byte butLedPins[] = { LED_rot_aus, LED_gelb_wenig, LED_gruen_mittel, LED_blau_viel };
const byte buttonPins[] = { tasterPin1, tasterPin2, tasterPin3, tasterPin4 };
#define NUMBUTTONS sizeof(buttonPins)
enum sels {
selStop, selWenig, selMittel, selViel,
};
enum Zustaende {
unbeschaeftigt,
stopped,
spuelStart, spuelPhase1, spuelPause, spuelPhase2,
shortStart, shortPhase1, shortPause, shortPhase2,
doubleStart, doublePhase1, doublePause, doublePhase2,
longStart, longPhase1, longPause, longPhase2,
};
Bounce key[NUMBUTTONS];
byte aktuellerZustand = unbeschaeftigt;
unsigned long currentMillis;
unsigned long lastTransition;
unsigned long letzteSpuelung;
void setup() {
Serial.begin(250000);
Serial.println(F("Button test"));
for (byte i = 0; i < NUMBUTTONS; i++) {
pinMode(butLedPins[i], OUTPUT);
key[i].attach(buttonPins[i], INPUT_PULLUP);
}
for (byte i = 0; i < sizeof(relayPins); i++) {
digitalWrite(relayPins[i], HIGH);
pinMode(relayPins[i], OUTPUT);
}
}
void loop() {
currentMillis = millis();
for (byte i = 0; i < NUMBUTTONS; i++) {
key[i].update();
}
if (aktuellerZustand != unbeschaeftigt) {
if (key[selStop].fell()) {
if (aktuellerZustand != stopped) {
aktuellerZustand = stopped;
} else {
aktuellerZustand = unbeschaeftigt;
}
}
} else {
if (key[selWenig].fell()) {
aktuellerZustand = shortStart;
} else if (key[selMittel].fell()) {
aktuellerZustand = doubleStart;
} else if (key[selViel].fell()) {
aktuellerZustand = longStart;
}
}
switch (aktuellerZustand) {
case unbeschaeftigt:
if (currentMillis - letzteSpuelung >= zeit6H) {
letzteSpuelung = currentMillis;
aktuellerZustand = spuelStart;
}
break;
case stopped:
break;
case spuelStart:
setupAndGoToState(0b0001111, true, spuelPhase1, PSTR("Test")); // mit 8 0b0101111
break;
case spuelPhase1:
switchAndNewStateAfter(0b0001111, false, spuelPause, 20000); // mit 8 0b0101111
break;
case spuelPause:
switchAndNewStateAfter(0b0001001, true, spuelPhase2, 10); // mit 8 0b0101001
break;
case spuelPhase2:
switchAndNewStateAfter(0b0001001, false, unbeschaeftigt, 15000); // mit 8 0b0101001
break;
case shortStart:
setupAndGoToState(0b0101001, true, shortPhase1, PSTR("300 ml"));
break;
case shortPhase1:
switchAndNewStateAfter(0b0101001, false, shortPause, 15000);
break;
case shortPause:
switchAndNewStateAfter(0b0111000, true, shortPhase2, 500);
break;
case shortPhase2:
switchAndNewStateAfter(0b0111000, false, unbeschaeftigt, 20000);
break;
case doubleStart:
setupAndGoToState(0b0101001, true, doublePhase1, PSTR("1000 ml"));
break;
case doublePhase1:
switchAndNewStateAfter(0b0101001, false, doublePause, 15000);
break;
case doublePause:
switchAndNewStateAfter(0b0111000, true, shortPhase2, 500);
break;
case doublePhase2:
switchAndNewStateAfter(0b0111000, false, unbeschaeftigt, 60000UL);
break;
case longStart:
setupAndGoToState(0b0101001, true, longPhase1, PSTR("8000 ml"));
break;
case longPhase1:
switchAndNewStateAfter(0b0101001, false, longPause, 15000);
break;
case longPause:
switchAndNewStateAfter(0b0111000, true, longPhase2, 500);
break;
case longPhase2:
switchAndNewStateAfter(0b0111000, false, unbeschaeftigt, 480000UL);
break;
}
benchmark();
}
void switchRelaisSet(byte mask, bool toWhat) {
for (byte idx = 1; mask; idx++, mask >>= 1) {
if (mask & 1) {
digitalWrite(relayPins[idx], toWhat ? LOW : HIGH);
}
}
}
void setupAndGoToState(byte mask, bool toWhat, byte newState, char* txt) {
switchRelaisSet(mask, toWhat);
lastTransition = currentMillis;
aktuellerZustand = newState;
Serial.print(F(" "));
Serial.print((__FlashStringHelper*)txt);
Serial.write(' ');
Serial.println(currentMillis);
}
void switchAndNewStateAfter(byte mask, bool toWhat, byte newState, unsigned long duration) {
if (currentMillis - lastTransition >= duration) {
switchRelaisSet(mask, toWhat);
Serial.print(F(" "));
Serial.print(aktuellerZustand);
Serial.print(F(" -> "));
Serial.print(newState);
Serial.print(F(" nach "));
Serial.print(currentMillis - lastTransition);
Serial.println();
lastTransition = currentMillis;
aktuellerZustand = newState;
}
}
void benchmark() {
static unsigned long counterStartTime;
static unsigned long counter;
if (++counter >= 1000000L) {
Serial.print(F("Average Time per loop(): "));
Serial.print((micros() - counterStartTime) / 1000000.0);
Serial.println(F(" microseconds"));
counter = 0;
counterStartTime = micros();
}
}