Temperatursensor auslesen und mit if-Abfrage Ausgang ansteuern

Hi Leute,
ich möchte ganz gerne meinen Arduino Uno so programmieren, dass ein Ausgang "HIGH" geht, wenn der Wert von einem Temperatursensor von einer höheren Temperatur, also einem höheren Wert sinkt. Zum Beispiel von 1023 auf 800. Der Ausgang soll aber nur angehen, wenn ein Wert erreicht Wert, der sinkt, also sich nur abkühlt und es kälter wird! Wenn der Wert dauerhaft unter oder über diesem Wert liegt oder der Wert steigt, soll der Ausgang nicht "HIGH" gehen.
Mein Code steht unten und da, wo die Fragezeichen weiß ich nicht, was ich da hinschreiben soll, damit der Ausgang nur angeht, wenn der Wert fällt. Also der Code ist auch noch nicht fertig, ich Scheiter nur an der Stelle.
Vielen Dank schonmal im Voraus, wäre cool, wenn jemand schnell antwortet
Liebe Grüße

int Eingang=A0;
int sensorWert=0;
int Ausgang=7;

void setup() {
  // put your setup code here, to run once:
Serial.begin(9600);


}

void loop() {
  // put your main code here, to run repeatedly:
sensorWert=analogRead(Eingang);
Serial.print("Sensorwert=");
Serial.println(sensorWert);
delay (1000);

if (sensorWert <= 1020 )                         //????
{
  digitalWrite (Ausgang, HIGH);
}
}
 if (vergl >= 5 || vergl <= -5)

Versuchs mal so die Werte dann so einstellen wie du sie haben möchtest

Hallo,

du musst dir eine Logik bauen um erstmal auszuwerten ob es kälter oder wärmer wird. Dafür wird ein Vergleichswert benötigt. Man speichert sich den alten Wert und vergleicht ihn mit dem Neuen. Ich habe mal einen Ansatz erstellt.

Wenn sich die Temp. geändert hat, wird geschaut wie sie sich geändert hat und die neue Temp. als alte für den nächsten Vergleich gespeichert. Mit den gesetzten bools und dem Temperaturvergleich wird dann entschieden was das Relais macht. Wenn du damit klar kommst musste die Logik entsprechend weiter anpassen. Ggf. muss noch eine Hysterese rein. Sonst könnte es flattern.

const byte ausgang = 7;

struct SensorDaten
{
  const byte pin = A0;
  long aktuell = 0;
  long alt = 0;
  bool waermer = false;
  bool kaelter = false;
};

SensorDaten sensor;

void setup()
{
  Serial.begin(9600);
}

void loop()
{

  sensor.aktuell = analogRead(sensor.pin);
  Serial.print("Sensorwert = ");
  Serial.println(sensor.aktuell);

  if (sensor.aktuell != sensor.alt)
  {
    if (sensor.aktuell < sensor.alt)
    {
      sensor.waermer = false;
      sensor.kaelter = true;
    }
  
    else if (sensor.aktuell > sensor.alt)
    {
      sensor.waermer = true;
      sensor.kaelter = false;
    }

    sensor.alt = sensor.aktuell;
  }
  
  if (sensor.kaelter && (sensor.aktuell <= 800) )                       
  {
    digitalWrite (ausgang, HIGH);
  }

  if (sensor.waermer)                       
  {
    digitalWrite (ausgang, LOW);
  }

  delay (1000);
}

Jo danke für die Antworten, ich probiere morgen beides mal aus, vielen Dank :-*

Auch ist zu bedenken daß Du kein 100% stabilen Meßwert erhalten wirst. Schwankungen um einige ADC ist fisiologisch.

Grüße Uwe

Moin,
ich geb mal auch noch einen.
Ohne Delay.
Nach der Messung wird verglichen, ob sich der Messwert in seinem Bereich befindet.
Danach wird verglichen, ob der Wert nach unten, bzw. gleich geblieben -> dann EIN sonst aus.

const int Eingang = A0;
const int Ausgang = 7;
const int oberGrenze = 1000;
const int unterGrenze = 800;
int sensorWert;
int altWert = 0;
unsigned int lastmillis;
const unsigned int pauseZeit = 1000; // Zeit in ms


void setup() {
  Serial.begin(9600);
}

void loop() {
  if (millis() - lastmillis > pauseZeit) {
    lastmillis = millis();
    sensorWert = analogRead(Eingang);
    Serial.print("Sensorwert=");
    Serial.println(sensorWert);

    if (sensorWert <= oberGrenze && sensorWert > unterGrenze) {
      if (sensorWert <= altWert) {
        digitalWrite (Ausgang, HIGH);
      }
      else {
        digitalWrite(Ausgang, LOW);
      }
      altWert = sensorWert;
    }
  }
}

Vielen Dank nochmals, ich hab die Codes eigentlich soweit verstanden, ich habe nur noch die Frage, wie das Programm weiß, was der alte Wert also altWert und sensor.alt in den Fällen sind.

   if (sensorWert <= altWert)   //Also hier bei dem letzten gepusteten code
if (sensor.aktuell < sensor.alt)     //Und bei dem zweiten das

Wäre super, wenn einer von euch das nochmals erklärt könnte
Danke nochmal und auch schonmal im Voraus

amararduinoinda:
Programm weiß, was der alte Wert also altWert und sensor.alt in den Fällen sind.

In meinem Code jetzt hier mit Kommentar

if (sensorWert <= oberGrenze && sensorWert > unterGrenze) {  // sensorWert im Bereich?
      if (sensorWert <= altWert) { // nur wenn vorheriger höher
        digitalWrite (Ausgang, HIGH); // mache was
      }
      else {
        digitalWrite(Ausgang, LOW); // oder mache was anders
      }
      altWert = sensorWert; // merke den Wert für den nächsten Vergleich

Ahh ok, also da merkt das Board den alten Wert. Vielen Dank für die schnelle Antwort! Dann gehts jetzt gleich mal ans testen :smiley:

amararduinoinda:
Dann gehts jetzt gleich mal ans testen :smiley:

Bitte beachte, wo ich den Merker für den Wert gesetzt habe.
Egal, ob der aktuelle Wert höher ODER niedriger ist, ich merke den Wert immer.
Hintergrund meines Gedanken war es, das der Sensorwert z.B 910 sein könnte, der altWert aber 850.
Dann geht 7 erstmal LOW, aber mit der nächsten Messung ist der Sensorwert 900 - dann geht 7 wieder HIGH.

Wenn DU erst wieder einsteigen willst, wenn der Sensorwert unter die 850 kommt, dann musst Du den Merker in den Bereich stecken:

 digitalWrite (Ausgang, HIGH); // mache was

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