Sketch hält nicht bei While

Moin Leute, ich habe nun nach einer gefühlten Ewigkeit die Nase voll und bitte euch um Hilfe.
Ich hab einen Sketch geschrieben, habe aber das Problem, dass der Skatch bei While nicht in eine Schleife geht.

Das ist der Skatch:

int messwert;
int messwert2;
int Relais=7; 
int messwert3;

void setup()
{
 Serial.begin(9600);
pinMode (7, OUTPUT); 
pinMode(13, OUTPUT);
digitalWrite(7, HIGH);
}

void loop()

{





messwert=analogRead(A0);


Serial.print("Feuchtigkeits-Messwert:");

Serial.println(messwert);

delay(500);

if (messwert >500) 

{ 

digitalWrite(Relais, LOW);
digitalWrite(13, HIGH);
delay(6000); 
digitalWrite(13, LOW);
digitalWrite(Relais, HIGH);


}
delay(20000);
messwert2=analogRead(A0);

if (messwert2 >500)
{
Serial.print("Ich halte");
while(1);
}
else
{
Serial.print("Ich halte nicht");
}
delay(20000);

messwert3=analogRead(A0);


do
{
 delay(50);          // wait for sensors to stabilize
messwert3=analogRead(A0);
}
while (messwert3 >500);


}

Danke Für jede Hilfe :smiley:


Schon mal geschaut, welche Werte in messwert2 stehen?

Wie meinst du das, welche Werte in Messwert2 stehen? DAs ist doch in der Whileschleife eine andere Variable :o

WSL07:
Moin Leute, ich habe nun nach einer gefühlten Ewigkeit die Nase voll und bitte euch um Hilfe.

Das könnten wir auch laufend schreiben, da sich keine darum schert.

Setze deinen Sketch in Code-Tags.

Verwende dazu die Schaltfläche </> oben links im Editorfenster.
Das kannst du auch nachträglich machen.
Dazu den Sketch markieren und die Schaltfläche klicken.

Damit wird dieser für alle besser lesbar.

HotSystems:
Das könnten wir auch laufend schreiben, da sich keine darum schert.

Na da ist aber jemand nett... Hab ich gemacht, wusste ich vorher nicht. Könntest du mir als erfahrener Nutzer auch helfen:D

Könntest du mir als erfahrener Nutzer auch helfen:D

Was gefällt dir an meiner Frage nicht?

Tipp:
Ausblenden, der Frage, hilft dir nicht.

combie:
Was gefällt dir an meiner Frage nicht?

Tipp:
Ausblenden, der Frage, hilft dir nicht.

Dich hab ich doch damit garnicht gemeint. Deiner Frage habe ich doch oben schon geantwortet:D.

WSL07:
Na da ist aber jemand nett... Hab ich gemacht, wusste ich vorher nicht.

Nett sind wir hier alle.
Und für Dinge, die man nicht weiß, gibt es das "How to use this Forum"!

Deinen Sketch sehe ich mir gleich an.

HotSystems:
Nett sind wir hier alle.
Und für Dinge, die man nicht weiß, gibt es das "How to use this Forum"!

Deinen Sketch sehe ich mir gleich an.

Alles Klar nun weiß ich es ja. Das wäre super.

WSL07:
Wie meinst du das, welche Werte in Messwert2 stehen? DAs ist doch in der Whileschleife eine andere Variable

Das ist keine Antwort, mit der combie, du, oder der Rest der Welt etwas anfangen kann, fürchte ich.

Mal abgesehen davon, dass du zwei while in deinem sketch hast (deren Sinn ich in beiden Fällen nicht erkenne), was für Ausgaben auf Serial kommen denn an?
Wie oft kommt die Ausgabe "Feuchtigkeits-Messwert:xxx";
Stimmt denn die LED-Anzeige mit der Test-Ausgabe überein?

Hast du die begründete Hoffnung, dass 20 Sekunden, nachdem das Relais für 6 sek an war, der Messwert auf unter 500 gesunken ist?
Wenn jemals die Meldung "Ich halte" kam, sollte der Arduino einen Reset brauchen. Richtig?...

Und, wo wir schon beim Fragen sind:
Warum verwendest du verschiedene messwert Variable? Die du dann doch nicht mehr verwendest?

michael_x:
Mal abgesehen davon, dass du zwei while in deinem sketch hast (deren Sinn ich in beiden Fällen nicht erkenne), was für Ausgaben auf Serial kommen denn an?
Wie oft kommt die Ausgabe "Feuchtigkeits-Messwert:xxx";
Stimmt denn die LED-Anzeige mit der Test-Ausgabe überein?

Hast du die begründete Hoffnung, dass 20 Sekunden, nachdem das Relais für 6 sek an war, der Messwert auf unter 500 gesunken ist?
Wenn jemals die Meldung "Ich halte" kam, sollte der Arduino einen Reset brauchen. Richtig?...

Und, wo wir schon beim Fragen sind:
Warum verwendest du verschiedene messwert Variable? Die du dann doch nicht mehr verwendest?

Ich probiere mal alles zu beantworten.
Der erste while soll dafür sorgen, dass der Komplette Sketch anhält und nicht mehr weiter läuft.
Beim Zweiten soll der Sensor solange messen, bis der Wert wieder über 500 ist.
Hintergrund dazu ist, dass an dem Relais eine Pumpe hängt, welche Wasser abpumpt. Sie soll dann solange warten, bis das Wasser wieder am Feuchtigkeitssensor angekommen ist. Dann soll sich der Vorgang wiederholen. Die zweite if-Bedingung ist dafür, dass wenn die Pumpe verstopft ist, das System nicht ewig Strom zieht.

Ankommen auf dem Serial tut die Feuchtigkeitsmeldung und "ich halte nicht an". Danach jedoch wiederholt sich der Vorgang ohne das der Sensor einen Wert über 500 hat. Die Led funktioniert wie im Sketch programmiert.

Ich habe die 6 Sek. testweise eingestellt, um nicht jedes mal so lange warten zu müssen, danke für den Hinweis:D

Richtig, jedes mal wenn "ich halte" kommt soll man den Arduino resetten müssen.

Danke für die Hilfe

Ankommen auf dem Serial tut die Feuchtigkeitsmeldung und "ich halte nicht an". Danach jedoch wiederholt sich der Vorgang ohne das der Sensor einen Wert über 500 hat

Das hast du doch so programmiert, was ist daran falsch?
Solange der Sensor unter 500 ist, kommt alle 40 sek. "ich halte nicht an".

Controller werden üblicherweise so programmiert, dass sie ewig laufen und immer das gleiche machen. Und das ist gut so :wink:
Noch besser wäre es, wenn sie gar keine delay(20000) dafür brauchen und keine while Schleifen.

michael_x:
Das hast du doch so programmiert, was ist daran falsch?
Solange der Sensor unter 500 ist, kommt alle 40 sek. "ich halte nicht an".

Controller werden üblicherweise so programmiert, dass sie ewig laufen und immer das gleiche machen. Und das ist gut so :wink:
Noch besser wäre es, wenn sie gar keine delay(20000) dafür brauchen und keine while Schleifen.

Das Problem aber ist, dass er nicht nur sagt "ich halte nicht an" sondern er den Loop einfach fortsetzt.

Was meinst du, warum die Funktion loop() heisst?

Das Ende von loop() ist der Anfang von loop().

in Wirklichkeit läuft sowas wie:

void main() {
  __init();
  setup();
  while(1) loop();
}

Mehr while Schleifen sind in der Regel Mist. Am besten dauert ein loop() Durchlauf keine Zeit und kommt dafür unendlich oft dran.

michael_x:
Was meinst du, warum die Funktion loop() heisst?

Das Ende von loop() ist der Anfang von loop().

in Wirklichkeit läuft sowas wie:

void main() {

__init();
  setup();
  while(1) loop();
}


<sup>Mehr while Schleifen sind in der Regel Mist. Am besten dauert ein loop() Durchlauf keine Zeit und kommt dafür unendlich oft dran.</sup>

OK, dann muss ich mir was ganz anderes ausdenken. Trotzdem danke für eure Hilfe

Grüße

Wenn du “nichts” machen willst: loop() läuft einfach durch ohne irgendwas zu tun

Wenn du etwas nur tun willst wenn ein Ergebnis eintritt: if-Abfrage

Zeitsteuerung kann man mit millis()/BlinkWithoutDelay machen. Abhängigkeiten von Ereignissen geht mit Zustandsvariablen

WSL07:
OK, dann muss ich mir was ganz anderes ausdenken. Trotzdem danke für eure Hilfe

Die Funktionen deines Sketches erschließen sich mir nicht.

Evtl. kannst du ja noch die von dir gewünschten Funktionen kurz erklären.
Dann können wir da auch noch ein paar Tipps geben.

Eine Pumpensteuerung würde ich nie über eine Zeit fahren.
Immer über Sensoren oben (einschalten) und unten (ausschalten), o. ä.
So steuere ich z.B. meine Drainagepumpe, und das schon über Jahre.

Kommt natürlich sehr drauf an, was du mit deiner Pumpe machen willst.