Im englischen Teil des Forum müssen die Beiträge und Diskussionen in englischer Sprache verfasst werden.
Deswegen wurde diese Diskussion in den deutschen Teil des Forums verschoben.
Spendiere am Besten eine Handskizze wie und wo die Schwimmerschalter eingebaut sind.
Welche Schwimmschalter kommen zur Anwendung?
Schicke das Datenblatt dazu.
Mach dir das Leben einfacher und trenne die Routinen.
In der LOOP -Schleife fragst du den "ist leer" Schalter ab. Wenn der auslöst, rufst du eine Funktion auf, die mit einer einfache While - Schleife läuft. Vor der Schleife schaltest du den Zulauf ein. In der While Schleife fragst du permanent "ist voll" Schalter ab. Wenn der auslöst, springst du aus der While Schleife, schaltest den Zufluss ab, und springst zurück.
So hast du Ordnung im Code und weißt immer genau was was wo macht.
Hallo @Pauli58,
du brauchst def. keine While-Schleife. Diese blockiert nur unnütz deinen Sketch.
Und du hast mit der Loop schon eine Schleife.
Mach es wie du schon versucht hast, in der Loop.
Eine einfache Version wäre diese hier:
void loop()
{
buttonStateVoll = digitalRead(buttonPinVoll);
buttonStateLeer = digitalRead(buttonPinLeer);
if (buttonStateLeer == HIGH) // Kontakt "Leer" offen
{
digitalWrite(ledPin, HIGH); //
digitalWrite(RelaisPin, LOW); // Pumpe starten
}
if (buttonStateVoll == LOW) // Kontakt "Voll" geschlossen
{
digitalWrite(ledPin, LOW);
digitalWrite(RelaisPin, HIGH); // Pumpe aus
}
}
Dabei gehe ich davon aus, dass die Schwimmerschalter einen Kontakt herstellen, wenn diese "oben" schwimmen.
const int buttonPinVoll = 6;
const int buttonPinLeer = 7;
const int ledPin = 13; // LED pin auf dem Arduino
const int RelaisPin = 5;
int buttonStateLeer = 0;
int buttonStateVoll = 0;
void setup()
{
pinMode(ledPin, OUTPUT);
pinMode(RelaisPin, OUTPUT);
digitalWrite(RelaisPin, HIGH);
pinMode(buttonPinVoll, INPUT_PULLUP);
pinMode(buttonPinLeer, INPUT_PULLUP);
}
void loop() {
buttonStateLeer = digitalRead(buttonPinLeer);
buttonStateVoll = digitalRead(buttonPinVoll);
if (buttonStateLeer == LOW) // Kontakt "Leer" geschlossen
{
digitalWrite(ledPin, HIGH); //
digitalWrite(RelaisPin, LOW); // Wasser marsch
}
if (buttonStateVoll == HIGH) // Kontakt "Voll" offen
{
digitalWrite(ledPin, LOW);
digitalWrite(RelaisPin, HIGH); // Wasser stop
}
}
Wieso sieht es danach immer so einfach aus?
vielen Dank für die Hilfe (Schwimmend sind bei mir die Schalter offen).
Mit der while-Schleife habe ich es auch hingekriegt aber in diesem Fall wohl nicht notwendig.
Das ist def. die falsche Vorgehensweise. Aber gut, daß es jetzt funktioniert.
Was die Schwimmerschalter betrifft, wundert mich diese Art. Aber ok, wenn es geht, ists gut.
Wenn man Programme erweitert ist es einfacher wenn JEDE eigenständige Operation ihre Unterroutine zuzuweisen und vor allen Dingen diese mit einen sinnvolle Namen zu versehen.
In dieser Routine wird als Kommentar erklärt was sie macht.
Sehr viele Programme werden oft erweitert. Und sollte das passieren wird eine bestehende Funktion nur sehr selten noch mal angefasst.
Ergebnis : Man hat einen Spagetticode mit jede Menge gewussele. Und so nebenbei hat mal sehr übersichtliche Abfragen ohne viel "und / oder" gemiste.
Es hat schon ein Grund wieso es Locale Variablen gibt, die nur in Modul bzw. hier nur in der SUB-Routine aktiv sind. Sowas verhindert nämlich sehr wirkungsvoll auch gewusssele.
Aber so langsam verstehe ich wieso die Regierung sich ausspionieren lässt. Bei solchen IT-Leuten. Die nicht einmal vernünftig coden können.
Und was hat das mit den While.-Schleifen zu tun ?
Nur um diese Schleifen ging meine Anmerkung.
Hast du das nun endlich mal begriffen. Das hättest du schon merken können, wenn du den kompletten Thread gelesen hättest und nicht nur das was dir gefällt.
Und nochmal: Im Rausreden bist du fast perfekt.
Und jetzt ist Schluss, Punkt.