Wasser-Sensor und LCD Bildschirm verbinden

Hi zusammen!

Ich habe ein kleines Problem, was eher an meiner Unwissenheit liegt. Ich bin noch Arduino Neuling und habe mir das Starter-Kit vor einigen Wochen gekauft. Ich möchte für ein Projekt einen Wassersensor und einen LCD Bildschirm verbinden, bedeutet also:

Wenn der Wassersensor anzeigt, dass in einem Glas kein Wasser mehr vorhanden ist, soll der LCD Bildschirm einen vorgegebenen Code ausgeben. Wenn im Glas wieder Wasser drin ist, soll der LCD Bildschirm einfach nur sinngemäß sagen: "Trinke das Wasser, um einen neuen Code zu generieren".

Ich habe den Wassersensor nach einem Tutorial nachgebaut, der funktioniert und spricht mit Hilfe des folgenden Codes ein Licht an, das bei einem der Zustände leuchtet.

int analogPin = 0; // water sensor connected to the analog port 1
int led = 12; // LEd connected to the digital mouth 12
int val = 0; // definition variable val initial value as 0
int data = 0; // definition variable data initial value as 0
void setup ()
{
pinMode(led, OUTPUT); // definition led as output pin
Serial. begin(9600); // set the baud rate as 9600
}
void loop ()
{
val = analogRead (analogPin); // read the simulation value and send to variable val
if(val > 400) {// judgment variable val is whether more than 700 or not
digitalWrite(led, HIGH); // variable val greater than 700, LED on
}
else {
digitalWrite(led, LOW); // variable val less than 700, LED off
}
data = val; // variable val assignment to variable data
Serial.println(data); // serial print variable data
delay (100);
}

Das Display konnte ich auch anschließen und einen Text ausgeben mit Hilfe einer Anleitung, die ich bei einer Rezension über das Display gelesen habe. Eigentlich wird nur der LCD Hello World Code aus der Bibliothek benutzt.

Ich möchte jetzt eigentlich nur die beiden verbinden, wie oben beschrieben. Wenn der Wassersensor misst, dass kein Wasser im Glas ist, soll der Code angezeigt werden. Und wenn das Glas mit Wasser wieder gefüllt ist, soll einfach angezeigt werden, dass man es trinken soll.

Vielleicht kann mir jemand einen Tipp geben, wie ich weiter vorgehen muss, das wäre sehr nett. Ich habe schon ein paar Tutorials ausprobiert, die sich aber mit anderen Sensoren beschäftigt haben und dies nicht übertragen können auf meinen "Fall". Vielleicht kennt jemand von euch ein Tutorial mit einem Wasser-Sensor und einem LCD Bildschirm? Ich habe nichts brauchbares gefunden. :frowning:

Beste Grüße,

Fixogum

Edit: Diese Sachen habe ich gemeinsam mit meinem UNO verwendet:

Wassersensor
LCD Display

Hallo Fixogum

sowas kann man mittels einer if-Abfrage erledigen.

if "Bedingung efüllt"
     {
      mache das;
      mache dies;
      und so weiter;
      }

in deinem Fall

if ((data) < "Grenzwert")
     {
     lcd.setCursor(0 ,0);  //der Textbeginn wir hier festgelegt
     lcd.print("Glas ist leer); //dies ist im Hallo World Beispiel der Text der im LCD dargestellt wird
     }  //diese Klammern musst Du setzen wenn nach der if - Abfrage mehr als eine Anweisung steht
  else //dies wird ausgeführt wenn die obere if-Abfrage nicht zutrifft
    {
     lcd.setCursor(0 ,0);  //der Textbeginn wir hier festgelegt
     lcd.print("Glas ist voll); //dies ist im Hallo World Beispiel der Text der im LCD dargestellt wird
     }

das ganze musst Du natürlich in die voit loop() -Schleife packen damit es immer ausgeführt wird

Viel Spass Rudi

Hi,

danke dir schonmal für den Code!

Ich stoße anscheinend an meine Wissensgrenzen, das merke ich jetzt stark. Ich habe deinen Code versucht einzubinden, doch dann kommt diese Fehlermeldung:

  This report would have more information with
  "Show verbose output during compilation"
  enabled in File > Preferences.
Arduino: 1.0.6 (Mac OS X), Board: "Arduino Uno"
sketch_feb08a.ino: In function 'void loop()':
sketch_feb08a:28: error: ISO C++ forbids comparison between pointer and integer

Dies ist der Code:

int analogPin = 0; // water sensor connected to the analog port 1
int led = 12; // LEd connected to the digital mouth 12
int val = 0; // definition variable val initial value as 0
int data = 0; // definition variable data initial value as 0

#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,20,4);  // set the LCD address to 0x27 for a 16 chars and 2 line display

void setup ()
{
pinMode(led, OUTPUT); // definition led as output pin
Serial. begin(9600); // set the baud rate as 9600
}
void loop ()
{
val = analogRead (analogPin); // read the simulation value and send to variable val
if(val > 400) {// judgment variable val is whether more than 700 or not
digitalWrite(led, HIGH); // variable val greater than 700, LED on
}
else {
digitalWrite(led, LOW); // variable val less than 700, LED off
}
data = val; // variable val assignment to variable data
Serial.println(data); // serial print variable data
delay (100);

if ((data) < "Grenzwert")
     {
     lcd.setCursor(0 ,0);  //der Textbeginn wir hier festgelegt
     lcd.print("Glas ist leer"); //dies ist im Hallo World Beispiel der Text der im LCD dargestellt wird
     }  //diese Klammern musst Du setzen wenn nach der if - Abfrage mehr als eine Anweisung steht
  
else //dies wird ausgeführt wenn die obere if-Abfrage nicht zutrifft
    {
     lcd.setCursor(0 ,0);  //der Textbeginn wir hier festgelegt
     lcd.print("Glas ist voll"); //dies ist im Hallo World Beispiel der Text der im LCD dargestellt wird
     }

}

Noch eine andere kurze Frage:

Leider bemerke ich gerade beim Aufbau, dass ich wohl an meine Wissensgrenzen stoße. Ich habe ja nur einen 5V Anschluss, den habe ich mit einem Breadboard verbunden um eben den Wasser-Sensor und den LCD Bildschirm anzuschließen. Funktioniert wunderbar. Ich habe aber auf dem Breadboard auch eine LED verbunden, weil ich (wie im Code oben beschrieben) diese zum Leuchten bringen wollte. Hat beim ersten Aufbau gut funktioniert, jetzt leuchtet die LED nicht mehr wenn der Wasser-Sensor mit im Ground angeschlossen ist (egal ob über das Breadboard oder das UNO). Prinzipiell ist es so, dass ich diese LED nicht brauche, aber sie war eben mein bisheriger Test ob der Wassersensor überhaupt funktioniert. Woran kann das liegen?

Vielen Dank für die schnelle Hilfe, Rudi!

if ((data) < "Grenzwert")

Das ist Pseudocode

Du musst da schon eine Zahl eintragen. z.B.

if ((data) < 100)

Nimm dir mal einen Grundkurs vor und acker den auch durch. Dann dauert es keine 5 Minuten, das gewünschte Programm zu erstellen.

Danke, Serenifly!
Hab ich jetzt gemacht, hatte das übersehen. :-[ Das Display ist eingeschaltet, aber es ändert sich nichts.

@ElEspanol
Habe ich schon getan, die meisten Sachen bekomme ich auch hin. Nur den Wasser-Sensor mit dem LCD Display zu verbinden hat bis jetzt nicht funktioniert.

Naja, hinbekommen und vernünftig machen sind zwei Sachen

Sieht man auch hier klar. Du hast ja hier schon eine Abfrage:

if(val > 400) 
{// judgment variable val is whether more than 700 or not
   digitalWrite(led, HIGH); // variable val greater than 700, LED on
}
else 
{
   digitalWrite(led, LOW); // variable val less than 700, LED off
}

Da brauchst das also eigentlich nicht noch extra für das LCD zu machen.

Ich benötige aber den LCD Bildschirm, um einen Code auszugeben, den man für eine Anwendung braucht (sozusagen ein Passwort für eine Software). Die LED soll später ganz rausgenommen werden.

Na und? Dann kommentiert man halt die zwei Zeilen digitalWrite() aus oder entfernt sie.

warum machst du das dann nicht? anstatt der led an oder auszuschalten schreibst du halt was auf das Display, das idealerweise vorher gelöscht wird.

Woher kommt das Passwort?

ElEspanol:
das Display, das idealerweise vorher gelöscht wird.

Das ist gerade gar nicht der ideale Weg, da das lange dauert und dann flackert. Man überschreibt immer nur was sich ändert und füllt die Differenz gegebenenfalls mit Leerzeichen.

In dem Test mit "Glas ist voll" und "Glas ist leer" braucht man gar nichts zu machen, da der Text gleich lang ist.

Hallo!
Das LCD funktioniert ?
Mit meiner Library schauts so aus:

LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); // Set the LCD I2C address

und dann im Setup:
lcd.begin(20,4);

An der Led hast einen Widerstand um die 220 Ohm verbaut ?
Warum nimmst nicht die "verbaute" Led am D13 zum testen ?

mfg Martin

klar stimmt, in diesem Fall wenn das Display ständig aktualisiert wird besser nicht löschen. Ich aktualisiere das lcd nicht ständig, sondern intervallmässig oder wenn sich was ändert

Also, ganz vereinfacht gesagt soll es folgendermaßen ablaufen:

Glas ist voll > LCD Display zeigt an "Trinken Sie das Wasser aus dem Glas"
Glas ist leer > Passwort erscheint. Das Passwort ist einfach nur ein Wort das ich anstatt "Glas ist leer" dahin schreibe.

Ich habe zuerst den Wassersensor verbunden, um eine LED anzuschließen die bei einem Zustand leuchtet. Das war, bevor ich mich mit dem Display beschäftigt habe, da ich dieses noch nicht hatte.
Dann habe ich das Display getestet und habe es auch zum Laufen gebracht.

Jetzt möchte ich die beiden verbinden. Vorher war es mir nur wichtig, die Codes für beide einzelnen zu verstehen, damit ich damit umzugehen lerne. Als Anfänger kommt man manchmal nicht sofort auf den Lösungsweg, deswegen wollte ich lieber nachfragen bevor ich etwas zerschieße. Sorry :frowning:

@Wasjetzt:
Ja das Display funktioniert allein für sich und der Sensor auch. Die LED kann wegfallen, die war nur um den Umgang zu lernen.

Und die LED leuchtet sowie du möchtest?

Wenn die LED geht muss eigentlich auch das LCD gehen wenn du an der Stelle zusätzlich (oder statt dessen) was mit lcd.setCursor() und lcd.print() machst.

ich verstehe allerdings nicht, was noch dein Problem ist? du musst doch nur die lcd. print ausgaben in die if Anweisung der LED schreiben und haben fertig

@Serenifly

Nein, die LED leuchtet nicht. Besser gesagt: Ist der Wassersensor ab, leuchtet sie permanent. Sobald ich den Wassersensor auf der Ground-Leiste (auf dem Breadboard) verbinde geht die LED Lampe nicht mehr an. Aber ich habe jetzt versucht den Code anzupassen und die LED abzuklemmen, da diese nicht mehr gebraucht wird.

Es sind lediglich Wassersensor und LCD Display damit verbunden. Folgenden Code habe ich nun eingegeben und es tut sich soweit nichts:

int analogPin = 0; // water sensor connected to the analog port 0
int val = 0; // definition variable val initial value as 0
int data = 0; // definition variable data initial value as 0

#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,20,4);  // set the LCD address to 0x27 for a 16 chars and 2 line display

void setup ()
{
Serial. begin(9600); // set the baud rate as 9600
}
void loop ()
{
val = analogRead (analogPin); // read the simulation value and send to variable val
if(val > 400) {
if ((data) < 200)
     {
     lcd.setCursor(0 ,0);  //der Textbeginn wir hier festgelegt
     lcd.print("Passwort: 012Test210"); //dies ist im Hallo World Beispiel der Text der im LCD dargestellt wird
     }  //diese Klammern musst Du setzen wenn nach der if - Abfrage mehr als eine Anweisung steht
  else //dies wird ausgeführt wenn die obere if-Abfrage nicht zutrifft
    {
     lcd.setCursor(0 ,0);  //der Textbeginn wir hier festgelegt
     lcd.print("Bitte Trinken Sie."); //dies ist im Hallo World Beispiel der Text der im LCD dargestellt wird
     }
}
data = val; // variable val assignment to variable data
Serial.println(data); // serial print variable data
delay (100);
}

Ich habe sicherlich einen Verständnisfehler. Tut mir leid. Wenn es nicht geht, dann werde ich weiter nach Tutorials suchen. Ich dachte nur, ich finde die Lösung noch irgendwie heraus. :frowning:

Hallo!
Versuchs mal damit:

int analogPin = 0; // water sensor connected to the analog port 0
int val = 0; // definition variable val initial value as 0
int data = 0; // definition variable data initial value as 0
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
void setup ()
{ lcd.begin(20,4); 
Serial. begin(9600); // set the baud rate as 9600
}
void loop ()
{
lcd.clear();
val = analogRead (analogPin); // read the simulation value and send to variable val
Serial.println(val); // serial print variable data
if(val > 100) {
     lcd.setCursor(0 ,0);  //der Textbeginn wir hier festgelegt
     lcd.print("Passwort: 012Test210"); //dies ist im Hallo World Beispiel der Text der im LCD dargestellt wird
       //diese Klammern musst Du setzen wenn nach der if - Abfrage mehr als eine Anweisung steht
}
  else //dies wird ausgeführt wenn die obere if-Abfrage nicht zutrifft
  {
    lcd.setCursor(0 ,0);  //der Textbeginn wir hier festgelegt
     lcd.print("Bitte Trinken Sie."); //dies ist im Hallo World Beispiel der Text der im LCD dargestellt wird
}
     
//data = val; // variable val assignment to variable data

delay (100);
}

..hab halt keinen Sensor, mittels Widerstand den A0 "geschalten".
Hoffe, es hilft die weiter.

mfg Martin

Eine andere Sache. Ich würde kein Wasser trinken wo vorher ein solcher Sensor drin war. Man weiß nicht, was da alles in Lösung gegangen ist.

Um das Lebensmittelkompatibel zu machen würd ich einen Kapazitiven Sensor verwenden der außerhalb des Glases den Wasserstand in 1-2 schritten kontrolliert.

Grüße Uwe

Hallo!

Ich habe deinen Code mal ausprobiert und dann kommt folgende Fehlermeldung:

sketch_feb10a:7: error: 'POSITIVE' was not declared in this scope

Und demnach tut sich auch leider nichts. :frowning: Danke für die Hilfe!

uwefed:
Eine andere Sache. Ich würde kein Wasser trinken wo vorher ein solcher Sensor drin war. Man weiß nicht, was da alles in Lösung gegangen ist.

Um das Lebensmittelkompatibel zu machen würd ich einen Kapazitiven Sensor verwenden der außerhalb des Glases den Wasserstand in 1-2 schritten kontrolliert.

Grüße Uwe

Sorry, hatte deinen Post nicht gesehen!

Danke für den Tipp, wir werden es auch nicht trinken für diesen Fall. Es soll vorerst einfach nur funktionieren, damit ich zeigen kann, was ich machen möchte. Sozusagen als Prototyp.