Du könntest die Potis mit einer Skala ausstatten, aber besser fände ich ein Display wo echte Zeiten angezeigt werden.
hier hätte ich einen Ablauf
IDLE, WAIT, A+B, B, retour ins IDLE:
// https://forum.arduino.cc/t/anfanger-werte-vor-programmstart-abfragen/1004723/
constexpr byte startPin {8};
constexpr byte relayA {9};
constexpr byte relayB {10};
// HIGH heißt, das Relay ist HIGH activ
constexpr byte relayOn {HIGH};
constexpr byte relayOff {LOW};
// Variante wenn Relay LOW active sind:
//constexpr byte relayOn {LOW};
//constexpr byte relayOff {HIGH};
//constexpr uint32_t factor {100UL}; // testweise von millisekunden auf Zehntel-Sekunden
constexpr uint32_t factor {1000UL}; // testweise von millisekunden auf Sekunden
//constexpr uint32_t factor {60*1000UL}; // am Schluss von millisekunden auf Minuten
uint16_t waittime {10}; // Startverzögerung
uint16_t runtimeA {60}; // Laufzeit Relay A
uint16_t runtimeB {90}; // Laufzeit Relay B
uint32_t previousMillis;
enum class Status {
IDLE, // warten auf Startbutton
WAIT, // Verzögerungszeit
ON_A_B, // A und B sind ein
ON_B, // nur B ist ein
} status;
void setup() {
Serial.begin(115200);
digitalWrite(relayA, relayOff);
digitalWrite(relayB, relayOff);
pinMode(relayA, OUTPUT);
pinMode(relayB, OUTPUT);
pinMode(startPin, INPUT_PULLUP);
// bestimmen der Startverzögerung
// waittime = analogRead(A0);
// bestimmen der Laufzeit Relay A
// waittime = analogRead(A1);
// bestimmen der Laufzeit Relay B
// waittime = analogRead(A2);
}
void loop() {
switch (status)
{
case Status::IDLE :
if (digitalRead(startPin) == LOW)
{
Serial.println(F("gestartet, Zeit merken und in den nächsten Status wechseln"));
previousMillis = millis();
status = Status::WAIT;
}
break;
case Status::WAIT :
if (millis() - previousMillis > waittime * factor)
{
Serial.println(F("die Wartezeit ist zu Ende, A und B einschalten, Zeit merken"));
previousMillis = millis();
digitalWrite(relayA, relayOn);
digitalWrite(relayB, relayOn);
status = Status::ON_A_B;
}
break;
case Status::ON_A_B :
if (millis() - previousMillis > runtimeA * factor)
{
Serial.println(F("Laufzeit A erreicht, A abschalten, B läuft weiter"));
digitalWrite(relayA, relayOff);
status = Status::ON_B;
}
case Status::ON_B :
if (millis() - previousMillis > runtimeB * factor)
{
Serial.println(F("Laufzeit B erreicht, abschalten und zurück zu IDLE"));
digitalWrite(relayB, relayOff);
status = Status::IDLE;
}
break;
}
}
sind halt aktuell 10, 60, 90 Sekunden.
edit:
oder mit schmutzigen delays, aber das gewöhnst dir aber am besten gleich gar nicht an:
// https://forum.arduino.cc/t/anfanger-werte-vor-programmstart-abfragen/1004723/
// dirty delay
constexpr byte startPin {8};
constexpr byte relayA {9};
constexpr byte relayB {10};
// HIGH heißt, das Relay ist HIGH activ
constexpr byte relayOn {HIGH};
constexpr byte relayOff {LOW};
// Variante wenn Relay LOW active sind:
//constexpr byte relayOn {LOW};
//constexpr byte relayOff {HIGH};
//constexpr uint32_t factor {100UL}; // testweise von millisekunden auf Zehntel-Sekunden
constexpr uint32_t factor {1000UL}; // testweise von millisekunden auf Sekunden
//constexpr uint32_t factor {60*1000UL}; // am Schluss von millisekunden auf Minuten
uint16_t waittime {10}; // Startverzögerung
uint16_t runtimeA {60}; // Laufzeit Relay A
uint16_t runtimeB {90}; // Laufzeit Relay B
uint32_t previousMillis;
enum class Status {
IDLE, // warten auf Startbutton
WAIT, // Verzögerungszeit
ON_A_B, // A und B sind ein
ON_B, // nur B ist ein
} status;
void setup() {
Serial.begin(115200);
digitalWrite(relayA, relayOff);
digitalWrite(relayB, relayOff);
pinMode(relayA, OUTPUT);
pinMode(relayB, OUTPUT);
pinMode(startPin, INPUT_PULLUP);
// bestimmen der Startverzögerung
// waittime = analogRead(A0);
// bestimmen der Laufzeit Relay A
// waittime = analogRead(A1);
// bestimmen der Laufzeit Relay B
// waittime = analogRead(A2);
}
void loop() {
if (digitalRead(startPin) == LOW)
{
Serial.println(F("gestartet, Zeit merken und in den nächsten Status wechseln"));
delay(waittime * factor);
//
Serial.println(F("die Wartezeit ist zu Ende, A und B einschalten"));
digitalWrite(relayA, relayOn);
digitalWrite(relayB, relayOn);
delay(runtimeA * factor);
//
Serial.println(F("Laufzeit A erreicht, A abschalten, B läuft weiter"));
digitalWrite(relayA, relayOff);
delay(runtimeA * factor);
//
Serial.println(F("Laufzeit B erreicht, abschalten und zurück zu IDLE"));
digitalWrite(relayB, relayOff);
}
}