Anschalten eines Relais wenn Sensorspannung bestimmte Zeit über Schwellwert

Hallo Forum,

aktuell nutze ich einen NodeMCU mit ESP8266 Wifi Shield für mein Projekt.

Was ich erreichen möchte:
Ein Sensor liefert mir einen bestimmten Spannungswert. Wird ein Schwellwert (z.B. 1,5 V) eine gewisse Zeit (z.B. 10 min) am Stück überschritten, soll ein Relais eingeschaltet werden.

Hat jemand eine Idee wie sich das mit der Zeitspanne realisieren lässt?

Grüße
hap

Hallo
einem Zeitgeber programmieren. Als Beispiel kannst du das Blink without Delay Beispiel aus dem IDEverwenden

An das habe ich auch schon gedacht, dann müsste man aber den Überlauf von unsigned long abfangen. Das würde sonst Probleme machen.

hap42387:
An das habe ich auch schon gedacht, dann müsste man aber den Überlauf von unsigned long abfangen. Das würde sonst Probleme machen.

Warum?
Sind deine Intervalzeiten länger als 49,x Tage?

unsigned long previousMillis = 0;
unsigned long timeIntervall = 0;
unsigned long intervall = 10000;


void loop()
{   
  if(sensorValue >= 1.5)
  {
    timeIntervall = timeIntervall + (millis() - previousMillis);
    previousMillis = millis();   
   
    if(timeIntervall >= intervall)
    {
      //switch on relay
      
      previousMillis = 0;
      timeIntervall = 0;
    }      
  }
  
}

Danke für die Denkanstöße. :wink: Ich habe mein Problem gerade gelöst. Fehlt nur noch, dass der Wert von timeIntervall zurückgesetzt wird, wenn der Sensorwert zwischenzeitlich unter 1,5 V sinkt.

Meinst du sowas:

unsigned long timeIntervall = 0;  // Zeit seit Beginn der Schwellwert-Überschreitung
const unsigned long intervall = 10000;


void loop() { 
  float sensorValue = getSensorValue();  // woher auch immer 
  if(sensorValue >= 1.5) {
     if(millis() - timeIntervall >= intervall) {
        //switch on relay
     }     
  } else {
     // Schwellwert unterschritten
     timeIntervall = millis();
  }
}

Evtl. fehlt noch, dass du dir merkst, ob du den Beginn des verzögerten Alarms schon bearbeitet hast (print oder so)

hap42387:
Wird ein Schwellwert (z.B. 1,5 V) eine gewisse Zeit (z.B. 10 min) am Stück überschritten, soll ein Relais eingeschaltet werden.

Klassische Einschaltverzögerung mit Rücksetzmöglichkeit.

void loop()
{
  digitalWrite(LED_BUILTIN, einschaltverzoegerung(1.5, 10000));
}

bool einschaltverzoegerung(const float sensorValue, const unsigned long intervall)
{
  static unsigned long previousMillis = 0;
  static bool ausgeloest = false;
  bool ein = false;

  if (sensorValue >= 1.5)
  {
    if (ausgeloest == false)
    {
      previousMillis = millis();
      ausgeloest = true;
    }
  }
  else {
    ausgeloest = false;
  }
  if (millis() - previousMillis > intervall)
  {
    ein = true;
  }
  return ein;
}

michael_x:
Meinst du sowas:

unsigned long timeIntervall = 0;  // Zeit seit Beginn der Schwellwert-Überschreitung

const unsigned long intervall = 10000;

void loop() {
  float sensorValue = getSensorValue();  // woher auch immer
  if(sensorValue >= 1.5) {
    if(millis() - timeIntervall >= intervall) {
        //switch on relay
    }   
  } else {
    // Schwellwert unterschritten
    timeIntervall = millis();
  }
}




Evtl. fehlt noch, dass du dir merkst, ob du den Beginn des verzögerten Alarms schon bearbeitet hast (print oder so)

Das ist genau das was ich gesucht habe! Danke!
Allerdings sollte beim Ausschalten genau das gleiche passieren. Sprich, der Sensorwert muss eine bestimmte Zeit unter 1,5 V liegen, bevor das Relais ausgeschaltet wird.
@michael_x hast du da vielleicht auch eine Idee?

hap42387:
Allerdings sollte beim Ausschalten genau das gleiche passieren. Sprich, der Sensorwert muss eine bestimmte Zeit unter 1,5 V liegen, bevor das Relais ausgeschaltet wird.

Die Frage hat sich Dir in #4 nicht gestellt?

Und ja, das wäre dann die Ausschaltverzögerung mit Rücksetzmöglichkeit.

float ausloeser = 1.5;

void setup() 
{
  digitalWrite(LED_BUILTIN, LOW);
}
void loop()
{
  auswahl();
}
void auswahl()
{
  if (!digitalRead(LED_BUILTIN))
  {
    digitalWrite(LED_BUILTIN, einschaltverzoegerung(ausloeser, 10000));
    ausloeser = 1.0;
  }
  else
  { digitalWrite(LED_BUILTIN, ausschaltverzoegerung(ausloeser, 15000));
    ausloeser = 1.6;
  }
}


bool einschaltverzoegerung(const float sensorValue, const unsigned long intervall)
{
  static unsigned long previousMillis = 0;
  static bool ausgeloest = false;
  bool ein = false;

  if (sensorValue >= 1.5)
  {
    if (ausgeloest == false)
    {
      previousMillis = millis();
      ausgeloest = true;
    }
  }
  else {
    ausgeloest = false;
  }
  if (millis() - previousMillis > intervall)
  {
    ein = true;
  }
  return ein;
}

bool ausschaltverzoegerung(const float sensorValue, const unsigned long intervall)
{
  static unsigned long previousMillis = 0;
  static bool ausgeloest = false;
  bool ein = true;

  if (sensorValue < 1.5)
  {
    if (ausgeloest == false)
    {
      previousMillis = millis();
      ausgeloest = true;
    }
  }
  else {
    ausgeloest = false;
  }
  if (millis() - previousMillis > intervall)
  {
    ein = false;
  }
  return ein;
}

hap42387:
Hat jemand eine Idee wie sich das mit der Zeitspanne realisieren lässt?

Gibt es Erkenntnisse, ob Dein Problem erledigt ist?

michael_x:
Meinst du sowas:

unsigned long timeIntervall = 0;  // Zeit seit Beginn der Schwellwert-Überschreitung

const unsigned long intervall = 10000;

void loop() {
 float sensorValue = getSensorValue();  // woher auch immer
 if(sensorValue >= 1.5) {
    if(millis() - timeIntervall >= intervall) {
       //switch on relay
    }    
 } else {
    // Schwellwert unterschritten
    timeIntervall = millis();
 }
}




Evtl. fehlt noch, dass du dir merkst, ob du den Beginn des verzögerten Alarms schon bearbeitet hast (print oder so)

Ja, das Problem hat sich erledigt. Ich habe die Version von @michael_x für meine Zwecke etwas abgeändert.

hap42387:
Ja, das Problem hat sich erledigt. Ich habe die Version von @michael_x für meine Zwecke etwas abgeändert.

Das ist schick.
michael_x und auch die geneigten (zukünftigen) Leser wären möglicherweise nicht undankbar, wenn Du sie an der Lösung teilhaben lässt.
Insbesondere, wenn das Thema als gelöst markiert und das Ergebnis der Nachwelt präsentiert wird..

michael_x und auch die geneigten (zukünftigen) Leser wären möglicherweise nicht undankbar, wenn Du sie an der Lösung teilhaben lässt.
Insbesondere, wenn das Thema als gelöst markiert und das Ergebnis der Nachwelt präsentiert wird.

Ist mir nicht so wichtig. Mein Tip war eher ein Denkanstoß und keine Komplettlösung zum Abschreiben, wovon ich sowieso nicht viel halte. "Geneigte (zukünftige) Leser" auf der Suche nach Sketchen möchte ich nicht verleiten, mehr Zeit mit Suchen statt mit Selber probieren zu verplempern.

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