If statement funktioniert je nach Lust und Laune des Arduinos

Hallo,

Ich arbeite an meinem Projekt für die Uni und alles funktioniert einwandfrei... bis es das aus unerfindlichen Gründen nicht mehr tut...

Das hier ist mein Code, den ich mit Hilfe von einigen netten Forummitgliedern optimiert und zum funktionieren gebracht habe.

const byte pumpePin = 4;
  
void setup()

{
  Serial.begin(9600);
  pinMode(pumpePin, OUTPUT);
}

void loop()
{
  unsigned int feuchte = analogRead(A0);
  delay(1000);
  Serial.println(feuchte); //Der analoge Pin A0 ist mit dem Feuchtigkeitssensor verbunden und liest die Werte ab
  delay(100);
  if (analogRead(feuchte) <= 400) // Feuchtigkeitswert unter 500 also Trocken
  {
    digitalWrite(pumpePin, LOW); // digital PIN 4 ist mit dem Schaltrelais verbunden und soll die Wasserpumpe anschalten
    delay(2000);
    digitalWrite(pumpePin, HIGH); // Das Schaltrelais soll den Motor ausschalten und solange der Wert über 150 ist soll die Wasserpumpe aus bleiben
  }
  else  //Feuchtigkeitswert über 150 also Nass
  {
    
  }
}

Kurz gefasst soll der Code dafür sorgen, dass eine Wasserpumpe angeht sobald der Feuchtigkeitswert des Messgeräts UNTER 400 fällt.
Nun eigentlich funktioniert das, denn wenn ich das Messgerät trockne, also einen Feuchtigkeitswert von 0 habe, geht die Pumpe wie gewollt an und wenn ich das Messgerät in ein Glas Wasser halte stoppt die Pumpe so wie es soll.
Nun wenn ich das Messgerät aber in einen Topf mit Erde stecke und die Feuchtigkeitswerte 600-700 angeben geht die Pumpe einfach mal An, mal Aus und manchmal läuft sie minutenlang.
Währenddessen zeigt der serielle Monitor jedoch an, dass die Werte nie unter 400 fallen.
Warum geschieht das ich kann mir das rein logisch nicht erklären, ich dachte vielleicht fällt das Messgerät für ein paar Millisekunden unter den Wert und sorgt damit dafür, dass die Pumpe angeht aber dagegen spricht, dass die Pumpe halt manchmal minutenlang läuft obwohl die Werte alle konstant weit über 400 sind...

Wenn deine Variable schon den Wert vom analogen Pin enthält:

macht es wenig SInn, mit diesem Wert nochmal ein analogRead() aufzurufen:

An welchem Pin soll da gelesen werden? Da kann nur Unsinn rauskommen.
Du musst die Variable direkt abfragen, wie im Serial.print auch:

  if (feuchte <= 400) // Feuchtigkeitswert unter 500 also Trocken

Da ist Dir der feuchte Wert als PIN untergerutscht.
das analogRead muss da weg.
Ansonsten versuchst Du irgendwo Pin 700 zu lesen :slight_smile:
(Da war der @MicroBahner wieder mal schneller ...)

Was genau soll die Pumpe da machen ?
Die Erde pumpen oder Feuchtigkeit messen ?

Das habe ich mal korrigiert und bis jetzt gibt es keine Störungen mehr, ich halte euch auf dem Laufenden, falls es Rückfälle gibt. Danke für die Hilfe!

1 Like

Ok, aber was ist das jetzt für ein Messgerät ?
Wie ist das am Arduino angeschlossen ?

Merke: Ein Programm macht immer³ genau das was man programmiert hat.
Wenn das Verhalten des Programms anders ist als das Verhalten, dass man erwartet dann versteht man das eigene Programm (noch) nicht.

³ Die Ausnahmen davon sind extrem selten. In einem von einer Milliarde Fällen hat der Microprozessor einen Fertigungsfehler oder ein Gammablitz aus dem Weltall hat in den Prozessor eingeschlagen.
vgs

Die Zeile ist dein Fehler.

analogRead(feuchte)

Die liest bei dir den Pin aus, dessen Wert die Feuchte hat.
Also, wenn die erste Feuchte z.B. den Wert 600 hat, dann versuchst du den Pin 600 auszulesen.

Versuche es doch mal mit:

if (feuchte <= 400)

Entschuldige kaepiebln
Hab einen Fehler gemacht und Deinen Post irrtümlich in einen neuen Tread geschoben. Jetzt habe ich das rückgängig gemacht.
Bitte nimm meine Entschuldigung an.
Grüße Uwe

3 Likes

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