Wasserstand Sensor laeuft im Probebetrieb, nicht in der Praxis

Hallo zusammen,
ich bin ein blutiger Anfaenger und habe mir die Finger wund gesucht und leider keine passende Loesung auf mein Problem gefunden.
Ich habe eine Zisterne vor meiner Garage und ich moechte mir den Wasserstand ueber einen Arduino (UNO R3, HC-SR04 und ein LCD Display) anzeigen lassen.
Im Probebetrieb bekomme ich einigermassen richtige Werte angezeigt. Einigermassen, da nach einiger Zeit merkwuerdige Werte angezeigt werden: Wenn der Wasserstand mal bei 91cm liegt und spaeter bei 110cm und dann wieder auf 80 cm faellt, so wird bei 80 cm immer noch eine dritte Stelle angezeigt (also statt 80 eine 800). Bekomme ich nur mit einem Reset behoben aber damit kann ich leben (wer eine Loesung dafuer hat, ich bin sehr dankbar).
Das eigentliche Problem besteht aber darin, dass ich im Praxisbetrieb vollkommen falsche Werte angezeigt bekomme (Werte, die gar nicht gemessen werden koennen).
Der Unterschied vom Probe- zum Praxisbetrieb besteht darin, dass ich ein Telefonkabel zwischen dem Arduino und dem HC-SR04 liegen habe (ca. 4m). Muss da eventuell noch was zwischengeschaltet werden? Ich habe was von Widerstaenden gelesen, weiss aber nicht welchen ich nehmen muss.

Falls ich was falsch gemacht habe (nicht technisch, sondern beim Stellen der Anfrage), so bitte ich um Entschuldigung und gelobe Besserung.

Vielen Dank und Euch noch einen schoenen Sonntag

Tom

Der Code anbei:

#include <Wire.h> 
#include <LiquidCrystal_I2C.h>

// Set the LCD address to 0x27 for a 16 chars and 2 line display
LiquidCrystal_I2C lcd(0x27, 16, 2);


// defines pins numbers
const int trigPin = 9;
const int echoPin = 10;

// defines variables
long duration;
int Wasserstand;
int Liter;

void setup()
{
  // initialize the LCD
  lcd.begin();

  // Turn on the blacklight and print a message.
  lcd.backlight();
 


  pinMode(trigPin, OUTPUT); // Sets the trigPin as an Output
  pinMode(echoPin, INPUT); // Sets the echoPin as an Input
  Serial.begin(9600); // Starts the serial communication

}

void loop()
{
  // Clears the trigPin
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);

// Sets the trigPin on HIGH state for 10 micro seconds
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);

// Reads the echoPin, returns the sound wave travel time in microseconds
  duration = pulseIn(echoPin, HIGH);

// Calculating the distance

Wasserstand= (108-(duration*0.034/2));
Liter= Wasserstand *25.3;


// Prints the distance on the Serial Monitor
//  Serial.print("Restvolumen in Liter: ");
//  Serial.println(distance);

lcd.setCursor(0,0);
lcd.print(Wasserstand);
delay(100);
lcd.setCursor(0,1);
lcd.print(Liter);
delay(100);
}

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

Gruß Tommy

Hi Tommy,
Danke Dir. Wieder was gelernt.

Wenn Du Deine Ausgabe auf eine feste Länge formatierst, hast Du das Problem mit der zusätzlichen Stelle nicht. Schau Dir mal sprintf/snprintf an.

Andere Variante: Gib bei der kleinen Zahl hinten oder vorn ein Leerzeichen aus.

Gruß Tommy

Was genau für einen Senso nutzt du ?

Für Zisternen eignet sich ein wasserdichter Sensor ganz sicher besser.

(also statt 80 eine 800)

Du mußt die 0 von 110 löschen also immer 3 Stellen ausgeben. entweder 080 oder Leerzeichen 80 oder 80 Leerzeichen.

Andererseits ist eine Messung mit Ultraschall in einem geschlossenen Raum problematisch.

  1. Feuchtigkeit setzte dem Sensor / Platine / Kabel zu
  2. In geschlossenen Räumen läuft das Echo lange nach. Du mußt längere Zeit warten bis Du die nächste Messung startest. Andererseits ändert sich der Füllstand nicht so significant, daß man mindestens einmal pro Sekunde diese messen zu müssen.

@HotSystems
HC-SR04

Grüße Uwe

rostho:
....
Der Unterschied vom Probe- zum Praxisbetrieb besteht darin, dass ich ein Telefonkabel zwischen dem Arduino und dem HC-SR04 liegen habe (ca. 4m). Muss da eventuell noch was zwischengeschaltet werden? Ich habe was von Widerstaenden gelesen, weiss aber nicht welchen ich nehmen muss.
.....

Bei der Kabellänge solltest du unbedingt abgeschirmtes Kabel (Netzwerkkabel Cat5 odet Cat6) verwenden.
Auf der Länge können sich reichlich Störungen einfangen.

uwefed:
@HotSystems
HC-SR04

Grüße Uwe

Danke Uwe,

hatte ich auch so verstanden.
Nur wenn man nach HC-SR04 googelt, dann kommt auch der wasserdichte, deswegen nochmal die Nachfrage.
Und der HC-SR04 hält in einer Zisterne nicht lange.

Hallo zusammen,
Erstmal vielen Dank an Euch alle!

Ich habe da offensichtlich mehrere Fehler begangen:

  • es ist der normale, nicht wasserfeste Sensor. Der empfohlene ist schon bestellt. Das kommt mir sogar sehr entgegen, da ich bei einem weiteren Projekt die Länge des Kabels gut gebrauchen kann.
  • Kabel: ich habe noch etliche Meter cat6 - da habe ich jetzt endlich eine Verwendung für :slight_smile:

Danke für diese Hinweise.
Bezüglich des Displays: wie lösche ich die Stellen? Einfach in dem Code innerhalb der Klammer Leerschritte einfügen?
Bzw. Wie verwende ich den Befehl sprintf/snprintf? Ich habe im Forum einen ähnlichen Eintrag gefunden (da hast Du, Tommy auch darauf verwiesen) aber wie wende ich den bei mir an?

Da es immer recht nervig ist, den ganzen Rödel abzubauen, testen und wieder draunzubauen: gib es die Möglichkeit, solche Änderungen im Code auch über wlan zu übertragen?

Danke und Gruß

Tom

Zu sprintf/snprintf solltest Du die Suchmaschine Deiner Wahl befragen.
Programmieren über WLAN geht z.B. beim WEMOS D1 mini (ESP8266).

Du solltest das System erst am Labortisch fertig/stabil haben, bevor Du damit raus gehst.

Gruß Tommy

Bezüglich des Displays: wie lösche ich die Stellen? Einfach in dem Code innerhalb der Klammer Leerschritte einfügen?

geh mit setCursor an die Position, "lösche" in dem zu Leerzeichen schreibst, dann gehst wieder retour zu gleichen Stelle mit setCursor und schreibst deine Zahl.

Hallo zusammen,
zuerst: VIELEN DANK! Es funktioniert soweit schonmal im Probelauf am Schreibtisch.
Durch die Erhoehung der Messzeiten sind die Daten jetzt auch weniger nervoes. Auf dem Display kommen jetzt auch endlich brauchbare Werte an.
Der naechste Schritt ist nun, das Teil WiFi faehig zu bekommen.
Aber so habe ich schonmal genau das was ich haben wollte. Dank Euch! Super Sache!

Viele Gruesse und DANKE

Tom

Anbei nun der Code, den ich verwendet habe:

#include <Wire.h> 
#include <LiquidCrystal_I2C.h>

// Set the LCD address to 0x27 for a 16 chars and 2 line display
LiquidCrystal_I2C lcd(0x27, 16, 2);

// Define Trig and Echo pin:
#define trigPin 9
#define echoPin 10

// Define variables:
long duration;
//int distance;
int Wasserstand;
int Liter;

void setup() {
  // Define inputs and outputs
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);

// initialize the LCD
  lcd.begin();

// Turn on the blacklight and print a message.
  lcd.backlight();

  
// Begin Serial communication at a baudrate of 9600:
  Serial.begin(9600);
}

void loop() {
// Clear the trigPin by setting it LOW:
  digitalWrite(trigPin, LOW);
  delayMicroseconds(500);

// Trigger the sensor by setting the trigPin high for x microseconds:
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(500);
  digitalWrite(trigPin, LOW);
  
// Read the echoPin. pulseIn() returns the duration (length of the pulse) in microseconds:
  duration = pulseIn(echoPin, HIGH);
  
// Calculate the distance:
  //distance = duration*0.034/2;
  Wasserstand= (108-(duration*0.034/2));
  Liter= Wasserstand *25.3;


  // Print the distance on the Serial Monitor (Ctrl+Shift+M):
  Serial.print("Wasserstand = ");
  Serial.print(Wasserstand);
  Serial.println(" cm");
  
  
lcd.setCursor(0,0);
lcd.print("Wtr lvl ");
lcd.print(Wasserstand);
lcd.print(" ");
delay(100);
lcd.setCursor(0,1);
lcd.print("Vol. ");
lcd.print(Liter);
lcd.print(" ");
delay(100);

}

Um dein Projekt WIFI-fähig zu machen, brauchst du z.B. einen ESP8266.
Je nachdem was der Controller noch alles machen muss, reicht da evtl. der ESP schon allein aus.
Du kannst auch beide (Arduino und ESP) per I2C oder seriell zusammen schließen.
Da solltest du noch mal drüber nachdenken.

... nimm aber nicht einen nackten ESP8266 sondern einen NodeMCU oder Wemos D1 - das vereinfacht den Einstieg wesentlich, die haben mehr Pins, sind einfacher in der Handhabung beim Programmieren und somit Bastlerfreundlicher. Aufpassen beim Echo Pin, der ESP ist eigentlich 3.3V

noiasca:
... nimm aber nicht einen nackten ESP8266 sondern einen NodeMCU oder Wemos D1....

Stimmt, das hatte ich vergessen zu erwähnen.

Danke