kapazitiver Wasserstandsmesser

Hallo zusammen
Ich bin neu hier im Forum und habe erste Schritte mit den uno gemacht. Jetzt habe ih aber ein Problem bei dem ich nicht weiter komme. Die Praxisbeispiele im Netz helfen mir leider nicht (weil sie nicht funktionieren).
Das ist mein Problem:
Ich möchte in einem Wasserbecken den Wassstand über einen Pegelmesser realisieren. Die üblichen "Kupferdrähte" funktionieren auf dauer nicht da sie sich mit der Zeit auflösen. Daher habe ich mich für die kapazitive Messung entschieden. Bei einem bestimmten Messwert soll die Wasserpumpe (Relaiskarte steuert 230 Pumpe) eingeschaltet und bei einem anderen wieder ausgeschaltet werden. Hier mein Code:

void setup()
{
Serial.begin(9600);
pinMode(A0, INPUT); //Messfühler
pinMode(13, OUTPUT); // pumpe
}

void loop()
{
int s = analogRead(A0); //Messwert
Serial.print(s); Serial.print(" - ");

if(s > 350 && s <= 500) {
Serial.println("giessen");
digitalWrite(13, HIGH);
} else
if(s > 1 && s <= 349) {
Serial.println("nass");
digitalWrite(13, LOW);
}
delay(50);
}

Der serielle Monitor gibt auch alles prima aus. leider funktioniert der "digitalwrite"-Befehl nicht.
Hat jemand ne Ahnung warum???

Vielen Dank Maik

Hallo,

nimm eine Ultraschallsensor!

den kann ich da schlecht verbauen. Der Wasserstand liegt auch nur bei 8 cm.

Was heisst, dass der digitalWrite-Befehl nicht funktioniert, an was erkennst du das?

Im Serial-Monitor siehst du also "giessen" / "nass", aber die LED auf dem Board geht nicht an oder aus?
Macht die LED beim Blink-Sketch was sie soll?

Grüsse
Peter

Hallo,

sag erst mal was du für einen Behälter hast Maße usw

Hallo Peter

genau das ist mein Problem
Ich haben einen einfachen sketch für die steuerung der Relaisplatine verwendet. mit delay schaltet der die pumpe alle x Sekunden ein und aus.

Wenn ich den sketch um die Messwerte und um digtialwrite erweitere schaltet die Platine nicht mehr.

@ar182
Ich verstehe Dein Nachfragen nicht.

Der TO hat digitalWrite(13, HIGH); bzw digitalWrite(13, LOW); in seinem Sketch und der funktioniert seiner Meinung nicht.
Wie vorgeschlagen sollte er das Blink-Beispiel der IDE auf den Arduino laden und kontrollieren ob das LED L blinkt.

@maik0815
Mach mal probeweise das delay() länger zB 2000. So siehst Du wenn die LED angeht und gleich beim nächsten Durchlauf aus.

Du solltest eine Hysterese programmieren. zB

s > 350 && s <= 500) trocken; LED aus
s < 250 naß, LED ein

So hast Du kein sschnelles Ein-Ausschalten wenn der Meßwert um den Grenzwert liegt.

Grüße Uwe

Danke Uwe

Es handelt sich bei dem Gesamtprojekt um ein Aquaponik-System. Ich will im Beet mit den Maßen 80cm x 40 cm und einer Höhe von 10 cm das Wasser über die Pumpe einlaufen lassen und wenn die Höhe des Überlaufs erreicht ist wieder ausschalten.
Mein Ansporn war die Messung der relaen Füllstände (um eventuelles "verdrecken" der Pumpe zu berücksichtigen).
Aktuell schaltet das Relais ein, wartet mittels delay 2 Minuten und geht wieder aus. warten 60 Minuten und geht wieder für 2 Minuten an. Es funktioniert also.
Aber warum verdammt, geht es nciht mit dem Messfühler :wink:

Hallo

Warum nimmst du nicht ganze einfach einen Pegelschalter? diese können minimale wasserstände erkennen. also die 8 cm die du hast auf jedefall. (sind auch einstellbar) diese gibt es Kunstoff oder Edelstahl.

Dort programmierst du den high Eingang der eine Zeitverögerung drinne hat z.b 1 min. Liegt das signal 1 min an soll er die Pumpe einschalten.
nun den Low eingang der z.b nach 10sec den ausgang wieder abschaltet. Ist das einfachste was du machen kannst und das auch noch funktioniert da die pegelschalter mit einem Readkontakt arbeiten, also nichts mechanisches.
Ich frage so auch meinen Pumpensumpf im Keller ab wenn high dann Pumpe ein und wenn low dann eine Minute nachlauf der Pumpe, da der pegelschalter nicht bis zum Boden reicht. Fertig mit dem ganzen.
Die Teile bekommst du schon für 2 euro beim Chinesen.*gg

Würde auch mal Uwes Vorschlag mit dem längeren Delay (auch wenn Delay böse ist, aber für die Testzwecke hier ganz ok) versuchen.

In welchem Bereich liegen denn deine Werte der Variable "s"?
Schaltet die LED gar nicht? Oder in welchem Zustand befindet sich diese?

Grüsse
Peter

Auch ich sehe besser die Überwachung mittels Schwimmsschalter zu realisieren. Wenn Du dann anzeigen willst wieviel Wasser da ist dann kannst Du eine zusätzlichen Pegelmessung machen.

Grüße Uwe

uwefed:
@ar182
Ich verstehe Dein Nachfragen nicht.

Weil man dann Alternativen vorschlagen kann.
Und weil die kapazitive Messung mit einen Arduino extrem unzuverlässig ist.

Das mit dem Pegelschalter finde ich auch gut, da hat man einen exakten Schaltpunkt.

Ich würde es mit zwei Edelstahlelektroden realisieren.
Eine mit GND verbunden und die Andere mit einen Analogeingang und 22 kOhm Pullup.
Zusätzlich verbindest du den Analogeingang mit einen Digitalausgang.
Mit dem ziehst du die Elektrode am Analogeingang während der Messpause auf GND.
Das verhindert die Elektrolyse, weil die Messung in weniger als einer ms durchgeführt ist.
Wenn du dann nur einmal pro Sekunde misst dürften die Elektroden ziemlich lang halten.

Gruß Aron

Hallo zusammen
Danke für die vielen Antworten. das mit dem längern delay und der blinkenden LED verstehe ich nicht. Also ich verstehe was ihr mir sagen wollt, aber wenn die Relaiskarte meien pume zuverlässig im 5 Sekundentakt an und aus schaltet (wie oben geschrieben) dann funktioniert die ganze Sache doch. Lediglich die Verwendung der Messwerte als Schaltpunkt klappt nicht.
Schwimmerschalter hatte ich auch am Anfang auf dem Plan aber es ist wenig Platz. Ich versuche mal ein Foto hochzuladen.

anbei 2Bilder

Hallo zusammen
Kann mir eventuell jemand helfen, ich habe jetzt den Ultraschallsensor verbaut, leider bleibt das Problem bestehen. Die Sensorwerte werden zur Steuerung der Relaiskarte nicht erkannt.
Ein einfaches Skript für die Relaiskarte habe ich getestet, das funktioniert.
Es soll ja der wasserstand in einem Tank geregelt werden. Ist er leer, zeit der Sensor 9cm an, ist der voll sind es 3 cm.
Hier mein script:

int trigger = 7;
int echo = 6;
long dauer = 0;
long entfernung = 0;
const int wasserpumpe = 8;       
void setup()
{
 Serial.begin (9600);
 pinMode(trigger, OUTPUT);
 pinMode(echo, INPUT);
 pinMode(wasserpumpe, OUTPUT);
}
void loop()
{
 digitalWrite(trigger, LOW);
 delay(5);
 digitalWrite(trigger, HIGH);
 delay(10);
 digitalWrite(trigger, LOW);
 dauer = pulseIn(echo, HIGH);
 entfernung = (dauer / 2) * 0.03432;
 if (entfernung >= 12 || entfernung <= 0)
 {
   Serial.println("Kein Messwert");
 }
 else
 {
   Serial.print(entfernung);
   Serial.println(" cm");
 }
 //Es wird eine weitere IF-Bedingung für den Sensor erstellt:
if(entfernung < 9){
digitalWrite(wasserpumpe, HIGH);
}
else if (entfernung > 10){
digitalWrite(wasserpumpe, LOW);
}
// Bedingung2
if(entfernung < 3){
digitalWrite(wasserpumpe, LOW);
}
else if (entfernung >3){
digitalWrite(wasserpumpe, HIGH);
} 
 delay(1000);
}

Setze Deinen Code bitte in Codetags (</>-Button oben links im Forumseditor oder [code] davor und [/code] dahinter ohne *).
Das kannst Du auch noch nachträglich ändern.

Entferne bitte vorher die unnötigen Leerzeilen und formatiere den Sketch ordentlich. + T in der IDE hilft Dir dabei.

Gruß Tommy

hab ich, so ok ? sorry

Danke.
Deinen Bedingungen sehen komisch aus.
Warum einmal mit < / > 9 und dann nochmal das Gleiche mit 3? Wo soll da der Sinn sein?

Gruß Tommy

Hallo
na ich versuche die beiden Grenzwerte einzubeziehen. und das <> soll das schnelle schalten der Relais beim erreichen der Grenze verhindern.

Dann male Dir mal von 0 - 12 Vcm auf, was bei jeder SpannungEntfernung passiert.

Gruß Tommy