Giessautomat für Pflanzen

Arduino Uno

Zugegeben, es gibt sehr viele einfache und gute Methoden, um Pflanzen auch dann mit Wasser zu versorgen, wenn man mal einige Zeit weg ist. Mehr Spaß macht es mir natürlich, etwas Elektronisches zu basteln.

Gestartet bin ich mit einer Anleitung für einen sogenannten Giess-o-mat. Mittels eines fertig gebauten Microcontrollers (Genuino Micro) gestaltet sich der Aufbau dann allerdings auch ohne das Ätzen einer eigenen Leiterplatte sehr einfach.

Ein sehr wichtiges Bauteil für einen Gießautomaten ist ein Sensor zum Messen der Bodenfeuchte. Dafür kommt eine Leiterplatte mit zwei großen Kontaktflächen zum Einsatz, die in den Boden gesteckt wird. Die Kontaktflächen wirken als Kondensator, und die Kapazität des Kondensators ist von der Bodenfeuchte abhängig. Gemessen wird die Kapazität mittels eines Schwingkreises, in welchem der Kondensator eingebaut ist. Ändert sich die Kapazität, also die Bodenfeuchte, so ändert sich auch die Frequenz des Schwingkreises. Ein interessantes Prinzip, dass man auch im Physikunterricht als praktisches Beispiel verwenden kann. Und vor allem mal was anderes als die übliche Leitfähigkeitsmessung.

Die Frequenz des Schwingkreises wird mit dem Genuino gemessen. Dafür kommt nur der Hardware-Zähler (Pin D12 beim Genuino Micro) in Frage, da eine Messung über Interrupts den armen Chip nahezu vollständig auslasten würde.

Um mehr als eine Pflanze zu steuern, muss noch ein Multiplexer her, der verschiedene Sensoren auf den (leider nur einmal vorhandenen) Hardware-Zähler-Eingang legen kann.

Fertig aufgebauter Gießautomat
Fertig aufgebauter Gießautomat mit zwei angeschlossenen Sensoren

Schließlich lassen sich dann bei jeweils vorgegebenen Grenzfrequenzen Relais schalten, die wiederum eine kleine Wasserpumpe für kurze Zeit anschalten. So werden die Pflanzen immer korrekt gewässert und trocknen nie aus. Zumindest solange im Vorratsbehälter für die Wasserpumpen noch Wasser ist…

Hardware

Folgende Komponenten kamen zum Einsatz:

  • drei Sensoren, aufgebaut aus Leiterplatten, die ich über die Bezugsquelle im Link bestellt und die ich mit SMD Bauteilen bestückt habe,
  • ein Genuino Micro,
  • 5V Netzteil mit Micro-USB Anschluss,
  • ein Muliplexer 74HC151 plus Einstecksockel,
  • drei 220V Relais plus Klemmen zum Anschluss der Pumpmotoren (natürlich sind 12V Motoren sicherer, als mit 220V zu arbeiten),
  • drei Leuchtdioden,
  • Vorwiderstände, Transistoren und Dioden aus dem Bastelvorrat,
  • eine Lochrasterleiterplatte,
  • ein Universalgehäuse von Conrad,
  • (optional) eine selbstgebaute 8-stellige 7-Segment-Anzeige mit einem MAX7219-Chip.
Das Innenleben meines Gießautomaten
Das Innenleben meines Gießautomaten

Wer genauere Werte zu den Bauteilen benötigt, kann mir gern Bescheid geben. Speziell bei den Relais scheint es mir, dass die Typbezeichnungen gern mal wechseln. Andererseits ist die Verschaltung so einfach, dass Standard-Bauteile immer ausreichen sollten.

Software

Die Software zur Steuerung stellt keine große Herausforderung dar. Im Prinzip muss nur ein kleiner Regelkreis programmiert werden.

In meinem Aufbau steuere ich den Multiplexer über die Pins 6,7 und 8. Dann sieht mein Programm zur Frequenzmessung von drei Sensoren so aus:

/* 
 * Hardware Counting sketch for Arduino micro
 * 
 * uses pin 12 on 32U4
 */

const int ledPin = 13;
unsigned int freq;

const int selectPin0 = 6;
const int selectPin1 = 7;
const int selectPin2 = 8;

const int maxRead = 25;
int readCount;
int currPort;

void setup() {
  Serial.begin(9600);
  pinMode(ledPin, OUTPUT);
  //hardware counter setup
  TCCR1A = 0; // reset timer/counter control register

  pinMode(selectPin0, OUTPUT);
  pinMode(selectPin1, OUTPUT);
  pinMode(selectPin2, OUTPUT);
  
  readCount = 0;
  currPort = 0;
}

void loop() {
  
  // put your main code here, to run repeatedly:
  freq = 0;
 
  digitalWrite(ledPin, LOW);
  delay(200);
  digitalWrite(ledPin, HIGH);

  // start the counting
  bitSet(TCCR1B, CS12); // Counter clock source is external pin
  bitSet(TCCR1B, CS11); // Clock on rising edge
  delay(40);  // wait 40ms
  // stop the counting
  TCCR1B = 0;
  freq = TCNT1/4; // devide by 4 to get number of oscillations per 10ms
  TCNT1 = 0; // reset the hardware counter
  
  Serial.println(freq);
  
  // Switch the sensor every 25 cycles
  readCount++;
  if(readCount > maxRead) {
    currPort++;
    if(currPort == 3) currPort = 0;
    readCount = 0;
    selectPort(currPort);
  }
}

// select port in multiplexer
// for simple understanding, the binary pattern is directly entered for the selected port
// and not calculated
void selectPort(int port) {
  if (port==0) {
    digitalWrite(selectPin0, LOW);
    digitalWrite(selectPin1, LOW);
    digitalWrite(selectPin2, LOW);
  }
  else if (port == 1) {
    digitalWrite(selectPin0, HIGH);
    digitalWrite(selectPin1, LOW);
    digitalWrite(selectPin2, LOW);
  }
  else if (port == 2) {
    digitalWrite(selectPin0, LOW);
    digitalWrite(selectPin1, HIGH);
    digitalWrite(selectPin2, LOW);
  }
}
Der Rest sollte für den geübten Arduino-Programmierer eine Kleinigkeit sein.
Wer Fragen oder Anregungen hat, ist wie immer gern willkommen.

22 Gedanken zu „Giessautomat für Pflanzen“

    1. Je nachdem, ob man Feuchtigkeit oder Trockenheit misst einfach:
      (maximale Frequenz – minimale Frequenz)/(maximale Frequenz)

      „Leider“ muss man die Sensoren in meinem Fall alle einzeln eichen, d.h. maximale und minimale Frequenz im jeweiligen Erdreich müssen individuell pro Sensor bestimmt werden. Sollte aber kein Problem sein.

  1. Vielen Dank für den Code zum Auswerten der Sensoren. Ich habe bisher die Sensoren, die langsam verrotten und wollte auf kapazitive umsteigen. Als arduino-Anfänger würde ich gerne den Code verstehen. Ich bin etwas aufgeschmissen: wonach such ich denn, wenn ich darüber lesen möchte? Danke!

    1. Hallo Agre,

      An den Sensoren ändert sich die Frequenz des eingebauten Schwingkreises je nach der umgebenden Feuchtigkeit. Entsprechend ist eine erste Anlaufstelle für die Suche die Frequenzmessung mit dem Arduino. Eine schlechte Möglichkeit ist das Ganze per „Interrupt“ zu messen. Damit kann man den Arduino auch sehr schnell überlasten. Es bietet sich daher an, die eingebauten Timer zu verwenden. Ich denke, das wäre ebenfalls ein guter Einstieg.

      Viele Grüße,
      Michael

      1. Vielen Dank für die Hinweise. Habe jetzt etwas zum Counting und Interrupt gelesen und denke, etwas mehr verstanden zu haben.

        Interrupt ist insofern belastend für den Arduino, weil er währenddessen nichts anderes machen kann, richtig?

        Und eine weitere Frage zu dem folgenden Stück Code:
        // start the counting
        bitSet(TCCR1B, CS12); // Counter clock source is external pin
        bitSet(TCCR1B, CS11); // Clock on rising edge

        Ist das nicht die „Clock on falling edge“? Laut Datenblatt müsste für rising edge ja noch CS10 gesetzt werden, oder habe ich das falsch dem Datenblatt entnommen?

        Die letzte Frage: Ist der MUX nur für das „parallele“ Betreiben von mehreren Sensoren notwendig? Wäre dann theoretisch mit einem Sensor eine Interruptmessung möglich?

        Vielen Dank für deine Zeit!

        1. Hallo Agre,

          Der Interrupt ist immer rechenintensiv. Der Mikrocontroller muss sein eigentliches Programm unterbrechen, die Register sicher und nach Abarbeiten der Interrupt-Routine wieder das alte Programm herstellen.

          Mit dem Kommentar hast Du recht. Das müsste ich im Kommentar des Codes oben korrigieren.

          Ja, der Mux ist nur für mehrere Sensoren wichtig. Wenn Du nur einen betreibst, brauchst Du ihn nicht.

          Viele Grüße,
          Michael

  2. Hi Michael,
    Danke für dienen Skatch hier auf der Seite! Ich möchte genau das, noch erweitert mit einem Bluetooth Modul, machen.
    Bezüglich dein Bauteilen hätte ich wirklich gerne noch nähere Informationen bzw einen Schaltplan falls du den bereitstellen würdest?
    Bisher dachte ich, ich verwende 0815 Feuchtigkeitssensoren, wegen der Unbeständigkeit habe ich mich aber nun für die Gissomat Sensoren entschieden. Mit einem Multiplexer habe ich aber bisher noch nicht gearbeitet und wäre daher für jede Hilfestellung dankbar!

    Zusätzlich wollte ich fragen, ob du die bereits beschichteten Platinen gekauft hast oder das selbst gemacht hast? In einem Forum habe ich gelesen, dass das Selbst-Beschichten mit Plastik-70 empfohlen wird.

    Liebe Grüße

    Natalie

    1. Hallo Nathalie,

      Als Schaltplan für den Multiplexer habe ich fast exakt den aus dem obigen Link genommen (https://www.mikrocontroller.net/articles/Datei:Giessomat2.png). Würde Dir das reichen? Das Prinzip ist wirklich ganz einfach – da kannst Du eigentlich nichts falsch machen. Falls Du doch noch etwas brauchst, sag kurz Bescheid. Dann versuche ich noch ein bisschen mehr zusammenzustellen.

      Für die Sensoren habe ich an fred_ram geschrieben (https://www.mikrocontroller.net/topic/335407?goto=new#new). Er verkauft nur noch die unbestückten Leiterplatten. Ich habe den Rest einfach bei Reichelt bestellt, selbst zusammengelötet und dann mit Plastik-70 besprüht. Ging alles ohne Probleme.

      Wenn es Dir zu schwierig ist, schicke mir einfach kurz eine Nachricht an meine E-Mail-Adresse. Ich habe noch 3 Sensoren übrig und könnte sie Dir überlassen.

      Liebe Grüße,
      Michael

  3. Hallo Michael!
    vielen Dank schon einmal für deine hilfreiche Antwort! ich werde mich innerhalb der nächsten Wochen noch sehr intensiv mit all dem auseinandersetzten und falls es Fragen gibt mich melden! Auf die Sensoren komme ich wahrschl nicht zurück, da ich insgesamt mehr als 3 brauche und diese auch sicher selber herstellen können muss damit es unter denen keine Unterschiede gibt. Aber vielen Dank für das Angebot!

    Liebe Grüße,
    Natalie

  4. Hi, welche werte erhälst du bei dem Sensor wenn dieser Nass bzw. Trocken ist?
    Ist ein Multiplexer zwingend notwendig, auch bei einzelnen betrieb?
    Irgendwie stehe ich auf dem Schlauch herauszufinden wann Trocken und wann Nass angezeigt wird…

    1. Die Werte hängen bei mir recht stark vom Sensor und der Umgebung ab. Am besten einmal einen Testlauf in der Erde machen und die Werte notieren, so ist man wirklich sicher.

      Der Multiplexer ist nur notwendig, wenn man mehr als einen Sensor abfragen möchte.

  5. Hallo Michael,

    hast du vielleicht auch Erfahrung mit dem Arduino MKR Wifi 1010? Ich möchte die gleichen Sensoren verwenden. Nur leider komme ich mit diese Timerfunktion nicht wirklich weiter.
    Wäre schön wenn du mir helfen könntest.
    Besten Dank!
    Andy

    1. Hallo Andreas,

      Leider kenne ich mich dem Arduino nicht aus. Die Timer-Programmierung hat mich zu Beginn auch etwas Zeit gekostet. Vielleicht findet sich jemand hier, der Dir weiterhelfen kann.

      Viele Grüße,
      Michael

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert