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.

4 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.

Schreibe einen Kommentar

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