Nachfüllschaltung

Hallo,
ich möchte über 2 Schwimmerschalter ein Magnetventil zum nachfüllen eines Wasserfasses steuern.

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() {
  buttonStateVoll = digitalRead(buttonPinVoll);
  buttonStateLeer = digitalRead(buttonPinLeer);
  
  if (buttonStateLeer == LOW||buttonStateVoll == LOW)
  {
    digitalWrite(ledPin, HIGH);
    digitalWrite(RelaisPin, LOW);
  }
  else
  {
    digitalWrite(ledPin, LOW);
    digitalWrite(RelaisPin, HIGH);
  }
}

Wie müsste die Abfrage lauten, damit immer erst umgeschaltet wird wenn der jeweilige Endstand erreicht wird (komme einfach nicht drauf)?

Liebe Grüße
Gerald

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.

mfg ein Moderator.

Hallo Pauli58

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.

Jedenfalls programmiere ich so.

Gruß

Pucki

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.

Nein ist es nicht.

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.

Gruß

Pucki

ps. : Freut mich das es jetzt läuft.

Ich finde Schleifen auch hübsch....
Wenn sie einem allerdings die Nebenläufigkeit kaputt machen, dann werden sie eher hässlich.

Geht das jetzt wieder los ?
Lies doch bitte mal richtig, worum es geht.

Ich habe nichts von deinen Unterroutinen (heißen hier übrigens Funktionen) geschrieben, sondern von den unnötigen While-Schleifen.

Du hasst nur nicht verstanden was ich sagen wollte.

Void fass_voll_machen () {
  bool lauf = false;

// Schalte Pumpe an

 lauf = true ;
while (lauf == true) {
  if (schalter_voll == high) {
     lauf = false;
  }
}
// schalte_pumpe_aus
}

SO habe ich mir das vorgestellt.

Dann braucht man ich void Loop oben nur noch 1 Zeile.

wenn Schalter_leer == aktiv dann rufe fass_voll_machen auf.

Das spart zig if abfragen, und man kann den Code besser lesen.

Gruß

Pucki

ps: Ich hoffe ich habe alle Klammern und Symikolons richtig gesetzt.

Dann beschreibe es doch zukünftig richtig und rede dich nicht immer raus.
Dazu gehören auch richtige Zitate.

Wie soll man wissen was du sagen willst, wenn du nur rumschwafelst.

Was ist an den obrigen Satz nicht zu verstehen. ???

Gruß

Pucki

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.

1 Like