Anfänger Probz mit zeitverzögerungen

Guten Abend,

folgendes Problem...Ich verhaspel mich anscheinend immer bei den ganzen Zeitabfragen Zuständen (current, last ,State)
Folgendes habe ich vor:
Ich möchte einen Wandserienschalter (4 micrswitches...links oben, links unten, rechts oben und unten(buttonlo, lu ro, ru) dazu nutzen 2 Relais zu schalten. So weit kein Problem...
Allerdings hätte ich auch gern ein zeitverzögertes ausschalten, wenn ich die tasten unten länger drücke...
Vielleicht hätte ich mal lieber case switch genommen, statt der ganzen if else Befehle...aber ich brauch mal jmd der mir auf die Sprünge hilft...DANKE
Ich raffs irgendwie nicht und hatte gehofft, dass ichs vielleicht mit der ezbutton library besser hinbekomme, aber ich scheitere an diesenblöden Zeitdingern, vor allem weil ich ja auch ne rückmeldung bekommen will, über LEDs

DANKE nochmal

#include <ezButton.h>

ezButton buttonlo(2);  // create ezButton object that attach to pin 6;
ezButton buttonlu(3);  // create ezButton object that attach to pin 7;
ezButton buttonro(4);  // create ezButton object that attach to pin 8;
ezButton buttonru(5);  // create ezButton object that attach to pin 8;
unsigned long startlu = 0;//press
unsigned long endlu = 0;//release
unsigned long zeitlu = 0;//
unsigned long startru = 0;
unsigned long endru = 0;
unsigned long zeitru = 0;
unsigned long lastledmillis = 0;
unsigned long cdmillisl = 0; //start millis countdownlinks
unsigned long cdmillisr = 0; //"" countdownrechts
const int countdown = 30000; //countdown dauer
int cdstatel = 0; //Countdown?
int cdstater = 0;
int ledStatel = 0;
int ledStater = 0;
int ledinterval = 100;
const int relais1 = 11;
const int relais2 = 12;
const int Led1 = 10;
const int Led2 = 9;

int re1 = 1;
int re2 = 1;
int buttonl = 0; //schalter links gedrückt?
int buttonr = 0; //s r gedrückt?
const int interval = 3000;//langdruck Taster
int ispressedl = 0; //links gedrückt (lu)
int ispressedr = 0; //rechts""(ru)
void setup() {
  Serial.begin(9600);
  buttonlo.setDebounceTime(50); // set debounce time to 50 milliseconds
  buttonlu.setDebounceTime(50); // set debounce time to 50 milliseconds
  buttonro.setDebounceTime(50); // set debounce time to 50 milliseconds
  buttonru.setDebounceTime(50); // set debounce time to 50 milliseconds
  pinMode (relais1, OUTPUT);
  pinMode (relais2, OUTPUT);
  pinMode (Led1, OUTPUT);
  pinMode (Led2, OUTPUT);
}

void loop() {
  buttonlo.loop(); // MUST call the loop() function first
  buttonlu.loop(); // MUST call the loop() function first
  buttonro.loop(); // MUST call the loop() function first
  buttonru.loop(); // MUST call the loop() function first

  int btnloState = buttonlo.getState();
  int btnluState = buttonlu.getState();
  int btnroState = buttonro.getState();
  int btnruState = buttonru.getState();

  Serial.print("button 1 state: ");
  Serial.println(btnloState);
  Serial.print("button 2 state: ");
  Serial.println(btnluState);
  Serial.print("button 3 state: ");
  Serial.println(btnroState);

  if (buttonlo.isPressed()) {
    re1 = LOW;
    digitalWrite (Led1, HIGH);
    Serial.println("The button 1 is pressed");
  }


  if (buttonlo.isReleased())
    Serial.println("The button 1 is released");

  if (buttonlu.isPressed()) {
    Serial.println("The button 2 is pressed");
    startlu = millis();
    ispressedl = 1;
  }

  if (buttonlu.isReleased()) {
    Serial.println("The button 2 is released");
    endlu = millis();
    buttonl = 1;
  }

  if (buttonro.isPressed())
    Serial.println("The button 3 is pressed");

  if (buttonro.isReleased())
    Serial.println("The button 3 is released");

  //Zeitabfrage der schalter wenn lu released erfolgt
  if (buttonl == 1) {
    if (endlu - startlu < interval)re1 = HIGH; //kurz links
    buttonl = 0;
    Serial.println("The button LINKSUNTEN RELAIS AUS is released");

  }
  else if (buttonl == 1) {
    if (endlu - startlu > interval) {
      cdstatel = 1; //Countdown gestartet
      cdmillisl = millis();
      Serial.println("COUNTDOWN LINKS!");
      buttonl = 0; //schaltstatus zurücksetzen
    }
  }
  //zeitabfrage während des gedrückt haltens zur info des bedieners über LED
  if (ispressedl = 1 && (millis - startlu > interval)) {
    if (lastledmillis + ledinterval > millis()) {
      ledStatel != ledStatel;
      digitalWrite(Led1, ledStatel);
      Serial.println("L`EDBLINKEN COUNTDOWN ");

    }
  }
  if (cdstatel = 1) { // Countdown LÄUFT!
    if (lastledmillis + millis() > ledinterval)
    {
      ledStatel != ledStater; //beide LEDs blinken abwechselnd
      lastledmillis = millis();
    }
    if (cdmillisl + countdown > millis()) {

      re1 = HIGH;
      ledStatel = LOW;
      ledStater = LOW;
      ispressedl = 0;
      cdstatel = 0;
    }
  }

  digitalWrite(relais1, re1);
  digitalWrite(relais2, re2);
}

neuron74:
Wandserienschalter (4 micrswitches...l

aber ich scheitere an diesenblöden Zeitdingern, vor allem weil ich ja auch ne rückmeldung bekommen will,

Du scheiterst nicht an den Zeitdingern,

Nimm einen Zettel und einen Stifft.
Schreibe auf, was Du willst.

Tipp: Wenn Du rausfinden willst, wie lange ein Button gedrückt ist, musst Du abfragen, wann er nicht mehr gedrückt ist.

Vor Tagen sprach mal jemand davon, das er das Buzzword nicht fand. Es wäre der Radiergummi :slight_smile:

Ich hab die Lib nicht - würde das aber ganz ohne bauen.

my_xy_projekt:
Du scheiterst nicht an den Zeitdingern,

Nimm einen Zettel und einen Stifft.
Schreibe auf, was Du willst.

Tipp: Wenn Du rausfinden willst, wie lange ein Button gedrückt ist, musst Du abfragen, wann er nicht mehr gedrückt ist.

Vor Tagen sprach mal jemand davon, das er das Buzzword nicht fand. Es wäre der Radiergummi :slight_smile:

Ich hab die Lib nicht - würde das aber ganz ohne bauen.

ich auch :slight_smile:

paulpaulson:
ich auch :slight_smile:

Dann mal hierTagesende... Ausgegeben wird, wenn Taste nicht gedrückt, kurz gedrückt , lang gedrückt...

// Codeschnipsel Forensketch
const byte lo = 2;
unsigned long bouncetime = 50; // Zeit in ms
void setup()
{
  Serial.begin(115200);
  Serial.println(F("Start"));
  pinMode(lo, INPUT_PULLUP);
}

void loop() {
  static byte laststate = 255;
  byte state = readTasterlo();
  if (state != laststate)
  {
    laststate = state;
    switch (state)
    {
      case 0:
        Serial.println(F("nicht"));
        break;
      case 1:
        Serial.println(F("kurz"));
        break;
      case 2:
        Serial.println(F("lang"));
        break;
    }
  }
}

byte readTasterlo()
{
  static bool laststate = HIGH;
  static unsigned long lastmillis = 0;
  const unsigned long langgedrueckt = 2000; // Zeit in ms
  if (!digitalRead(lo)) // Taste gedrückt?
  {
    if (millis() - lastmillis > bouncetime && laststate) // Kein Bounce zu erwarten?
    {
      laststate = LOW; // merke Status
      lastmillis = millis();
    }
  }
  else  // Taste nicht (mehr) gedrückt?
  {
    if (!laststate) // War vorher gedrückt?
    {
      laststate = HIGH; // merke Status
      if (millis() - lastmillis < langgedrueckt)
      {
        return 1; // kurz gedrückt
      }
      else
      {
        return 2; // lang gedrückt
      }
    }

  }
  return 0; // nicht gedrückt
}

Hallo
ich habe mir zum Kaffee am Morgen deinen Sketch angeschaut.
Unter welchen Bedingungen sollen die Ausgänge, LED´s und Relais´s, auf die Eingänge, buttonlo, lu ro und ru, reagieren?
Am besten du zeichnest eine Wahrheitstabelle mit den zeitlichen Abhängigkeiten, dann läßt sich der kunstvoll verknoteten Sketch entwirren :slight_smile:

mal eben das Einfachste vorweg:

button lo --> relais 1 an , led 1 blinkt während des drückens
button lu kurz ---> relais 1 aus. led 1 wie oben

button ro --> relais 2 an. led 2 blinkt während des drückens
button ru --> relais 2 aus . led 2 wie oben

button lu lang ---> relais 1 aus nach 30 sekunden, led 1&2 blinken abwechselnd wenn timer aktiviert
button ru lang ---> relais 2 aus nach 30 sekunden, led 1&2 blinken abwechselnd wenn timer aktiviert

ich bin gespannt...Danke für Eure Hilfe

Hallo,

warum soll die LED Blinken wenn kurz gedrückt wird, das mach doch keinen Sinn.

kurz drücken Relais an / aus
lang drücken verzögert aus nach 30s , während der Zeit blinkt die LED.

mir scheint das Ganze ist links und recht gleich.

oneButton Lib in eine handvoll statusFlags sollten es doch tun.

Heinz

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;
    }
  }
}

Rentner:
warum soll die LED Blinken wenn kurz gedrückt wird, das mach doch keinen Sinn.

Sag das nicht...
Ich hab sowas hier ab Werk.

my_xy_projekt:
Sag das nicht...
Ich hab sowas hier ab Werk.
https://elektrobock.gmbh/wp-content/uploads/2019/06/ws330-de.pdf

Hallo,

na ja dazu muss man definieren was kurz ist, ich bin jetzt mal von 100-500 ms ausgegangen. Mehr ist ja schon ehr lang :wink:

Heinz

Rentner:
ich bin jetzt mal von 100-500 ms ausgegangen. Mehr ist ja schon ehr lang :wink:

Stimmt natürlich..
Ich hab einfach für die Zeit des drückens ein blinkblink aktiviert.
Ausgewertet wird ja erst nach dem loslasssen.

Coole Nummer,

der Wahnsinn, danke my_xy_projekt!
ich werd das dann mal doppeln....und lernen!
bin gespannt, ob ich jetzt noch ins stolpern komme, wenn ichs jetzt von einem arduino mit den switches und LEDs auf nen 2. schicke mit LED und Relais...
ich werd berichten

DANKE DANKE

neuron74:
ich werd das dann mal doppeln....und lernen!

Das Ding ist nur ne Anregung, wie es gehen kann.
Da ist ganz sicher noch viel Potential um das übersichtlicher zu bekommen. Aber ich wollte das nur mal zeigen, das sowas auch selbstgebaut geht.

neuron74:
bin gespannt, ob ich jetzt noch ins stolpern komme,

Möglicherweise...
Ich hab die Funktion mal richtig gebaut.

void 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 (laststate) // Vorher Taste nicht gedrückt?
    {
      Serial.println(F("Tastendruck lu erkannt"));
      laststate = LOW; // merke Status
      lastmillis = millis();  // Merke Zeit
    }
    blinkled(1, 50); // LED1, kurzes flimmern
  }
  else  // Taste nicht (mehr) gedrückt?
  {
    if (millis() - lastmillis > bouncetime && (!laststate)) // War vorher gedrückt? Kein Bounce?
  {
    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
        }
      }
      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
      }
    }
  }
  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
    }
  }
}

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.