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.
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.
Feuchtigkeit setzte dem Sensor / Platine / Kabel zu
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.
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.
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.
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
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?
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