Bodenfeuchtigkeit und Temperatur Messen

Sehr geehrte Arduino Programmierer,

ich wende mich mit einer großen Bitte an das Forum. Ich versuche seit längerer Zeit ein lauffähiges Programm zur
Steuerung meines Arduino-Uno auf die Beine zu stellen. Leider bisher ohne Erfolg. Die Sachen die ich
"programmiert" habe waren zu 95% Schrott. Den größten Teil hab ich vor Wut gelöscht :~
Mein Vorhaben ist eigentlich nichts besonderes und gibt es auch in einigen abgewandelten Sketchen die aber nicht zu meiner Idee passen.
Meine Idee ist, dass ein Hauptprogramm von 19.00 Uhr bis 22.30 Uhr läuft und in dieser Zeit 4 Unterfunktionen
aufruft:

-1. die Bodenfeuchtigkeit über 2 Edelstahlkontakte messen und diese zwischenspeichern
-2. das gleiche soll auch beim Messen der Bodentemperatur geschehen
-3. die beiden gemessenen Werte sollen bei "unter" bzw. "Überschreiten" einen Digital-Pin auf dem Arduino
ansteuern, der als Zustand "Led-Rot" = zu warm+trocken und "Led- Grün" für alles Ok darstellt
-4. die gemessenen Werte und Zustände sollen auf einem 16*2 Display mittels Abfrage über einen Taster dargestellt werden

Als Arbeitsmaterial habe ich besorgt:

  • 1x Arduino-Uno
  • 1x DS 1307 RTC
  • 1x LCD Display 16*2
  • 1x Temperatursensor DS18B20

Im Vorraus schon mal vielen Dank!

Calisto

klingt machbar.

Mit Ausnahme des "Bodenfeuchtigkeit über 2 Edelstahlkontakte messen", da ist sicherlich einiges an Know-How dahinter.

Am besten du postest mal ein Stück deines Codes und schreibst was genau nicht funktioniert, dann wirst du hier jede Menge Hilfe bekommen!

Was hast du denn schon am laufen?
Läuft das Display?
Kannst du den DS18B20 einlesen?
kriegst du die Zeit vom DS1307?* (gleich eine Anmerkung: wenn dein Projekt soweit läuft, ersetze den durch einen DS3231, der ist wesentlich genauer!)*
Hast du schon eine Idee, wie dein "Feuchtesensor" auszuwerten ist?

Ich denke, der größte Fehler, den du gemacht hast, ist das du alles auf einmal programmieren wolltest.

  1. Ob das wirklich so gut klappt mit den 2 Edelstahlkontakten wage ich zu bezweifeln. Wäre es nicht erstmal von Vorteil, mit einem Hygrometer (http://www.ebay.de/itm/Hygrometer-Sensor-Modul-Feuchtesensor-Bodensensensor-Arduino-Bascom-uvm-/111173425896?pt=Wissenschaftliche_Geräte&hash=item19e273dae8) zu arbeiten und schauen, wie dieser sich auf Dauer macht?

  2. Das kannst du mit dem DS18B20 erledigen. Handelt es sich hier um die wasserdichte Version oder nur um den Baustein?

  3. Sollte das einfachste sein. Wenn Wert Temp und Wert Feuchte innerhalb der Toleranz liegen -> LED GRÜN. Alles andere wäre dann rot.

  4. Sollen die Werte dauerhaft, oder nur während du den Taster drückst angezeigt werden? Daran denken, dass du den Taster entprellst. Entweder über Software Debounce oder Hardware Debounce.

Hardware Debounce

Fange wie folgt an:

  1. Arduino Uno mit RTC und Ausgabe der Zeit auf den Seriellen Monitor der Arduino IDE
  2. LC Display einbinden, Uhrzeit darauf ausgeben
  3. Wenn MinutenGesamt > 1140 und MinutenGesamt < 1350 sind, LED 13 einschalten, ansonsten ausschalten (LED 13 ist auf dem Board)
  4. ....

Hallo vielen Dank für eure Tipps,
das mit den Edelstahlkontakten scheint ja wirklich ein Problem zu werden. Das lass ich dann mal :wink: Das Sensor-Modul habe ich bereits, konnte es aber nicht einbinden. An Code kann ich wie geschildert nichts liefern. Die meisten Codes die ich ausprobiert habe sind die der Hersteller oder die Standart-Bibliotheken der Arduino-SW. Der Tempsensor ist eine Wasserdichte Version. Der Taster ist mir eigentlich nicht so wichtig, Hauptsache ich kann sehen wie hoch die Bodenfeuchtigkeit und Temperatur ist. Das Display läuft allerdings sind die Messwerte nicht zu gebrauchen. Es fehlt zusätzlich die Prozentanzeige und Celsius.
Die Zeit vom RTC erhalte ich. Ich hab hier im Forum eine tolle Anleitung zu Thema gefunden, dabei ging es um eine Poolsteuerung.

Mit besten Grüßen!

Hallo,
ich messe die "Bodenfeuchte" mit diesen Sensoren:
![](http://i.ebayimg.com/t/Soil-Moisture-Sensor-Hygrometer-Detection-Module-for-Arduino-UNO-Mega2560-/00/s/NTEwWDUxMA==/z/TRIAAOxy-sRSX6Gw/$(KGrHqFHJEgFJ,MRDfgQBS(6GvlWb!~~60_12.JPG)

Bei guter Durchfeuchtung kommen Werte um die 300-350 heraus, bei Trockenheit so um die 1020.

Damit lassen sich leicht eigene Bereiche definieren für Warnhinweise usw.

Ich lese diese Daten aus (speichere sie auch auf SS) und schicke sie über USB an einen Server mit eigener Software, der sie auch einer eigenen App zur Verfügung stellt.
Daneben noch allerlei Vitaldaten wie Temps, rLf's, Methan usw.

Läuft prima auf einem MEGA XD

Sieht dem aus meinen Link ähnlich. Ich denke, er möchte soweit in die Materie noch nicht mit dem Projekt hinein. Aber hört sich alles gut an. Gibt es bei dem Sensor schon irgendwelche Korrosionen o.ä.?

Bin mit dem Projekt, eine Karnivoren-Sumpflandschaft im Zimmer zu realisieren, noch nicht weiter. War damals der Hauptgrund, wieso ich auf den Arduino gekommen bin.

Habe das erst einmal nur als Prototyp aufgebaut mit den Schwimmschalter und einen TempSensor. Die Sache mit dem Schwimmschalter sowie einen Poti gefällt mir aber noch nicht sonderlich. Hast du schon mal getestet, wie sich der Sensor im destilierten Wasser verhält? Denn die Erde sowie Tonkugeln im Boden sind sehr Salz/Mineralarm.

Calisto, dass dein Projekt nicht läuft, liegt nicht am Uno. Nicht dass du jetzt denkst, es geht nur mit dem Mega :wink:

Wenn die original Verzinnung (dünne Leiterbahn) lange direkt im Wasser ist, korridiert sie (Grünspan) schon nach 3 Tagen.
Die jetzigen habe ich einfach mit einer dicken Schicht Lötzinn beidseitig nachträglich dick verzinnt 8)

Bisher (nach knapp 16 Tagen) keine Korrsosion :smiley:

P.S.: sehe gerade erst, dass diese Kontakt vergoldet sind ?
Hatte nur ein Beispielfoto auf die Schnelle gesucht, meine sind in der Mitte der breiten Flächen ca. 2 mm breit auf der vollen Länge dünn verzinnt)

P.P.S.:

Vergoldet bei diesen Preisen? Denke es wird eine etwas schlechtere Legierung sein. Kann mich aber irren.

Diese Sache mit dem Grünspan war meine Befürchtung. Hoffe aber, dass es in meinem Erdreich (sehr mineralarm) + dest. Wasser nicht zu diesem Ereigniss kommt. Jedoch weiß ich nicht, ob die Leitfähigkeit für den Sensor ausreicht.

Vergoldet bei diesen Preisen?

Nu ja, das ist schon die teuerste Variante - normalerweise kosten die beim Asiaten so um die 2,50 EUR :wink:

Jedoch weiß ich nicht, ob die Leitfähigkeit für den Sensor ausreicht.

Einfach mal probieren - mit normalem Wasser ist die Empfindlichkeit auf jeden Fall extrem hoch: nur ein Teil eines nassen Fingers auf den Kontakt und schon ändert sich der Wert

guntherb:
klingt machbar.

Mit Ausnahme des "Bodenfeuchtigkeit über 2 Edelstahlkontakte messen", da ist sicherlich einiges an Know-How dahinter.

Am besten du postest mal ein Stück deines Codes und schreibst was genau nicht funktioniert, dann wirst du hier jede Menge Hilfe bekommen!

Was hast du denn schon am laufen?
Läuft das Display?
Kannst du den DS18B20 einlesen?
kriegst du die Zeit vom DS1307?* (gleich eine Anmerkung: wenn dein Projekt soweit läuft, ersetze den durch einen DS3231, der ist wesentlich genauer!)*
Hast du schon eine Idee, wie dein "Feuchtesensor" auszuwerten ist?

Hallo Calisto,

möchtest du nicht auf alle Fragen von Gunther Antworten?
Die OT Diskussionen bringen dich nicht bei deinen Problemen weiter.

Erstelle mal einen Sketch mit Display und DS18B20.
Wenn dann was nicht geht, Sketch posten und nachfragen.

Fertigen Code wirds hier wohl nicht geben...

Hallo zusammen,

vielen Dank für eure Ideen und Vorschläge. Da ich noch sehr unerfahren im Schreiben von Programmen bin werde ich trotzdem aus den mir zur verfügung stehenden Unterlagen versuchen ein Sketch zu schreiben und euch vorstellen. Was mir weiterhin fehlt ist so etwas wie ein Grundgerüst auf dem ich aufbauen kann sprich die Idee ist ja, das ein Hauptprogramm um 19.00 Uhr angeht und dann die Unterfunktionen Bodentemperatur, Bodenfeuchtigkeit aufruft und auf LCD und LED darstellt und sich um 22.30Uhr wieder verabschiedet.
-Nur welcher Teil ist hier das Hauptprogramm? Die RTC1307?
-Wie ruft das Hauptprogramm die Unterfunktionen überhaupt auf?
-Welche Befehle sind hier notwendig?

Mit besten Grüßen!! Calisto

Das Hauptprogramm ist immer loop().

Das kannst du garnicht ändern.

Und der Code könnte in etwa so aussehen:
(in Pseudocode)

loop(){
if (Uhrzeit > 19:00 und Uhrzeit < 22:30){
feuchte lesen;
Temperatur lesen;
Werte an LCD senden
}
}

Schau dir doch mal das mitgelieferte Beispiel "BlinkWithoutDelay" an. Für den Anfang.

Fertiger Code ist kein Problem, aber ich denke Du willst ja auch erstmal was lernen dabei 8)
Diese Sensoren auf jeden Fall an die Analogeingänge (bei mir A11 - A15 auf'm MEGA) und, wie guntherb schon schrieb, in der Loop abarbeiten:

    // ################################
    Serial.print("eC-Sensor #1    : ");
    Serial.println(analogRead(11));  
    delay(1750);
    Serial.print("eC-Sensor #2    : ");
    Serial.println(analogRead(12));  
    delay(1750);
    Serial.print("eC-Sensor #3    : ");
    Serial.println(analogRead(13));  
    delay(1750);
    Serial.print("eC-Sensor #4    : ");
    Serial.println(analogRead(14));  
    delay(1750);
    Serial.print("eC-Sensor #5    : ");
    Serial.println(analogRead(15));  
    delay(1750);
    lcd.home();
    lcd.clear();
    lcd.print("------ec-Werte------");
    lcd.setCursor(4,1);
    lcd.print(analogRead(11));
    lcd.setCursor(12,1);
    lcd.print(analogRead(12));
    lcd.setCursor(8,2);
    lcd.print(analogRead(13));
    lcd.setCursor(4,3);
    lcd.print(analogRead(14));
    lcd.setCursor(12,3);
    lcd.print(analogRead(15));

Habe auch 2 DHT11 (Temp & rLf), die werden so ausgelesen:

    // HUMs
    // 1. DHT11
    Serial.print("Humidity-1 (%)  : ");
    Serial.println((float)DHT11.humidity + 10, 2);
    delay(2250);
    // 2. DHT11  
    Serial.print("Humidity-2 (%)  : ");
    Serial.println(((float)DHT11B.humidity + 10)-5, 2); // eigene Kalibrierung -5% wegen Abweichung der Beiden
    delay(2250);
    // TEMPs
    // 1. DHT11
    Serial.print("Temperature1(oC): ");
    Serial.println((float)DHT11.temperature + 1, 2);
    delay(1750);
    // 2. DHT11
    Serial.print("Temperature2(oC): ");
    Serial.println(((float)DHT11B.temperature + 1) +1, 2); // auch hier +1 Grad wegen Abweichung
    delay(1750);