/*
Ich schreibe gerade ein Programm für eine Anlage zur Wasserentnahme. Aber ich habe ein Problem mit dem Abbruch von der for Schleife. Die Abbruchbedingung wird ignoriert und die For Schleife läuft jedes mal bis zum Ende. Hat jemanden eine Ahnung woran das liegt? Wurde meine Abbrucbedingung nicht richtig formuliert?
Den Code steht unten
*/
#include "Wasserentnahme.h"
#include "Standby.h"
#include "Spuelung.h"
//const byte interruptDesaktivierungPin = 2;
int Niederdruckschalter = 12;
int Hochdruckschalter = 13;
int Spuelventil = 7;
int Drainventil = 6;
int Pumpe = 4;
int Uvclampe = 5;
int Hauptventil = 3;
unsigned long truutime1;
unsigned long truutime2;
Wasserentnahme wasserentnahme( Hauptventil, Drainventil, Pumpe ,Uvclampe, Spuelventil ); // Kontruktor
Standby standby(Hauptventil, Drainventil, Pumpe , Uvclampe, Spuelventil);
Spuelung spuelung(Hauptventil, Drainventil, Pumpe , Uvclampe, Spuelventil);
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
pinMode(Hochdruckschalter , INPUT);
pinMode(Niederdruckschalter, INPUT);
}
void loop() {
truutime1 = millis();
// put your main code here, to run repeatedly:
Niederdruckschalter = digitalRead(12); // Niederdruckschalter wird am Pin 12 gelesen
Hochdruckschalter = digitalRead(13); // Hochdruchschalter wird am Pin 13 gelesen
delay(1000);
switch (Niederdruckschalter) { // Zur überprüfung ob der Niederdruckschalter HIGH oder LOW ist
case HIGH: // Niederdruckschalter ist HIGH
Serial.println("Niederdruckschalter HIGH");
for (int x = 0; x < 10; x++) { // For Schleife für Durchführung der Wasserentnahme
Hochdruckschalter = digitalRead(13);
delay(2000);
if (Hochdruckschalter == LOW) { // Bedindung zum Abbruch von der Schleife
Serial.println("Hochdruckschalter LOW");
break;
}
wasserentnahme.Entnahme(); // Wasserentnahme wird gestartet
Serial.println("Wasserentnahme");
}
Serial.println("Wasserentnahme beendet");
if (truutime1 > 2000) { // Überprüfung ob Wasserentnahme genug lange durchgeführt wurde
truutime2 = millis();
while (Hochdruckschalter == LOW) { // Die Wasseerentnahme wurde genug lange durchgeführt
spuelung.Spuelvorgang(); // Startet man den Spüllvorgang
Serial.println("Spüllvorgang startet");
if (truutime2 > 30000) { // Nach 30 Sekunden Spüllen , in StandbyModus gehen
standby.StandbyModus();
break;
}
break;
}
}
else {
standby.StandbyModus(); // Wurde die Wasserentnahme nicht genug lange durchgeführt dann geht man auf dem Standbymodus
Serial.println("Wasserentnahme nicht genug lange durchgeführt, standBy");
}
break;
case LOW: // Niederdruckschalter LOW, man geht auf standbymodus
standby.StandbyModus();
break;
}
}
Nein steht er nicht, denn es fehlen die Headerdateien von Dir.
Und wie schon gesagt, ist der nicht lesbar, weil irgendwie nicht formatiert.
Aber eines wird Dir auf die Füsse fallen:
Dein Break.
Das schmeisst Dich an der Stelle aus dem case und kommt sofort wieder an die Stelle zurück durchs loop().
Lesenswert:
Schreib mal was Du erwartest, damit man das Codeschnipsle dann auch nachollziehen kann.
Ich würde für 2 Möglichkeiten nicht Switch case sondern ein einfaches IF nehmen.
For wird abgebrochen wenn Du die Variable auf einen Wert der der Abbruchbedingung entspricht.
Dann fliegt er aus dem case.
Das war seine ursprüngliche Version. Darum sollte er ja continue nehmen. Dann läuft die Schleife nur bis dahin und lässt alles was dann noch käme unbearbeitet liegen.
Da ich heute wieder was habe, wo ich das testen kann, sehe ich mich von gestern leider daneben.
Noch viel schlimmer: das mit dem if-Konstrukt funktioniert.
void setup()
{
Serial.begin(115200);
Serial.println(F("Start..."));
}
void loop()
{
bool Hochdruckschalter;
for (int x = 0; x < 10; x++)
{
Serial.println(x);
Hochdruckschalter = LOW;
delay(2000);
if (Hochdruckschalter == LOW)
{ // Bedindung zum Abbruch von der Schleife
Serial.println("Hochdruckschalter LOW");
break;
}
//wasserentnahme.Entnahme(); // Wasserentnahme wird gestartet
Serial.println("Wasserentnahme");
}
Serial.println("Wasserentnahme beendet");
}
Ich würde jetzt erwarten, das wenigstens irgendwann x höher 0 würde.
Macht es aber nicht:
wenn man die x=10 nicht in geschweifte klammer nach if Bedingung rein macht wird die For Schleife abgebrochen, egal ob die break Kondition erfüllt ist oder nicht. Aber das wollen wir nicht. Hier will ich den Abbruch der For Schleife nach Erfüllung der if Bedingungen
Dein Programm ist richtig. ich habe meins noch mal geprüft. Da ich nur ein Schalter zur Verfügung hatte, habe ich der NiederdruckschalterPin an +5V der Spannung Versorgung gesteckt und der Schalter für HochdruckschalterPin benutzt. Irgendwie ist der Schalter kaputt, weil danach habe ich den +5V und Masse als HIGH und LOW für den HochdruckschalterPin benutzt und das Programm läuft jetzt ganz gut. Ich werde mir andere Schalter kaufen um sicher zu sein dass meine Überlegung richtig war
Ich habe meine ganze Schaltung wieder geprüft und habe einen Fehler bei der Schaltung von meinem Schalter. Es wurde kein LOW am Eingang des DigitalPin geschickt. Ich habe alles korrigiert. Jetzt läuft alles gut.
Danke für die Hilfe