Anfänger Probz mit zeitverzögerungen

neuron74:
button lo --> relais 1 an , led 1 blinkt während des drückens
button lu kurz ---> relais 1 aus. led 1 wie oben
button lu lang ---> relais 1 aus nach 30 sekunden, led 1&2 blinken abwechselnd wenn timer aktiviert

den aus der Nacht verwertet

// Forensketch - basiert auf https://forum.arduino.cc/index.php?topic=733809.msg4937469#msg4937469
// nur links 
// kommentiert und kompiliert

const byte lo = 2;
const byte lu = 3;
const byte led1 = 10;
const byte rel1 = 11;

const byte led2 = 9;
const byte rel2 = 12;
const unsigned int ontime = 1000 * 30;
unsigned long bouncetime = 50; // Zeit in ms
void setup()
{
  Serial.begin(115200);
  Serial.println(F("Start"));
  pinMode(lo, INPUT_PULLUP);
  pinMode(lu, INPUT_PULLUP);
  digitalWrite(led1, LOW);
  digitalWrite(rel1, LOW);
  pinMode(led1, OUTPUT);
  pinMode(rel1, OUTPUT);
}

void loop() {
  readTasterlu();
  readTasterlo();
}

void readTasterlo()
{
  if (!digitalRead(lo)) // Taste gedrückt?
  {
    Serial.println(F("Tastendruck lo erkannt"));
    digitalWrite(rel1, HIGH);
    blinkled(1, 50); // LED1, kurzes flimmern
  }
}


byte readTasterlu()
{
  static bool laststate = HIGH;
  static bool langgedrueckt = false;
  static unsigned long lastmillis = 0;
  static unsigned long relaisstarttime = 0;
  const unsigned long langgedrueckttime = 2000; // Zeit in ms
  if (!digitalRead(lu)) // Taste gedrückt?
  {
    if (millis() - lastmillis > bouncetime && laststate) // Kein Bounce zu erwarten?
    {
      Serial.println(F("Tastendruck lu erkannt"));
      laststate = LOW; // merke Status
      lastmillis = millis();  // Merke Zeit
    }
    if (!laststate) // Wenn Taste gedrückt
    {
      blinkled(1, 50); // LED1, kurzes flimmern
    }
  }
  else  // Taste nicht (mehr) gedrückt?
  {
    if (!laststate) // War vorher gedrückt?
    {
      Serial.println(F("Taste losgelassen"));
      digitalWrite(led1, LOW); // sicherstellen das aus
      laststate = HIGH; // setze Status
      if (millis() - lastmillis < langgedrueckttime) // Abfrage wie lange wurde tatsächlich gedrueckt?
      {
        Serial.println(F("kurz gedrückt erkannt"));
        // einkommentieren, wenn Zeitschaltung vorzeitig ausgehen soll
/*
        if (langgedrueckt)
        {
          langgedrueckt = false;
          digitalWrite(rel1, LOW);
        }
        else
*/
        {
          digitalWrite(rel1, LOW);  // Abschalten
        }
        return 1; // kurz gedrückt
      }
      else
      {
        Serial.println(F("lang gedrückt erkannt"));
        digitalWrite(rel1, HIGH);  // aktivieren für Zeitschalter
        langgedrueckt = true;      // Merker das Zeitschalter ein
        relaisstarttime = millis();// Startzeit Zeitschalter
        return 2; // lang gedrückt
      }
    }
  }
  if (langgedrueckt) // Prüfung ob Zeitschalter aktiv
  {
    if (millis() - relaisstarttime > ontime)  // Zeit abgelaufen?
    {
      Serial.println(F("Zeit abgelaufen"));
      digitalWrite(rel1, LOW);
      digitalWrite(led1, LOW);
      digitalWrite(led2, LOW);
      langgedrueckt = false;
    }
    else // lang gedrueckt aber Zeit nicht abgelaufen
    {
      blinkled(0, 500); // Wechselblinker
    }
  }
  return 0; // nicht gedrückt
}

void blinkled(const byte led, const int timer)
{
  static unsigned long lastmillis = 0;
  if (millis() - lastmillis > timer)
  {
    lastmillis = millis();
    switch (led)
    {
      case 0: // Wechselblinken
        Serial.println(F("Wechselblink"));
        digitalWrite(led1, !digitalRead(led1));
        digitalWrite(led2, !digitalRead(led1));
        break;
      case 1: // LED1
        Serial.println(F("blink LED1"));
        digitalWrite(led1, !digitalRead(led1));
        break;
      case 2: // lED2
        Serial.println(F("blink LED2"));
        digitalWrite(led2, !digitalRead(led2));
        break;
    }
  }
}