verzögertes einschalten nach Änderung des Variablen Inhalt

Guten Tag zusammen und einen schönen Sonntag,

mein Versuch nach Änderung eines Variablen Inhalt zeitverzögert eine LED einzuschalten, scheitern grad kläglich.

Plan: Input über über Hallsensor Variable wird von vordefinierten Inhalt "0" auf "1" geändert Nach Ablauf einer Zeit (hier angedachte xSec) schaltet der Pin die LED ein.

Wo liegt mein Denkfehler im Sketch? Danke für eure Denkanstöße und Hilfe.

lieben Gruß Flötzinger

// Test auf zeitverzögert einschalten einer LED
// Input über Hallsensor
// Output LEd

const int HSQ1 = 3;// Eingabe
const int Test_1= 15;// Ausgabe
unsigned long Startzeit5 =0;// Zeit
int Zaehler_1=0; // Variable

void setup()
  {  
//*****************
  Serial.begin(9600);
  pinMode(HSQ1,INPUT); // Pin 3
  pinMode(Test_1,OUTPUT); 
  }
void loop() 
{
Serial.println(Zaehler_1);
if (digitalRead(HSQ1)==LOW)
  {
   Zaehler_1=1;
   Startzeit5=millis();
   (millis()-Startzeit5>=5000);
   digitalWrite(Test_1,HIGH);  
  }
}

Der Vergleich/Berechnung (millis()-Startzeit5>=5000) dümpelt da einsam und wirkungslos im Code rum

Hi

WAS bezweckst Du damit:

if (digitalRead(HSQ1)==LOW)
  {
   Zaehler_1=1;
   Startzeit5=millis();
   (millis()-Startzeit5>=5000);
   digitalWrite(Test_1,HIGH); 
  }

Du willst, wenn der HSQ1 (??) LOW ist, daß Test_1 für 5 Sekunden HIGH ist - interretiere ich.

Warum schreibst Du Das dann nicht auch so? Wenn HSQ1 LOW ist, die Startzeit 'Startzeit5' auf millis() setzen und den Ausgang HIGH schalten. SEPARAT darunter fragst Du ab, ob die Laufzeit vorbei ist. AUSSERHALB der LOW-Abfrage.

MfG

Floetzinger:
Plan:
Input über über Hallsensor
Variable wird von vordefinierten Inhalt “0” auf “1” geändert
Nach Ablauf einer Zeit (hier angedachte xSec) schaltet der Pin die LED ein.

Wo liegt mein Denkfehler im Sketch?
Danke für eure Denkanstöße und Hilfe.

void loop() 

{
Serial.println(Zaehler_1);
if (digitalRead(HSQ1)==LOW)
  {
  Zaehler_1=1;
  Startzeit5=millis();
  (millis()-Startzeit5>=5000);
  digitalWrite(Test_1,HIGH); 
  }
}

Auch wenn man aus (millis()-Startzeit5>=5000); noch eine if Abfrage macht und da dann das digitalWrite reinpackt funktioniert es nicht, da immer wenn der Eingang auf LOW ist, die Startzeit wieder auf die aktuellen millis gesetzt werden.

Du musst also einen Merker setzen, der verhindert das die Startzeit nochmal neu gesetzt wird. Erst wenn der Eingang HIGH war, darf beim nächsten LOW wieder die Startzeit gesetzt werden.

Was soll eigentlich sonst noch passieren?
Wenn der Eingang auf LOW geht, soll 5 Sekunden später die LED eingeschaltet werden. OK, so weit klar. Aber was passiert wenn der Eingang wieder auf HIGH geht? Soll die LED wieder ausgehen? Sofort? Verzögert?

Das fehlt auch noch.

Gruß, Jürgen

Hallo Jürgen,

  1. du hast meine Problemstellung richtig erkannt
  2. du hast mir einen (für mich) guten weiteren altenativen Weg gezeigt.
  3. du hast dich auch für den (noch nicht zu Ende gedachten) Rest interssiert. Danke für deine sehr gute Hilfestellung zur Problemlösung.

zu 3. wenn ich das "verzögeet Einschalten Problem" gelöst habe, kommt Step 2. Hier wird das Ausschalten durch einen simplen Taster (o.ä.) erledigt, möglicherweise über den Merker "Zaehler_1".

da ich aktuell eine ähnliche Ein-/Ausschaltverzögerung brauche habe ich den Weg über eine Klasse/OOP versucht. Das hat imho den Vorteil hat, dass man das relativ einfach für weitere Ausgänge erweitern kann.

Jedes Relais wird zu einem Objekt: - Das Objekt weis, welchen PIN es ansteuern muss - Das Objekt weis, von welchem PIN es abhängig ist (oder in deinem Fall, von welcher Variable) - Das Objekt weis, mit welchem Delay es einschalten soll - Das Objekt weis, mit welchem Delay es ausschalten soll

Mit einem Relay ist der Vorteil einer Klasse noch nicht so offensichtlich, aber wenn man mehrere Ausgänge mit unterschiedlichen Delays einem Signal(Variable) folgen lassen will, dann kommt der Vorteil von OOP bald zu Tage.

// Beispiel Ein-/Ausschaltverzögerung
// Relay auf einem Ausgang folgt Zeitverzögert einem Eingangsignal
// beigetragen von noiasca
// http://forum.arduino.cc/index.php?topic=593723.0
// 2019-01-28
//

const byte PORTREMOUT_PIN = 19;     // GPIO where the Relay is connected
const byte SIGNAL_PIN = 18;         // GPIO where the external Signal is connected

class relay {
    uint32_t previousMillisOn = 0;   // timestamp for ON
    uint32_t previousMillisOff = 0;  // timestamp for Off
    const byte pin;                  // a GPIO where the relay is attached
    byte delayOn = 10;               // delaytime in ms *100; e.g. 10 will lead to 1000ms delay after ON
    byte delayOff = 20;              // delaytime in ms *100
    const byte delayFactor = 100;    // delays will be multiplied with this factor
    byte previousTriggerSignal = 0;  // previous state of trigger signal


  public:
    relay(byte pin):
      pin(pin) {}

    void begin()
    {
      pinMode(pin, OUTPUT);
    }

    void setDelayOn(byte newDelayOn)
    {
      delayOn = newDelayOn;
    }

    void setDelayOff(byte newDelayOff)
    {
      delayOff = newDelayOff;
    }

    void tick()
    {
      // Step 1: Check auf Trigger Signal Wechsel:
      byte triggerSignal = digitalRead(SIGNAL_PIN);
      if (triggerSignal && !previousTriggerSignal)
      {
        Serial.println(F("trigger ein"));
        uint32_t currentMillis = millis();
        previousMillisOn = currentMillis;
        previousTriggerSignal = triggerSignal;
      }
      else if (!triggerSignal && previousTriggerSignal)
      {
        Serial.println(F("trigger aus"));
        uint32_t currentMillis = millis();
        previousMillisOff = currentMillis;
        previousTriggerSignal = triggerSignal;
      }

      // Step 2: Check ob Zeit abgelaufen ist und etwas zu tun ist.
      byte pinstatus = digitalRead(pin);
      if (!pinstatus && triggerSignal && millis() - previousMillisOn > (uint16_t)delayOn * delayFactor)
      {
        Serial.print(F("Relay EIN auf GPIO")); Serial.println(pin);
        digitalWrite(pin, 1);
      }
      else if (pinstatus && !triggerSignal && millis() - previousMillisOff > (uint16_t)delayOff * delayFactor)
      {
        Serial.print(F("Relay AUS auf GPIO")); Serial.println(pin);
        digitalWrite(pin, 0);
      }
    }
};

relay relay1(PORTREMOUT_PIN);   // ein Relais Objekt erstellen und einen PIN zuweisen

void setup() {
  // put your setup code here, to run once:
  pinMode(SIGNAL_PIN, INPUT);
  Serial.begin(115200);
  Serial.println(F("Ein-/Ausschaltverzögerung"));
  relay1.begin();
}

void loop() {
  // put your main code here, to run repeatedly:
  relay1.tick();          // jedes Relay-Objekt im Loop aufrufen und eine Zeitscheibe geben
}

getestet am ESP32 (ist aber nichts besonderes drinnen, sollte also am UNO auch laufen)