Komplizierter Bauvorschlag mit Sensor 0193-Überwachung, LCD-Bodenfeuchteanzeige und automatischer Bewässerung

Dieser Bauvorschlag enthält ein Schema, wie der Arduino mit dem Bodenfeuchtigkeitssensor 0193, einem LCD mit I2C-Schnittstelle, einer Wasserpumpe und zwei Stromquellen betrieben werden kann. Statt einen Arduino UNO, kann man natürlich auch einen günstigeren und kleineren Nano, Micro oder Mini verwenden.

Das Programm für das LCD ist so geschrieben, dass mit Hilfe der map-Funktion die Bodenfeuchte in % angegeben werden kann. Ist die Pflanzenerde z.B. trocken, so beträgt die Bodenfeuchte 35% und gerade nach dem Giessen 100%.

Die automatische Bewässerung erfolgt durch den Einsatz einer kleinen Wasserpumpe. Diese kann aus einem Wasserbehälter regelmässig Wasser herauspumpen. Leider sind die Betriebsspannungen von den Wasserpumpen meist zwischen 9V und 12V DC, was somit nicht direkt über den Arduino gesteuert werden kann. Entweder verwendet man nun einen Transistor zur Steuerung der Wasserpumpe oder wie wir ein Relais. Das Relais kann problemlos vom Arduino angesteuert werden und könnte auch für andere Schaltungen bis 230V AC verwendet werden.

Wasserpumpen sind nicht immer günstig. Daher lohnt es sich zu suchen. Für unser Projekt wurde die Wasserpumpe XH-D12220 von funduino.de verwendet.

Die Kunststoffschläuche können am einfachsten an den Pumpenanschlüssen befestigt werden, wenn man sie zuvor mit einem Föhn etwas erwärmt.

Als Stromversorgung bietet sich die Stromversorgung über die USB-Buchse oder mit Hilfe eines 9V Netzteils an.

 

///////////////////////////////////*DEFINITIONEN*///////////////////////////////////
  /*Pumpe*/
#define PUMPENPIN 8 //Die Pumpe wird am Pin8 angesteuert
  
  /*LCD*/
#include <Wire.h> //Wire Bibliothek wird eingebunden
#include <LiquidCrystal_I2C.h> //LiquidCrystal_I2C Bibliothek wird eingebunden
LiquidCrystal_I2C lcd(0x38, 16, 2); //Display wird definiert. lcd(HEX-Adresse, Zeichen, Zeilen). (0x3F und 0x27 sind die häufigsten Adressen) 

  /*SENO193*/
const int Luftwert = 580;   //Trage hier deinen Messwert ein, wenn der Sensor frei herumliegt
const int Wasserwert = 290;  //Trage hier deinen Messwert ein, wenn der Sensor ganz in Wasser steht
int Drittel = (Luftwert - Wasserwert)/3;
int Messwert = 0; //Mit dieser Variabel werden die Messwerte gespeichert


///////////////////////////////////*SETUP*///////////////////////////////////
void setup() {
  /*Pumpe*/
  pinMode(PUMPENPIN, OUTPUT); //Definerte den PIN der Pumpe als Ausgang
  
  /*LCD*/
  lcd.init(); //LCD starten
  lcd.backlight(); //Hier wird die Hintergrundbeleuchtung eingeschalten (lcd.noBacklight(); schaltet die Beleuchtung aus)

}

///////////////////////////////////*LOOP*///////////////////////////////////
void loop() {
  Messwert = analogRead(A0);  //Misst die Umgebungsfeuchte beim Sensor 0193

  /*Pumpe*/
  Pumpe(); //Öffnet das Programm, in welchem die Pumpe angesteuert wird

  /*LCD*/
  I2CAnzeige(); //Öffnet das Programm, in welchem die Bodenfeuchte in % am LCD angezeigt wird

}

///////////////////////////////////*WEITERE FUNKTIONEN*///////////////////////////////////
  /*Pumpe*/
void Pumpe(){
  /*In diesem Progamm wird aufgrund der gemessenen Bodenfeuchte die Pumpe aktiviert oder nicht. Jedes Mal, wenn die Pumpe aktiviert wurde (1Sekunde lang), wird noch 10 Sekunden gewartet, damit sich das Wasser im Boden ausbreiten kann*/
  if(Messwert > Wasserwert && Messwert < (Luftwert - Drittel)) {
    digitalWrite(PUMPENPIN, LOW); //Pumpe ruht

  }  
  else if(Messwert < Luftwert && Messwert > (Luftwert - Drittel)){
    digitalWrite(PUMPENPIN, HIGH); //Pumpe pumpt Wasser
    delay(1000);
    digitalWrite(PUMPENPIN,LOW); //Pumpe ruht
    //delay(10000);
    
  }
}

void I2CAnzeige(){
    /*LCD*/
  lcd.setCursor(0, 0); //Position des Cursors wird gesetzt (oben links) 
  lcd.print("Bodenfeuchte:"); //Der Text wird ausgehend von der Cursorposition geschrieben
  lcd.setCursor(0, 1); //Position des Cursors wird gesetzt (unten links)
  int Prozent = map (Messwert, Wasserwert, Luftwert, 100, 0);
  lcd.print(Prozent); //Der Text wird ausgehend von der Cursorposition geschrieben*/
  lcd.print(" %   "); //Der Text wird ausgehend von der Cursorposition geschrieben*/
  
}