Kurzer Impuls bei Bedingung

Hallo.
Ich habe mir ein Programm geschrieben zum Auslesen eines DS18B20. Dieser Wert wird per OLED angezeigt und bei MQTT an die Steuerung weitergegeben.

Ab einem gewissen Schwellwert oder einem MQTT-Eingangssignal soll ein Ausgang kurz geschaltet werden.

Nun habe ich folgende Probleme.
Wird der Schwellwert per MQTT erreicht, kommt zwar nur ein Impuls, wird der Schwellwert aber unterschritten kommt erneut ein Impuls.
Wird der Schwellwert per Sensor erreicht (temp>26), pulsiert der Ausgang die ganze Zeit und ich weiß nicht wie ich das mit dem letzten Zustand umsetzen soll. Mit lastState hat´s nicht geklappt.

Aus diesem ersten Impuls heraus soll 5s später ein zweiter Impuls über einen weiteren Ausgang kommen, auch nur einmalig.

Vielleicht könnte mir jemand Hilfestellung geben. Danke.

void loop1() {

  /*if ((temp > 26) or (var1 == true)) { 
    digitalWrite(out1,HIGH);
    delay(500);
    digitalWrite(out1,LOW);
  }*/

  if (temp > 26) {
    Schwellwert = true;
  }
  else {
    Schwellwert = false;
  }

  if ((Schwellwert!=lastState1) or (var1!=lastState2)) {
    digitalWrite(out1,HIGH);
    delay(500);
    digitalWrite(out1,LOW); 
  }
  else {
    digitalWrite(out1,LOW);
  }  
  lastState1 = Schwellwert;
  lastState2 = var1;

GruĂź Thorsten

Poste keine Snippets (Snippets R Us!)

Dazu gibt´s aber nix zu ergänzen. Variablendeklaration sollte ja klar sein.
Außer dem Loop gehört nix zur gewünschten Funktion, außer vielleicht das noch:

  // Reaktion auf MQTT-Nachricht
  if(topic=="esp8266/input"){
    Serial.print("Changing output to ");
    if(messageTemp >= "26"){
      var1 = true;
      Serial.print("on");
    }
    else if(messageTemp  <= "25"){
      var1 = false;
      Serial.print("off");
    }
  }
  Serial.println();
}
constexpr byte switchTemp {31};
byte temp;
bool ausgeloest = false;
void setup()
{
  pinMode(LED_BUILTIN, OUTPUT);
  digitalWrite(LED_BUILTIN, LOW);
}

void loop()
{
  if (temp > switchTemp)
  {
    if (!ausgeloest)
    {
      digitalWrite(LED_BUILTIN, HIGH);
      delay(500);
      digitalWrite(LED_BUILTIN, LOW);
      ausgeloest = true;
    }
  }
  else
  {
    ausgeloest = false;
  }
}
1 Like

Danke fĂĽr die schnelle Antwort. Warum wird ein constexpr verwendet ?
Die ABhängigkeit von z.B. switchtemp wäre ja bei mir (temp > 26). Darf das in die Deklaration mit rein, obwohl der Sensor ja erst später im Programm abgefragt wird ?
Das mit dem lastState fĂĽr die MQTT-Message kann so bleiben ?

Weil ich das grade so vor 5 Minuten geschrieben hatte.

Ja.
Dann tausche 31 gegen 26.
Alles, für was Du während der Initialisierung keinen Variablenspeicher reservieren musst, ist gut.
Der Sketch oben kompiliert fĂĽr einen UNO:

Der Sketch verwendet 806 Bytes (2%) des Programmspeicherplatzes. Das Maximum sind 32256 Bytes.
Globale Variablen verwenden 10 Bytes (0%) des dynamischen Speichers, 2038 Bytes fĂĽr lokale Variablen verbleiben. Das Maximum sind 2048 Bytes.

Das Selbe - nur das die switchTemp als Variable EINMALIG im setup() gesetzt wird:

byte switchTemp;
byte temp;
bool ausgeloest = false;
void setup()
{
  pinMode(LED_BUILTIN, OUTPUT);
  digitalWrite(LED_BUILTIN, LOW);
  switchTemp = 31;
}

void loop()
{
  if (temp > switchTemp)
  {
    if (!ausgeloest)
    {
      digitalWrite(LED_BUILTIN, HIGH);
      delay(500);
      digitalWrite(LED_BUILTIN, LOW);
      ausgeloest = true;
    }
  }
  else
  {
    ausgeloest = false;
  }
}

ergibt fĂĽr den gleichen Controller kompiliert:

Der Sketch verwendet 812 Bytes (2%) des Programmspeicherplatzes. Das Maximum sind 32256 Bytes.
Globale Variablen verwenden 11 Bytes (0%) des dynamischen Speichers, 2037 Bytes fĂĽr lokale Variablen verbleiben. Das Maximum sind 2048 Byt

Also 6 +1 Byte verschwendet...

Hab´s jetzt für mich umgeschrieben. Funktionierte auf Anhieb.
Vielen Dank @my_xy_projekt

  if ((temp>26) or (var1 == true)) {
    if (!Schwellwert) {
      digitalWrite(out1,HIGH);
      delay(500);
      digitalWrite(out1,LOW);
      Schwellwert = true;
    } 
  }
  else {
    Schwellwert = false;
  }

Und warum Magic Numbers?

1 Like

Ich komme aus der IEC-Programmierung und da werden Zahlenwerte an der Stelle genutzt, wo sie gebraucht werden. Man gibt Ihnen keinen Variablennamen, um dann später wieder Bezug darauf zu nehmen. Speicherplatz für Variablendeklaration galt es einzusparen.

constexpr belegen keinen RAM da diese vom Kompiler ersetzt werden.

https://en.cppreference.com/w/cpp/language/constexpr

1 Like

Zusätzlich, dass dies kein RAM oder Speicher mehr verbraucht.
Es lässt sich Zentral der Wert ändern. Vor allem wenn du diese Magic Number mehrmals als Vergleich nutzt, musst du den Wert der Konstante nur an einer Stelle ändern, wenn du ihn ändern wölltest, und nicht an vielen Stellen im Code.

Ok, die letzten beiden Argumente lasse ich gelten :wink:
Hab´s jetzt so geändert.
Und nochmals danke an @my_xy_projekt, der Code zur Steuerung der Klima funktioniert nun einwandfrei. Nun kann alles ins Gehäuse eingebaut werden.

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