Bewässerung 9 – Der finale Sensor

Nachdem der Prototyp funktioniert hat, habe ich noch etwas an der Software geschraubt.

Nachdem der Prototyp funktioniert hat, habe ich noch etwas an der Software geschraubt. Diese unterstützt jetzt den Betrieb mehrerer Sensoren an einem Server. Des weiteren habe ich die Hardware etwas ansehnlicher gestaltet damit meine Frau nicht denkt unsere Tomaten wären von den Borg assimiliert worden. Den Code für den Sensor findet ihr wie immer auf Github

Bewässerung 8 – Solarbetriebener Bewässerungssensor

Solarbetriebene Sensoreinheit für ein automatisches Bewässerungssystem auf Basis ESP8266

Nachdem nun endlich alle Teile angekommen sind, konnte ich endlich meinen Bewässerungssensor fertigstellen. Als Basis dafür dient mein ESP8266 Breakout Board. Beim Löten sind mir einige Details aufgefallen (hauptsächlich fehlende Beschriftungen). Deshalb habe ich mein Design nochmal etwas umgebaut (siehe Github). Mit dem XCSOURCE FT232RL 3.3V 5.5V FTDI USB zu TTL Serielles Adaptermodul Arduino Mini Anschluss TE203 als Konverter entfällt übrigens das lästige Drücken des “PROG” Tasters sofern man den Lötjumper gesetzt hat. Für die Sensorik verwende ich dasselbe Kit das ich auch beim Prototypen verwendet habe: MTS1EU Greenhouse Sensor Kit Soil Hygrometer Module and DHT11 Temperature/Humidity Module for Arduino. Gewächshaus Pflazen .

Circuit Diagram
Circuit Diagram
PCB Sensor
PCB

Also Solarpanel setze ich ein kleine 5V/81mA Panel von Conrad ein. Durch den geringen Strom den das Panel liefert muß ich mir keine Gedanken wegen einer Überladung machen und komme mit einer einfachen Zener Diode (BZX85C3V9) als Überladungsschutz aus. Außerdem habe ich auf anraten auf einen PNP Transistor umgewechselt. Aus Layout Gründen haben sich ein paar Details an den Verwendeten GPIOs ergeben, die letztgültige Version vom Fritzing und vom Code findet ihr auf meiner Github Seite.

Das Endergebnis sieht dann so aus.

sensor5 sensor4 sensor3 sensor2 Sensor1

 

Bewässerung Teil 7 – ESP8266 Breakout Board

Beim Layouten meiner Leiterplatte für die Sensoreinheit wurde mir bewusst welchen Vorteil Aufsteckplatinen, so genannte “Breakout Boards”, haben. Sie sind nicht nur praktisch zum Entwickeln, sie haben auch den Vorteil das man sich über wiederkehrende Elemente (z.B. Pull-Up Widerstände) nicht den Kopf zerbrechen muss. Darüber hinaus machen sie das Layouten einfacher da sie praktisch zwei zusätzliche Lagen darstellen. Damit ist die Platine am Ende nicht nur schlanker sondern hat auch eine kleinere Grundfläche.

Beim Layouten meiner Leiterplatte für die Sensoreinheit wurde mir bewusst welchen Vorteil Aufsteckplatinen, so genannte “Breakout Boards”, haben. Sie sind nicht nur praktisch zum Entwickeln, sie haben auch den Vorteil das man sich über wiederkehrende Elemente (z.B. Pull-Up Widerstände) nicht den Kopf zerbrechen muss. Darüber hinaus machen sie das Layouten einfacher da sie praktisch zwei zusätzliche Lagen darstellen. Damit ist die Platine am Ende nicht nur schlanker, sondern hat auch eine kleinere Grundfläche.

Eine wichtige Anforderung beim Design war die Größe. Die Größe ist nicht nur ihrer selbst wegen ein Thema, sie bestimmt auch den Preis für das Fertigen des Breakout Boards. Neben den Pull-Up Widerständen für CH_PD, GPIO_0, GPIO_2 und RESET sowie den obligatorischen Tastern zu GND an RESET und GPIO_0 (PROG) habe ich auch eine Steckleiste zum Aufstecken für meinen XCSOURCE FT232RL USB<->TTL eingeplant. Die Spannungsversorgung über den USB zu TTL Konverter kann über einen Jumper optional aktiviert oder deaktiviert werden. Außerdem habe ich Lötjumper für die Verbindung von CTS->REST und DTR->GPIO_0 eingeplant. Ich habe das zwar noch nicht versucht aber bei einigen erübrigt sich dadurch das manuelle Betätigen der Taster da der FTDI232 über die Pins den ESP in den Programmiermodus versetzt. Zu guter letzt habe ich auch einen Lötjumper für die Verbindung GPIO_16 zu RESET geplant sowie einen Kondensator zur Spannungsstabilisierung. Andere Boards wie das Huzzah verwenden hier einen Spannungswandler aber ich habe mit dem Elko gute Erfahrungen gemacht.

Meine Follower auf Twitter wissen dass ich mehrere Anläufe benötigt habe (besonderen Dank hier nochmal an @ccxx72, @i_grr, @bdcatalin und @tzapulica für die Hilfe) und dass  Fritzing mich einiges an Nerven gekostet hat aber das Resultat könnt ihr auf meiner Github Seite downloaden: https://github.com/Stromspielplatz/misc/tree/master/ESP8266%20ESP-12%20Breakout

ESP8266-ESP12 Breakout Board Circuit Diagram
ESP8266-ESP12 Breakout Board Circuit Diagram
ESP8266-ESP12 Breakout Board PCB
ESP8266-ESP12 Breakout Board PCB

Bewässerung – Teil 6: Fuzzy Regelung

Der einfachste Weg für die Steuerung der Bewässerung wäre sicher die Bodenfeuchtigkeit als Schwellwert zu verwenden und damit die Wasserzufuhr zu starten. Ich denke aber nicht dass das ein guter Ansatz ist da die Bodenfeuchtigkeitsmessung wohl eher ein Anhaltspunkt als ein wirklicher Messwert ist. Außerdem möchte ich sowieso einen Regler implementieren um eine einigermassen konstante Wasserzufuhr zu erreichen. Der meist-eingesetzte Regler und damit auch der bekannteste ist wohl der PI-Regler. Dieser hat für hier aber den Nachteil dass er nur eine Eingangsgröße zu einer Ausgangsgröße verarbeiten kann. Natürlich könnte man jetzt mit ein paar Tricks (Störgrößenaufschaltung oder Kaskadierung) weitere Messgrößen in den Regler bekommen aber das werde ich hier nicht machen. Ich werde statt dessen einen Fuzzy Regler verwenden.

Der Fuzzy Regler ist ein Multi-Input-Multi-Output (MIMO) Regler, der mit unscharfen Größen arbeitet. Das klingt sehr innovativ, tatsächlich ist die Geschichte der Fuzzy Regelung aber schon eine ziemlich alte und begann 1965. In der 1990ern erfuhr sie einen richtigen Hype und verschwand dann ein bißchen in der Versenkung. Meiner Meinung nach findet sie viel zu wenig Beachtung da man mit ihr der Problematik der meisten Regelkreise (kein exaktes Modell, empirisches Wissen über den Algorithmus) am besten begegnen kann.

Da wir unseren Webserver schon im Einsatz haben werde ich den Fuzzy Regler in PHP implementieren und verwende dazu eine Klasse von Wojtek Jarzecki. In weiterer Folge wird später der uC für die Ansteuerung der Pumpen das PHP Script aufrufen und bekommt einen Änderungsanforderung(-10% … +10%) für die Sollwerte der Wasserpumpen  (0-100%) zurück. Der uC wird damit jeweils den aktuellen Sollwert für jede Pumpe anpassen und diesen in ein PWM Signal übersetzen.

Für die Parametrierung der Regelung ermittle ich erstmal den Wert für nasse Erde (bei mir ca. 400) und trockene Erde (bei mir ca. 800). Durch googlen finde ich heraus dass die Luftfeuchte bei uns in der Steiermark etwa zwischen 50% und 90%  und die durchschnittliche Temperatur in den Sommermonaten zwischen 8°C und 36°C liegt. Mit diesen Werten definiere ich meine Input Membership Funtions wie folgt:

Fuzzy Parameter

Der Code für mein Script sieht so aus:

 

 

Bewässerung – Teil 5: Kleines Software Refactoring

Nach den ersten Erkenntnissen meiner kleinen Versuchsreihe habe ich nun die Software etwas umgebaut. Nachdem der DHT11 selten aber doch immer wieder mal unplausible Werte liefert werde ich an der Logik ein bißchen schrauben. Ich werde mir drei Werte einlesen und jeweils für Temperatur und Luftfeuchtigkeit den mittleren nehmen. Für die Bodenfeuchtigkeit werde ich einen Mittelwert aus drei Messungen bilden.

Außerdem habe ich etwas am Ablauf gefeilt und den Code etwas besser strukturiert.

Tricky waren dabei vor allem 2 Sachen:

  • Ich erstelle mit für meine Werte ein Array of Struct. Die typedef für den Struct Typen muss in einer Header Datei erfolgen.
  • Der ESP8266 untersützt die std nicht von Haus aus. Deshalb verwende ich für die Funktion min ein Makro.

Das Ergebnis sieht so aus.

 

Bewässerung – Teil 4: Automatisches Backup der Datenbank

Gerade habe ich mal wieder die typische Wechseldusche erlebt die “IT Menschen” nur all zu gut kennen. Eigentlich wollte ich “nur mal schnell” die eth0 Schnittstelle an meinem Raspberry aktivieren um ihn vom WLAN zu bekommen. Leider stellte sich heraus, dass das ziemlich fuchsen kann. Während der Arbeit wurde mir kurz mal heiß als ich dachte ich müsse den Raspi den Strom kappen. Aus eigener leidvoller Erfahrung weiß ich dass er das nicht unbedingt schätzt und seinen Unmut darüber schon mal damit zum Ausdruck bringt dass man ihn neu aufsetzen muß. Naja, zum Glück blieb mir das Experiment erspart aber mir wurde bewusst dass mein RPI zwar brav Daten aufzeichnet, ich diese aber nirgendwo gesichert habe.

Da ich nicht einen weiteren Server 24h am Tage laufen haben will werde ich mein Backup einfach in meine Dropbox laden. Dazu erstelle ich erstmal einen Ordner namens rpi2backup meiner Dropbox, sowie einen Ordner namens /tmp/dbbackup/ auf dem Raspi. Für den Upload verwende ich den Uploader von Andrea Faprizi.

Nachdem ich den Uploader installiert und den Anweisungen nach der APP Rechte zu meinem Dropbox Account gegeben habe mache ich mich an das Backup der MariaDB. Ich werde dafür das Rad nicht neu erfinden, sondern halte mich einfach an das Tutorial hier.

Ich passe lediglich mein Backup Script so an dass mein Backup nach dem Erstellen in meine Dropbox geladen wird.

 

Bewässerung – Teil 3: Datenvisualisierung

Mich interessieren natürlich die Messwerte meiner Bewässerungsanlage. Aber es ist etwas umständlich dafür jedesmal in die Datenbank zu sehen. Deshalb werde ich eine kleine Visualisierung für meine Messdaten machen.In dieser möchte ich  jeweils die letzten gemessenen Daten als Text sowie zwei Trend-Grafiken, einmal mit den Daten der letzten 24h und einmal die Daten der letzten Woche anzeigen.

Das Mittel der Wahl für mich, nachdem ich sowieso schon einen Webserver konfiguriert habe, ist natürlich die Visualisierung mittels einer kleinen Website. Aber das ist nicht der einzige Grund, es ist ein genereller Trend Front-Ends in Webtechnologien umzusetzen denn die Vorteile liegen auf der Hand: einfaches Deployment und weite Unabhängigkeit der Clientplattform (speziell auch im mobilen Bereich). Darüber hinaus haben sich in den letzten Jahren die Möglichkeiten dieser Technologie rapide gesteigert (Websockets, HTML5+SVG) und auch die Performance der Engines reicht mittlerweile aus um Trends und Grafiken flüssig zu rendern.

Die Querys die ich für die Abfrage der Daten verwende, habe ich vorher in der Workbench ausprobiert und zur besseren Lesbarkeit unten separat eingefügt. Damit die Daten gut interpretierbar sind, werden die Daten für die 24h auf Stunden, die Daten für die Wochenanzeige auf Vierteltage gemittelt. Den Wert für die Bodenfeuchtigkeit rechne ich zur besseren Darstellung auf einen Prozentwert (100%=1024) um.

Normalerweise würde ich die Querys in Stored Procedures kapseln aber leider mag die mysqli Extension Stored Procedure mit mehreren Rowsets nicht besonders, deshalb findet ihr die Querys hartkodiert im Code.

Für die Anzeige der Trenddaten greife ich auf eine fertige Charting Libary zurück. In dem Fall verwende ich Chart.js. Es ist sicher nicht die umfangreichste Libary, aber sie ist einfach, schnell und vor allem Open Source und gratis (MIT License).

Der Code für meine Webseite sieht wie folgt aus.

Das Ergebnis ist eine, wie ich meine, recht ansehnliche Website die auch auf Mobilgeräte einen guten Eindruck hinterlässt.

Datenanzeige

Bewässerung – Teil 2: Datenaufzeichnung

Die “Kommandozentrale” bildet ein Raspberry PI 2.  Ihr braucht dazu noch eine Speicherkarte, eine Stromversorgung (ich versorge den PI mittels USB von meinem Access Point) und eventuell einen WLAN Stick. Auf alle Fälle empfehle ich euch ein einfaches Gehäuse wie z.B. das hier.

Zuerst muß für den Raspberry ein Betriebssystem (Raspbian) installiert werden. Images und Anleitungen findet ihr hier. Wie man im Arduino Projekt schon sehen kann, sende ich meine Daten an einen Webserver. Einen einfachen Socket-Server zu schreiben wäre zwar eine leichtgewichtigere Lösung aber man stellt es sich viel einfacher vor einen Dienst zu machen der wirklich 24/7 stabil, robust und zuverlässlich läuft. Deshalb setze ich gerne auch vernünftige Middleware auf. Für Datenaufzeichnung ist die Kombination aus Apache Webserver, PHP und MySQL (LAMP) ideal. Für die Installation gibt es massenweise Tutorials, ich habe dieses hier verwendet. Anstatt des “echten” MySQL verwende ich allerdings den OpenSource Nachfolger MariaDB. Dazu verwendet ihr einfach statt

apt-get install apache2 apache2-utils php5 libapache2-mod-php5 php5-mysql mysql-server mysql-client phpmyadmin -y

diesen Befehl

apt-get install apache2 apache2-utils php5 libapache2-mod-php5 php5-mysql mariadb-server mysql-client phpmyadmin -y

Da MariaDB umfassend zu MySQL kompatibel ist, können alle weiteren Tools die bei MySQL funktionieren auch bei MariaDB verwendet werden.

Für das weitere Arbeiten installiere ich noch einen Samba Server, eine Anleitung gibt’s hier. Da ich mit Windows auf meinem Entwicklungsrechner arbeite kann ich so einfach das wwwroot meines RasPIs als Netzlaufwerk einrichten und kann darin entwickeln, ohne den mühsamen Umweg über FTP. Für die Entwicklung in MariaDB könnt ihr entweder das installierte phpmyadmin verwenden oder ihr installiere auf eurem Entwicklungsrechner die MySQL Workbench. Diese bringt zwar eine Warnmeldung wenn man sich zu einem MariaDB Server verbindet, funktioniert aber tadellos. Welche Variante ihr verwendet ist geschmackssache, ich selber bevorzuge lieber die Workbench Variante da ich es gewohnt bin mit einer DB Entwicklungsumgebung zu arbeiten und mir das phpmyadmin deshalb etwas ungewohnt daherkommt.

Wenn ihr den Raspberry aufgesetzt habt und eure Entwicklungstools beisammen habt könnt ihr in der Datenbank eine Datenbank erzeugen. Ich nenne meine Datenbank einfach “templogg”

Und dann erzeugen wir noch eine Tabelle namens “tbllogging”

Diese hat eine Spalte namens “dt” vom Typ datetime und ist mein Primärschlüssel.  Meine weiteren Spalten heißen “temp”, “humidity” und “soil”, vom Datentyp double. Diese werden meine Meßwerte aufnehmen.

Wie man in meinem Arduino Code sehen kann benötige ich zum Eintragen der Werte noch ein PHP Script namens “newrecord.php”, das ich der Einfachheit halber direkt ins wwwroot lege.

Damit das Script läuft muss auf dem Arduino in der php.ini die Extension für mysql Zugrif aktiviert sein.

Wie zuvor erwähnt, ist die mysqli-Erweiterung nicht standardmäßig aktiviert, daher muss die php_mysqli.dll-DLL in der php.ini aktiviert werden. Um dies zu tun, müssen Sie die php.ini-Datei finden (typischerweise liegt diese unter c:\php) und überprüfen, dass das Kommentarzeichen (ein Semikolon) vom Anfang der Zeile extension=php_mysqli.dll in der Sektion [PHP_MYSQLI] entfernt wurde.- http://php.net/manual/de/mysqli.installation.php

So, wenn das geschafft ist teste ich ob da Script funktioniert und rufe dazu die URL in einem beliebigen Browser mit Testparameter auf um Daten einzutragen.

http://raspberryip/newrecord.php?temp=33.00&humidity=44.00&soil=55.00

Danach könnt ihr prüfen ob die Daten richtig eingetragen wurden.

Nachdem es bei mir funktioniert hat lösche ich die Daten danach aus der Datenbank

Jetzt starte ich meinen Arduino und überprüfe ob auch diese seine Daten richtig einträgt und nachdem auch das funktioniert darf er erstmal ein paar Tage die Daten einer Zimmerpflanze aufzeichnen um zu sehen ob alles gut funktioniert.

Prototype in Aktion

Und damit es nicht langweilig wird werde ich in der Zwischenzeit eine Webseite machen um mir die Aufgezeichneten Daten anzeigen zu lassen ohne jedes Mal auf die Datenbank zu gehen

Bewässerung – Teil 1: Ein Prototyp

Als ersten Schritt werde ich einen Prototypen bauen. Normalerweise baut man einen Prototyp ja auf einem Steckbrett . Ich möchte den Prototypen aber ein paar Wochen ausprobieren damit ich sehe wie viel Energie er braucht und wie sich die Messungen verhalten. Deswegen mache ich meinen Prototypen auf einer Lochraster Platine. Außerdem werde ich auf meinem Arduino eine Datenaufzeichnung in einer Datenbank einrichten und eine kleine Webvisualisierung dazu erstellen.

Meine Einkaufsliste dazu:

Zusätzlich noch:

  • eine Lochraster Platine
  • 3 Stk. 10k Widerstände (oder höherohmig, es müssen nur drei gleiche sein)
  • 1 Stk Elektrolytkondesator (> 500 uF)
  • 1 Stk. Transistor (z.B. BC547C)
  • 1 Stk 3,3K Widerstand
  • eine Steckerleiste (2 pins)
  • einen Jumper
  • und einen Lötkolben.

Ich weiß, über Lötkolben wird viel fachgesimpelt aber mir persönlich reicht eine 22€ Lötstation. Außerdem ist dabei eine recht gute Entlötpumpe dabei und so ein Gerät empfehle ich auch dringend jedem Anfänger. Überschüssiges Geld ist am besten in vernünftigem Lötzinn angelegt. Für die Stromversorgung verwende ich eine USB Powerbank die ich als Werbegeschenk erhalten habe.  Man bekommt die zur Zeit eh überall geschenkt, ansonsten erhält man sie auch für unter 10 € im Netz (z.B. hier).

Ich vermeide bei Prototypen stets die Bauteile direkt einzulöten. Deswegen verwende ich gerne Steckerleisten. Diese haben zwar den Nachteil dass man etwas vorsichtig mit dem Aufbau umgehen muß aber dafür kann ich einfach Bauteile für Versuche einfach raus nehmen ohne gleich zum Lötkolben greifen zu müssen.

Das der ESP8266 nur 3,3V verträgt verwende ich den USB zu TTL Konverter auch gleich als Spannungswandler. Dazu muß nur der Jumper auf dem Board auf 3,3 V gesteckt werden. Zum Energiesparen werde ich den ESP in den Deep-Sleep-Modus versetzen. Damit die beiden Sensoren derweilen keinen Strom verbrauchen schalte ich sie über einen Ausgang und einen Transistor weg. Der ESP benötigt bei Verbindungsaufbau zum WLAN relativ viel Strom, deshalb muß parallel zur Versorgung ein Elektrolytkondensator geschaltet werden. Es ist keine Raketenwissenschaft diesen auszulegen, er sollte irgendwas zwischen 400uF und 2200uF bei 6-10V haben. Für das Programmieren muß der CH_PD Pin auf GND gezogen werden. Manche empfehlen dafür einen Taster, ich bevorzuge eine kleine Steckerleiste und einen Jumper.

In der ESP8266 Dokumentation ist beschrieben, dass zum Aufwachen aus dem Deep-Sleep der PIN16 mit CH_PD verbunden sein muß. Leider hat das bei meinem ESP nicht funktioniert. Deshalb verwende ich den RESET für den Wakeup. Ich kann dadurch zwar ein paar Optionen des Deep-Sleep nicht verwenden aber für den Prototypen ist mir das egal.

Der Prototyp in EAGLE
Der Prototyp in EAGLE

 

Es bedarf etwas an Tüftelei die Bauelemente auf der Platine sinnvoll zu platzieren, ich habe versucht Platz zu sparen, vor allem weil ich einen relativ kleines Platinenstück übrig hatte.

Meine Prototyen Platine
Meine Prototyen Platine

Zum Programmieren des ESP verwende ich meine Arduino IDE. Dazu muß man in der Arduino Software, in den Einstellungen http://arduino.esp8266.com/stable/package_esp8266com_index.json eintragen. Dann unter Tools > Board „…“ > Board Manager… auswählen, esp8266 anklicken und Install drücken. Danach kann der ESP wie jeder andere Arduino programmiert werden. Zum Programmieren muß der Jumper beim Initialisieren gesetzt sein. Bei mir zickt das Hochladen des Programmes ab und zu. In dem Fall nehme ich einfach kurz die Spannung weg (aber lange genug dass ich der ELKO entlädt) und versuche es nochmal. ACHTUNG, wenn beim Aufwachen aus dem Deep Sleep der Jumper noch immer gesetzt ist dann startet der ESP nicht richtig.

 

Automatische Bewässerungsanlange

Also ich liebe ja eigenes Gemüse. Wenn man seine Tomaten frisch vom Strauch pflückt weiß man erst wie gut Tomaten schmecken können. Leider bin ich immer nachlässig was das Gießen angeht. Und ich Hochsommer brauchen so Tomaten wirklich viel Wasser und daher ist es mir passiert, dass die Ernte im letzten Jahr nicht ganz so toll ausgefallen ist wie es hätte sein können.

Daher habe ich beschlossen eine automatische Bewässerungsanlage zu bauen. Ich werde mittels Arduino Boards Feuchtigskeitsmesssonden basteln die die aktuellen Daten mittels WLAN an meine Zentrale, einen Raspberry PI schicken. Die Messsonden sollen autark sein und von ihren Strom aus jeweils einer kleinen Solarzelle beziehen. Der Raspberry zeichnet die Daten auf und agiert als Regler für die Bewässerung. Für das Gießen selbst werde ich eine Schaltung für die Pumpen benötigen da sich eine Versorgung über Schwerkraft vermutlich nicht realisieren läßt.

Zu guter letzt soll das ganze nicht zu viel kosten… I