Beiträge von Scooper

    Hallo,

    ich habe noch eines gelernt, was ich hier einbringen will. Als ich auf die Programmversion gewechselt bin, bei der das Program die Einschaltzeiten aus einem Parameterfile einliest, fiel mir auf, dass der Autostart aus der rc.local nicht mehr funktionierte (siehe Anfang dieses Threads). Ich habe jetzt gemerkt, dass zum Zeitpunkt, zu dem dieses Skript abgearbeitet wird, offenbar noch nicht alle Verbindungen zu allen Medien bestehen, deshalb stürzt das Program beim Einlesen der Parameter ab. Jetzt habe ich vor den Startbefehl in der rc.local eine Zeile mit "sleep 30" gesetzt, und siehe da, es funktioniert wieder, auch mit der neuesten Version.

    Im Anhang ein Auszug aus meiner rc.local, in der noch weitere Programme gestartet werden.

    _______________

    #!/bin/sh -e
    #
    # rc.local
    #
    # This script is executed at the end of each multiuser runlevel.
    # Make sure that the script will "exit 0" on success or any other
    # value on error.
    #
    # In order to enable or disable this script just change the execution
    # bits.
    #
    # By default this script does nothing.

    # Print the IP address
    _IP=$(hostname -I) || true
    if [ "$_IP" ]; then
    printf "My IP address is %s\n" "$_IP"
    fi

    sleep 30
    python3 /home/pi/Reboot.py
    sleep 5
    python3 /home/pi/Aqua/Aquarium.py&
    sleep 5
    python3 /home/pi/Pumpe/Pumpe.py&
    sleep 5
    python3 /home/pi/Licht/Lichtspiele.py&
    sleep 5
    python3 /home/pi/Ping/Ping.py&
    exit 0

    Hallo,


    hier also auf Wunsch der Update des Projektes im Zustand nach ca. 1 Jahr Betrieb:


    Änderungen/Neue Funktionen:


    - Code entrümpelt, Variablen vereinfacht
    - Temperatur, Licht, Dünger, Nachfüllen, Füttern werden alle 10 min. aus einem Parameterfile eingelesen und entsprechend enigestellt, keine Hartcodierung der Zeiten im Code mehr
    - Temperatur folgt seitdem einer Sinusfunktion mit +/- 1 Grad Variation über den Tag
    die Vorgabewerte werden aus dem Parameterfile eingelesen
    - Energieverbrauch wird gemessen
    - Tageszeiten und Wetter können in der Beleuchtung simuliert werden
    - Beleuchtungsdauer und Anteil in % jeder Lampe wird angezeigt
    - Betriebsstundenzähler für die Leuchtstoffröhren
    - Ein Tablettenfutterautomat (Eigenbau) hängt dran
    - Es werden über 30 Tage Logfiles der Parameter mitgeschrieben
    - Es wird täglich ein Statusbericht per email versandt
    - Im Fehlerfall (Temperatur) wird eine mail versandt
    - Display geändert, mehr Output


    Im Einzelnen:


    Code entrümpelt:

    Bei genauerer Betrachtung war doch vieles der ersten Version sehr umständlich, hat funktioniert, aber eben nicht sehr elegant. In vielen Stunden, bei denen ich vor dem Fernseher sitzend nebenbei etwas am Code gespielt habe, wurde das verbessert. Geht bestimmt immer noch besser, ist aber jetzt meiner Meinung nach aber deutlich klarer


    Parameterfile:


    Alle 10 min. liest das Programm jetzt eine neue Vorgabe für die Parameter


    - Beginn Intervall
    - Ende Intervall
    - Lampe 1
    - Lampe 2
    - Lampe 3
    - CO2
    - Temperatur
    - Laufzeit Düngepumpe
    - Laufzeit Nachfüllpumpe
    - Anzahl zu fütternder Tabletten


    aus dem File „TimefileAq.txt“ ein. Vorteil: Wenn man an den Parameterwerten was ändern will, muss man den Code dazu nicht anfassen. Man kann die Zeitintervalle auch enger oder weiter wählen (Start und Ende stehen im File selbst), ich fand 10 min. ein gutes Raster.
    Achtung: Das Programm liest die Werte anhand der Position in der Zeile ein, also nicht beim Ändern schlampern, die Werte müssen immer an der gleichen Stelle stehen, und die Nullen nicht vergessen!
    Kleine Änderungen mache ich in einem Texteditor. Größeres in einem Tabellenprogramm.


    Energieverbrauch:


    Da ich die Werte der Verbraucher kenne, kann ich die über den Tag abhängig vom Einschaltzustand mitloggen und aufintegrieren. Die Zeitbasis ist noch unsauber, ich zähle die Anzahl der Schleifendurchläufe, die dauern bei mir so ca. 1 sec. Aber als Schätzung funktioniert das sehr gut.


    Beleuchtungsdauer:

    Ich benutze drei Leuchtstoffröhren, eine in Tageslichtfarbe (eher blau), eine warm weiss (eher gelb), und eine Typ „gro-lux“ (eher rot).
    Das Programm zeigt mir an, wie lange welche Röhre gebrannt hat und wieviel % der Beleuchtung durch sie gestellt wurde.


    „Wetter“ in der Beleuchtung:

    Ich kann mit den 3 Leuchten „spielen“ und so einen Tropentag simulieren, da ist es ja auch nicht immer gleich hell, und das Licht hat nicht immer das gleiche Spektrum. Morgens geht es mit einer Röhre los, über den Tag kommt eine zweite dazu, und Mittags sind dann zeitweilig drei an, gegen Abend das Ganze rückwärts. Jetzt kann ich noch simulieren, dass es „Wolken“ gibt, die auch über den Tag die Intensität fluktuieren lassen.
    Spielerei? Vielleicht, aber ich spiele eben gern und nutze die Freiheitsgrade, die mir der Raspi gibt.
    Mit dem Parameterfile ist das leicht einzustellen, da nicht mehr hart codiert.
    Mein Pflanzenwachstum ist sehr gut, und ich versorge regelmäßig Kollegen mit den Ablegern der Pflanzen. Kann also so falsch nicht sein.


    Logfiles:

    derzeit gibt es 2 Logfiles:


    - Aqualog-xx.txt
    - Aquastat.txt


    Ich habe anfangs immer dann einen Logeintrag geschrieben, wenn sich ein I/O verändert hat. Später hat mir das dann nicht gereicht, und ich habe einfach jede Minute die Variablen aufgeschrieben. Der Dateiname wird so gebildet, dass der Tag des Monats (1-31) Teil des Dateinamens ist, so überschreibt der Pi die Files alles 30 Tage, man hat also den letzten Monat im Zugriff, um zu schauen, was gelaufen ist.

    Im file Aquastat.txt (für Statistik) wird jeden Tag eine Zeile geschrieben, damit man Beleuchtung, Futter etc. über einen längeren Zeitraum ansehen kann.


    Ich schreibe bei mir alles auf einen USB-Stick, um die SD-Karte mit Schreibbefehlen zu schonen. Hier habe ich Pfadnamen alle auf /home/pi gesetzt.


    Betriebsstundenzähler der Lampen

    Bei jedem neuen Intervall schreibt der Pi die Betriebssekunden der Lampen 1 bis 3 in die Datei
    „Betriebstunden-Lampen.txt“. Beim Start liest er diese Datei ein, die Info ist also nicht flüchtig.
    Vor Inbetriebnahme müssen die korrekten Werte der Röhren in die Datei einmalig eingetragen werden. Beim Wechsel wird eine 0 eingetragen.


    Statusbericht per mail:


    Kurz vor Mitternacht schreibt der Pi einen Bericht mit den wichtigsten Infos in eine Datei „Statusreport.txt“.


    Fehlermeldungen per mail:


    Tritt ein Fehler auf, (im wesentlichen Temperaturabweichung), wird der in die Datei „Fehlermeldungen.txt“ geschrieben.


    Email-Versand von Statusreport und Fehlermeldungen


    Über einen Cron-Job wird stündlich das Programm „Postbote.py“ gestartet, das in den o.a. Dateien „Fehlermeldungen.txt“ und Statusreport.txt“ nachsieht, ob da was drinsteht und, wenn das der Fall ist, den Inhalt per mail verschickt. Hier müsst Ihr natürlich Eure eigenen Usernamen und Passwörter des email accounts eintragen, damit das funktioniert.


    Warum ein separates Programm?
    Ursprünglich hatte ich den email-Versand in der Aquariencode integriert, aber damit bin ich einmal auf die Nase geflogen: Weil der gmail-Server nicht verfügbar war, ist die Schleife abgestürzt, und alle Relais blieben dann in der aktuellen Position. Bei mir waren dann gerade beide Heizer auf ON. Hier kam zugute, dass dann der mechanische Thermostat ansprach und das Heizen begrenzt hat (gut, dass wir das in der Risikobeurteilung ganz am Anfang berücksichtigt hatten!!!).


    Hier muss man echt aufpassen, dass die Schleife nicht über Dinge stolpert, die häufiger schief gehen können, prinzipiell jedes Ansprechen von externer Hard- oder Software (USB-Stick, Temperatursensor, Netzwerk-Partner, …). Das muss man absichern. Das geht sicher auch eleganter mit Try und Except bei Python, ich habs hier über eine separate Routine gelöst. Wenn der Postbote.py aus welchen Gründen auch immer crasht, dann läuft die Aquarienschleife jedenfalls ungestört weiter, und das ist ja essenziell für ein life supporting system. Wenn ihr im Urlaub seid und Euer email provider hat eine Störung, soll ja nicht das Aquarium crashen, oder? Dass ein Temperatursensor oder USB-Stick hardwaremäßig stirbt, kann passieren, nehme ich aber derzeit als hinreichend unwahrscheinlich in Kauf.


    Futterautomat für Tabletten:


    Ein Thema für sich. Ganz kurz: Ich habe ein Servo aus dem Modellbau benutzt, das man mit pulse width modulation ansteuern kann. Die Bewegung des Hebels wird über die pwm gesteuert und befördert bei jedem Ansteuern eine Tablette aus einer Röhre, in der die Tabletten gestapelt sind, ins Becken. Das Ding gewinnt keinen Schönheitspreis, aber es funktioniert jetzt seit Monaten zuverlässig. Ich war mit den kommerziellen Futterspendern nicht zufrieden, weil das Flockenfutter darin klumpt. Aber das ist ein Thema, das diesen Rahmen sprengen würde. Im Zweifel läuft der PWM einfach ins Leere, oder Ihr kommentiert den Part aus.


    Zusammenfassung


    Ok, was müsst IHR machen, wenn Ihr den Code für Euch nutzen wollt?


    - Adresse des Temperatursensors anpassen
    - Alle Pfadnamen in Aqua56.py und Postbote.py so anpassen, dass sie bei Euch passen
    - Das Parameterfile Timefileaq.csv nach Euren Bedürfnissen anpassen
    - Usernamen und Password für Euren email-account anpassen
    - Kann sein, dass Ihr noch Pakete für die email-Funktion nachinstallieren müsst, im Zweifel das erst mal separat testen.
    - Den Cron-Job für Postbote.py einrichten
    - Betriebssekunden der Lampen in „Betriebstunden-Lampen.txt“ korrekt anpassen


    Damit sollte es dann gehen. Aber wie gesagt, Ihr müsst Euch da sicher in den Code reinwühlen, denn das ist jetzt bereits sehr auf MEINE individuellen Bedürfnisse angepasst. Evtl. müsst Ihr da am Code für Euch feilen. Daher nehmt diesen Post mehr als Ideensammlung denn als fertiges Kochrezept.
    Würde mich freuen, wenn der ein oder andere Teile meines Projektes übernimmt und für sich nutzen kann.

    Ich hoffe, ich habe beim Zusammenschreiben nicht zu viele Fehler eingebaut....

    P.S: Nach 1 Jahr Erfahrung kann ich sagen, dass das Ganze ein recht robustes System ist. Was habe ich beim Experimentieren nicht alles falsch gemacht? Kurzschlüsse mit Messspitzen, T-Sensor +/- verpolt, etc. etc., mein 1. Pi lebt immer noch. Neben dem Aquarium erfüllt er noch andere Aufgaben, aber das ist ein separates Thema, hier nur erwähnt, um zu sagen, dass die CPU längst nicht ausgelastet ist.

    Viel Spaß, stay hungry, stay foolish!


    Hallo,

    erst mal danke an scooper für die mühe, ich finde die Idee super. ich wollte es ausprobieren komme aber nicht weiter. Mein Problem ist wenn ich es Starte schalten bei mir alle Relais ein und es reagiert nicht mehr, ich kann zwar sehen das es lauft was eingeschaltet ist z.b Lampe oder so aber die Relais schalten sich nicht mehr ab. Daher meine Frage ob mir wer bei meinem Problem Helfen Kann?

    lg Markus

    Hallo,

    hört sich für mich auf dem ersten Blick so an, als würde die Schleife nicht endlos laufen. Blinkt die "alive-LED" im Sekundentakt?

    Wenn nicht, dann initialisieren die Relais (das ist das, was Du wahrnimmst) und bleiben dann in dem Zustand.

    Wenn die Schleife nicht läuft, musst Du rauskriegen, wo der Code hängt. Mein erster Tip wäre, dass der Temperatursensor nicht korrekt einliest. Hast Du den mal händisch ausgelesen? Stimmt der Pfadname zum Sensor (jeder hat eine eigene ID), sind die Pakete für den sensor installiert?

    Im Zweifel im Programm Textmeldungen einbauen, damit Du siehst, wo Du hängst.

    Viel Erfolg!

    OK, verstanden, dann war das mit dem Messen vorher instinktiv richtig, und meine Karte passte dann offensichtlich für den Pi.

    Wenn ich die nächste bestelle, werde ich die auch vorher durchmessen. Aber wenn die Werte so, wie bei meiner sind, dann ist es ohne Treiberstufe schon einfacher....

    Hallo,

    zum Thema Temperatur:

    Da das ein 2-Punkt-Regler ist (der kennt nur AN oder AUS), muss der Heizer unterhalb einer bestimmten Temperatur EIN und oberhalb einer bestimmten Temperatur AUS schalten.
    Diese Temperaturen können nicht gleich sein. Die Temperatur bleibt dann im aufgespannten Bereich. Das ist eine Hysterese.

    Du kannst die Temperaturen 0.2 Grad auseinander setzen, was sicher genau genug ist, aber gleich dürfen sie nicht sein.

    Grüße

    Scooper

    Hallo Jar,

    Ich weiss, um dieses Thema wird heftig in den Foren gestritten. Viele sagen, dass man seinen Pi damit grillt, andere sagen: "Anschließen und gut is".

    Deshalb habe ich das vorher selber durchgemessen.

    Schau mal weiter oben im ersten Post, da habe ich schon ein paar Messergebnisse dazu veröffentlicht. Vielleicht hast Du die noch nicht gelesen.

    Die IN-Pins der Relaisboards haben (natürlich bei angeschlossener Versorgungsspannung und ohne Verbindung zum Pi GPIO) 3V. Und wenn man die IN Pins auf GND legt so dass das Relais anzieht, fließen 1.9 mA.

    Ich kann da nicht erkennen, wo der Pi at risk sein sollte. Weder die 3V auf GPIO Eingang noch die 1.9 mA, wenn der GPIO auf Masse zieht, sollten dem Pi gefährlich werden.

    Und wie gesagt, bei mir funzt das seit 1 Jahr ohne Probleme.

    Also, ich schließe mich damit der Fraktion "Anschließen und gut is" an.

    Oder gibt es noch ein Risiko, was ich übersehen habe?

    Hallo,

    diese erste einfache Version kann nicht über Mitternacht rechnen (dann gilt die Bedingung nicht, dass die Einschaltzeit immer kleiner ist als die Ausschaltzeit).

    Deswegen funktioniert das nicht (aber warum willst Du von 22 bis 9 Uhr Licht brennen lassen ?)

    Natürlich habe ich den Code in der Zwischenzeit "etwas weiterentwickelt", die ersten Gehversuche funktionieren, aber sie sind wenig elegant. Ich kann Dir den neuen Code gern posten, aber mir fehlt derzeit die Zeit, den sauber zu dokumentieren. Vieles ist jetzt nicht mehr so allgemein, sondern genau für mich gestrickt.

    Ich habe noch zwischenzeitlich einen Futterautomaten für Tabletten mit einem Servomotor aus dem Modellbau, der bei mir in der Schubade rumflog angestrickt (Pulsweitenmodulation an einem GPIO).

    Außerdem bezieht der Raspi alle Einschaltzeiten jetzt aus deinem Parameterfile, die sind also nicht im Code hart codiert, sondern in dem file änderbar.

    Ich kann über das Parameterfile "Wetter" machen. Die Intensität und Farbe des Lichts ändern sich über den Tag, so wie in den Tropen ja auch erst Sonne kommt, dann Bewölkung und später Gewitter und dann wieder Sonne. Das kann man leicht simulieren. Manche nennen das Spielerei, ist es vermutlich auch, aber ich spiele eben gern.

    Die Temperatur folgt über den Tag einem Sinus mit +/- 1 Grad (auch im Parameterfilem hinterlegt).

    Dann logge ich noch einiges mit, berechne den Energieverbrauch, und der Raspi schickt mir jeden Tag einen Statusreport per email, ob alles OK ist (bzw. eine Fehlermeldung, wenn was schief läuft)

    Die Stromversorgung habe ich durch ein echtes 5V Netzteil gelöst, und dann hängen da parallel 4 NiMh AA Akkus (in Reihe geschaltet) als unabhängige Stromversorgung dran. Bei einem Stromausfall halten die ca. 1h durch, d.h. der Raspi läuft weiter.

    Die Lampen haben Betriebsstundenzähler, da habe ich keine Unsicherheit mehr, wann ich die tauschen muss.

    Wie gesagt, den Code poste ich gern, aber dann musst Du Dich da selber reinwühlen.

    Grundsätzlich funktioniert das System aber jetzt seit 1 Jahr sehr zuverlässig. Die Freiheitsgrade, die man durch den Raspi bei der Steuerung bekommt, sind erheblich und wirken sich bei mir positiv auf das Wachstum der Pflanzen aus. Ich versorge einen Kollegen regelmäßig mit dem Überschuss, wenn es zu voll wird.

    Stay hungry, stay foolish! Keep on playing!

    Viele Grüße

    Scooper

    Hallo,

    Erstmal danke für den Tip, das sieht wirklich so aus, als könnte man da eine Glaselektrode direkt an den Pi anschliessen. Aber175$ sind natürlich auch eine Hausnummer, die dafür aufgerufen werden...

    Das werde ich auch nicht mal eben so investieren. Für das Geld kann ich eine Menge Wassertests kaufen, und so instabil ist mein ph-Wert nicht. Ist für mich nice to have, aber keine Basis-Ausstattung.

    Mal sehen, vielleicht findet sich noch eine andere Lösung.

    Trotzdem Danke für den Post!

    Hallo,

    Hört sich interessant an. Kannst Du mal Deinen Code posten ? Die Alarmfunktion mit mail und die Einbindung der Camera würde mich auch interessieren.

    Wie hast Du bei der Nachfüllautomatik dafür gesorgt, dass Du Deine Bude nicht unter Wasser setzt? Kommt das Wasser aus einem Kanister oder direkt aus der Leitung? Bei letzterem hätte ich Angst vor Fehlfunktion des Sensors oder des Ventils. Da müsste man m.E. mindestens mit redundantem Sensor UND Absperrventil rangehen.
    Ich mache das derzeit aus dem Kanister und habe die Dosierzeit schlicht ausprobiert. Da der Kanister nir 10 l fasst und ich immer Platz im Becken für 10 l habe, kann da nix schiefgehen. Wenn so eine direkt gespeiste Automatik versagt, ist das Schadenspotential halt sehr groß...

    Bei ph-Sensor habe ich mal geschaut, aber noch keine einfache Anbindung an den Pi gefunden. Das wäre in Zusammenhang mit dem CO2 eine gute Möglichkeit zur Regelung. Aber hier habe ich auch noch keine Lösung ...

    Viele Grüsse

    Eben habe ich den Go-Life gemacht und das Aquarium mit dem Raspi verkabelt. Ab jetzt steuert er wirklich alle Funktionen :D . Noch habe ich das Breadboard drin, weil ich den Raspi ab und zu noch rausnehmen muss, ist aber schon sehr nahe an der End-Ausbaustufe. Vor die Relaiszeile gehört noch eine Plexi-Platte, um das Ganze elektrisch fingersicher zu machen. Der Raspi hängt deutlich ÜBER Beckenhöhe (in etwa auf Augenhöhe) damit keine Gefahr besteht, dass da mal Wasser dranspritzt. Die Steuerung hängt sowieso auf der Rückseite einer Kellerwand (Becken steht auf der einen Seite im Flur, die Technik habe ich auf der anderen Seite versteckt.). Alle Relais und Verbaucher tun das, was sie sollen. Das Testprogramm hat das schon alles gut simuliert. Ein bisschen Fine-Tuning an den Zeiten wird noch kommen, aber erst mal geht alles :thumbs1: . Alle Zeitschaltuhren und Thermostate sind durch den Raspi ersetzt !

    Die rote LED auf dem Breadboard ist die "Alive-LED", die bei jedem Zyklus der Schleife blinkt, die gelbe LED zeigt an, dass die Temperatur im Zielbereich ist. Die LEDs auf dem Relaisboard sind an, wenn der jeweilige Verbraucher eingeschaltet ist.

    Die Relaiszeile aus China für 5 € funktioniert einwandfrei, bei den Klemmen muss man etwas aufpassen, dass man die Schrauben nicht durchdreht, die sind nicht dafür gemacht, das man da jeden Tag 5 mal Verbraucher an- und abklemmt.

    Das Python-file enthält den Code, der aktuell an meinem Aquarium läuft. Funktioniert alles bestens, Die Temperaturregelung läuft auf 0.2 °C genau. (Man könnte ja jetzt leicht eine Nachtabsenkung oder Temperaturkurve programmieren... ;) )

    Einfacher Aquariencomputer mit Raspberry Pi

    (Stichworte: Raspberry, Aquarium, Steuerung, Regelung, Heizung, Nachtabsenkung, Beleuchtung, CO2, Nachfüllen, Tagesdünger, Dosierung)

    Warum beschreibe ich dieses Projekt? Es gibt doch schon reichlich Anleitungen für Aquarien-Computer mit Raspberry Pi!

    • Viele der Projekte steigen mit sehr hohen Anforderungen ein. Da soll dann Licht, Temperatur, Heizung, Leitwert, ph-Wert, CO2-Gehalt, Wasserstand, Luftdruck usw. kontrolliert, graphisch aufbereitet, ins Netz gestellt und auf dem Handy per Schieberegler eingestellt werden, natürlich Webcam usw., um nur einiges zu nennen.
    • Auch wenn so ein Pi das wahrscheinlich von seinen Möglichkeiten her locker kann, brechen doch viele der so gestarteten Projekte nach 3 bis 4 Posts ab, weil die Wünsche eben doch größer waren als die Zeit und das Durchhaltevermögen, die nötig sind, um so ein Projekt fertig zu stellen.


    Solche Posts sind frustrierend, und viele interessierte Aquarianer wenden sich vermutlich abgeschreckt ab, weil ihnen so ein Projekt zu kompliziert erscheint. Dabei ist es gar nicht so schwer, einen funktionierenden Anfang zu setzen, auf dem man später aufbauen kann.

    In diesem Beitrag möchte ich ein Aquarienprojekt beschreiben, das auch normal versierte Bastler in überschaubarer Zeit fertigstellen können. Die funktionierende Anlage kann dann natürlich beliebig erweitert werden. Aber wir haben erst mal etwas, das funktioniert!

    Diese Anleitung ist sicher nicht der einzig mögliche oder auch nicht der optimale Weg. Vermutlich gibt es viele Möglichkeiten das anders, besser, vielleicht einfacher zu machen als ich das getan habe, das steht auch nicht im Vordergrund. Ziel war es, einen vernünftigen Funktionsumfang mit überschaubaren Mitteln und in überschaubarer Zeit umzusetzen und das Projekt abzuschließen. Dies Projekt ist nicht nur eine Idee oder ein Wunsch, sondern wurde in überschaubarer Zeit erfolgreich umgesetzt und funktioniert.

    Was soll das Projekt können?


    Wichtig ist immer erst mal, dass wir uns darüber klar werden, was wir am Ende wollen. Wir könnten uns z.B. die Basisanforderungen einer Aquariensteuerung vornehmen:

    • 3 Lampen unabhängig voneinander ein- und ausschalten
    • Eine Temperaturregelung mit Boden- und Stabheizer darstellen
    • CO2-Zufuhr ein- und ausschalten
    • Eine Dosierpumpe mit Tagesdünger schalten
    • Eine Pumpe für eine Nachfüllautomatik schalten
    • (Futterautomaten klammern wir mal aus, da diese Geräte i.d.R. bereits mit Steuerung kommen, sonst wäre das auch eine Anforderung)

    Daneben wollen wir die Steuerung über externe Computer oder Tablet/Smartphone im Heimnetz ansprechen können (soll kein eigenes Keyboard und Display benötigen).

    Die Steuerung muss fehlersicher sein, d.h. zum Beispiel, dass sie nach einem Stromausfall automatisch wieder in einen stabilen Betriebszustand findet.

    Und wir wollen den „Gesundheitszustand“ der Steuerung im Vorbeigehen erkennen können, ohne dass wir an einem PC einloggt sein müssen (Visuelle Rückmeldung: Steuerungsprogramm läuft und Temperatur ist im Zielbereich).

    Ein so ausgestattetes Becken darf man sicher als technisch auf einem guten Stand bezeichnen. Natürlich kann man so etwas auch mit diskreten Komponenten (einzelnen Zeitschaltuhren und Thermostaten) darstellen, aber eine Pi-Lösung ist am Ende billiger, eleganter und erweiterungsfähig (und macht auch mehr Spaß).

    Was brauchen wir an Material?

    • Raspberry Pi (ich habe einen Pi-2), am besten mit Gehäuse
    • Netzteil 5V, min 2A
    • Einen USB-WLAN-Adapter
    • Ein Adapterkabel HDMI auf DVI (nur nötig, wenn Euer Monitor keinen HDMI-Eingang hat)
    • Eine micro SD-Karte, 8 GB oder mehr
    • Eine 8-fach Relais-Zeile von Sainsmart (oder Nachbau)
    • Einen Temperatursensor DS1820 + einen 4.7 kohm Widerstand
    • Einen Satz I/O-Kabel (Stecker weiblich-weiblich)
    • Ein paar LEDs und 330 ohm Widerstände

    Für den Pi gibt es Sets, die alles obige bis auf den Temperatursensor, die Relaiszeile und die I/O-Kabel beinhalten für ca. 70 € im Netz zu kaufen. Alle anderen genannten Teile gibt es ebenfalls beim großen Versandhändler. Abhängig davon, wie lange man warten kann, kommen die Relaiszeile und die T-Sensoren direkt aus China oder aus Europa. Alles zusammen sollte aber für 75 – 90 € zu beschaffen sein.
    Keyboard und Maus setzen wir mal als vorhanden voraus, brauchen wir, ebenso wie das Monitorkabel auch nicht dauerhaft am Pi.

    Was brauchen wir an Werkzeug?

    Ein Lötkolben und Schrumpfschlauch ist hilfreich beim Konfektionieren des T-Sensors oder von Kontroll-LEDs.
    Ein Vielfach-Messgerät wäre gut.
    Daneben das übliche Bastelwerkzeug, Zangen Schraubenzieher etc.

    Welche Kenntnisse sind nötig?

    Um dies Projekt erfolgreich fertig zu stellen, muss man kein Hacker sein, aber man muss sich an neue Dinge herantrauen. Etwas Erfahrung mit Linux ist hilfreich, ebenso darf man keine Angst vor einer Konsole und einigen Terminal-Befehlen haben. Der Python-Code, den ich hier veröffentliche, funktioniert erst mal, aber wenn man ihn für eigene Bedürfnisse anpassen will, dann muss man sich etwas mit der Programmiersprache Python beschäftigen.
    Ich werde hier natürlich auch nicht alles nochmals beschreiben, was bei der Inbetriebnahme und Konfiguration eines Raspi schon zig mal im Netz steht, aber ich werde die Links zitieren, die bei MIR funktioniert haben (es gibt leider auch ziemlich viel Zeug im Netz, das zumindest mal nicht aktuell ist).
    Etwas Vertrautheit mit Elektronik und einem Lötkolben hilft definitiv. Sonst kann das schwer werden, z.B. den Sensor zu konfektionieren. Und wer am Ende 230 V-Verbraucher an seine Relaiszeile anschließt, muss auf jeden Fall wissen, was er tut! 230 V sind genug, um sich daran ernsthaft zu verletzen oder schlimmeres. Hierzu kann ich nicht mal eben in 5 Zeilen eine Anleitung schreiben. Da muss sich jeder selbst einschätzen, ob er das kann. Im Zweifel immer einen Fachmann befragen!

    Schritt 1: Raspi aufsetzen und starten

    Dies ist im Netz hinreichend beschrieben. Ich habe Raspbian als Betriebssystem benutzt. Als Sofortmaßnahme muss man den Mouse-Lag beseitigen, damit man arbeiten kann, Die ersten Gehversuche habe ich mit dem Raspi mit angeschlossenem Monitor und Keyboard gemacht, später habe ich über VNC auf den Raspi zugegriffen. Zum Modifizieren des Codes benutzen wir Idle3, das bereits im Raspbian vorinstalliert ist.

    Schritt 2: Raspi an den Router anbinden

    Das ist aus zwei Gründen wichtig. Zum einen holt sich der Raspi selber die aktuelle Uhrzeit aus dem Netz und zum zweiten wollen wir ihn später über VNC remote ansprechen. Also erst mal dafür sorgen, dass der Raspi über Kabel oder den WLAN-Stick am Router angemeldet ist. Dann im Betriebssystem die korrekte Zeitzone einstellen, damit localtime uns später die korrekte Zeit im Programm liefert.

    Schritt 3: Temperatursensor konfektionieren und anschließen

    Der Anschluss eines DS1820 ist hier

    http://www.netzmafia.de/skripten/hardw…wire/index.html

    sehr gut erklärt. Ich habe den Sensor mit Schrumpfschlauch geschützt. Zur Temperaturmessung im Aquarium wird er dann einfach mit Tesafilm von außen an die Scheibe geklebt und auf der Rückseite mit etwas Schaumfolie isoliert, damit er nur (oder weit überwiegend) von der Temperatur im Becken beeinflusst wird. Wir schließen den Sensor korrekt an und nehmen die Einträge in den Dateien im Betriebssystem so vor, wie im Link oben beschrieben. Wer der Beschreibung im Link gefolgt ist, der weiß dann auch bereits, ob sein Sensor korrekt angesprochen wird.

    Schritt 4 : Sich mit dem Python Code vertraut machen, Schaltzeiten und Temperaturschwellen einstellen.

    Das Programm befindet sich in der Datei „Aquarium.py“ und ist vollständig kommentiert, sollte also in weiten Bereichen selbsterklärend sein. Welcher GPIO für welche Funktion zuständig ist, steht alles im Source file.
    Was macht das Programm?

    • Licht:

    Es sind 3 Lampen vorgesehen. Für jede Lampe sind aktuell 2 Schaltintervalle definiert, d.h. man kann z.B. morgens x Stunden beleuchten, dann eine Pause von einigen Stunden machen und abends wieder für y Stunden beleuchten. Wenn man nur eine Beleuchtungsphase haben will, einfach beide Intervalle gleich einstellen.

    • CO2:

    Für das CO2 gilt das Gleiche wie für das Licht, wir schalten ja mit 230 V ein Magnetventil.

    • Heizung:

    Für die Heizer werden Schwelltemperaturwerte mit einer Hysterese von ca. 0.3 °C eingestellt, also z.B.

    Heizer an , wenn kälter als 24.0 °C
    Heizer aus, wenn wärmer als 24.3 °C

    Für den Stabheizer werden die Schaltschwellen ca. 0.2 ° tiefer eingestellt als für den Bodenheizer. Meist ist der Bodenheizer viel schwächer und nicht in der Lage, die Heizung komplett zu übernehmen. Er soll aber immer an sein (wenn es nicht insgesamt zu warm ist). Fällt die Temperatur weiter, obwohl der Bodenheizer an ist, wird der Stabheizer zugeschaltet. Er wird wieder ausgeschaltet, bevor der Bodenheizer seine Abschaltschwelle erreicht, übernimmt also weitgehend die eigentliche Temperaturregelung, während der Bodenheizer immer an ist, aber bei zu hoher Temperatur (beispielsweise im Sommer) natürlich ebenfalls automatisch ausgeschaltet wird.

    • Temperatur-Anzeige

    Es werden dazu Temperatur-Warnschwellen definiert. Befindet sich die Temperatur innerhalb der Warnschwellen, wird mittels GPIO 5 eine LED eingeschaltet, ist die Temperatur außerhalb der Warnschwellen, wir die LED ausgeschaltet. Laufen wir am Pi vorbei, können wir also ohne weitere Info anhand der LED sehen, ob die Temperatur in Ordnung ist. Leuchtet sie, ist alles klar, leuchtet sie nicht, müssen wir nachsehen, was los ist. Idealerweise sind die Warnschwellen 0.1°größer/kleiner als die größten/kleinsten Schaltschwellen der Heizer.
    Natürlich werden im Terminal des Pi die aktuellen Temperaturwerte ausgegeben, aber wir gehen davon aus, das nicht ständig ein Display angeschlossen ist, und der Regler soll das auch hinbekommen, ohne dass wir alle 5 Minuten auf ein Display schauen müssen.

    • Tagesdünger:

    Einmal am Tag können wir zu einer einstellbaren Zeit eine Dosierpumpe für x (einstellbar) Sekunden einschalten, um Tagesdünger aus einem Kanister zu dosieren.
    Bau der Dosierpumpe ist hier beschrieben

    http://www.amazon.de/Pollin-Zahnrad-Wasserpumpe-mit-Motor-RS-360SH/dp/B00F2DJS4O/ref=sr_1_3?ie=UTF8&qid=1457158093&sr=8-3&keywords=zahnradpumpe&tag=psblog-21 [Anzeige]

    • Nachfüllen:

    Einmal am Tag können wir zu einer einstellbaren Zeit eine Nachfüllpumpe für y (einstellbar) Sekunden einschalten, um verdunstetes Wasser aus einem Kanister zu dosieren.
    Bau der Nachfüllpumpe ist an gleicher Stelle wie die Dosierpumpe beschrieben.
    Ungenutzte Ausgänge:
    Wer kein CO2, bzw. keine Tagesdüngung und Nachfüllung nutzt, kann die Ausgänge einfach ins Leere laufen lassen oder für andere Dinge nutzen (Futterautomat,…)

    • Läuft unser Programm?

    Das Programm läuft in einer Endlosschleife mit einer Zykluszeit von ca. 1 sec. Wir wollen natürlich auch im Vorbeigehen sehen können, ob unser Pi „lebt“, d.h. sein Programm brav abarbeitet.
    Das lösen wir dadurch, dass wir mit jedem Schleifendurchlauf eine LED (GPIO 5) an- und ausschalten. Läuft unsere Schleife ordnungsgemäß, blinkt diese LED gleichmäßig mit einer Periode von ca. 1 sec. Läuft unser Programm nicht, blinkt sie nicht. Diese LED ist also ein „health indicator“, ob unser Programm ordnungsgemäß zykelt, ohne dass wir uns dazu auf dem Pi einloggen müssen.

    • Festlegen der Schaltzeiten und Temperaturschwellen etc.:

    Alle Variablen werden im Programm „fest“ im Code vorgegeben. Wenn wir sie ändern wollen, wird der Python Code in der Datei Aquarium.py geändert. Nicht sehr elegant? OK, wie oft wollen wir an einem eingelaufenen Becken an diesen Variablen spielen…..? Für den Start ist das komfortabel genug.

    Programmablauf:

    • Am Anfang werden die GPIOs definiert und die Variablen gesetzt bzw. initialisiert.
    • Danach geht es in eine Endlosschleife, in der folgendes passiert:
    • Abfrage, ob die aktuelle Uhrzeit in einem definierten „Ein-Fenster“ liegt
    • Wenn ja, Lampe bzw. CO2 einschalten
    • Wenn nein, Lampe bzw. CO2 ausschalten
    • Variable für den Ausgang dem Schaltzustand entsprechend setzen
    • Temperatur von Sensor auslesen
    • Mit den gesetzten Temperaturgrenzen für Boden- und Stabheizer vergleichen
    • Wenn zu warm oder zu kalt, Heizer aus- oder einschalten
    • Variablen mit Schaltzustand entsprechend setzen
    • Prüfung, ob Temperatur im Zielbereich
    • Setzen/Ausschalten der LED für „Temperatur = OK“
    • Abfrage, ob Uhrzeit für Dosierung des Tagesdüngers erreicht
    • Wenn ja, Dosierpumpe für die definierte Zeit einschalten
    • Abfrage, ob die Uhrzeit für die Nachfüllung erreicht
    • Wenn ja, Nachfüllpumpe für die definierte Zeit einschalten
    • Am Ende die Schaltzustände aller Lampen, Heizer und CO2 ausgeben
    • Schaltzustand der „Health-LED“ ändern
    • Eine halbe Sekunde warten
    • Die Endlosschleife erneut starten


    Schritt 5 (optional): Test-Setup mit LEDs

    Wer sich ein Komplettset mit einem Breadboard zum Experimentieren gekauft hat, der kann dies mittels des Flachbandkabels anschließen und die GPIO-Ausgänge im Code (das sind GPIO 5,6,12,13,16,19,20, und 21) jeweils mit einer LED (Polung beachten) und 330 ohm Widerstand gegen Masse legen. Dann können wir sehen, welche Ausgänge gerade beschaltet sind (LED an). Auf diese Weise können wir das Programm erst mal im Testmodus laufen lassen und sehen, ob die Einstellungen, die wir vorgenommen haben, funktionieren, das Programm also das macht was wir wollen.

    Schritt 6: Programm starten

    Wir kopieren die Programmdatei ins Verzeichnis /home/pi.
    Dann öffnen wir ein Terminal und geben ein

    python Aquarium.py


    Mit angeschlossenem Temperatursensor und LEDs an den GPIOs startet unser Programm, gibt folgende Daten im 1-Sekunden-Takt aus und schaltet die entsprechenden LEDs.

    13:35
    Lampe 1 an
    Lampe 2 aus
    Lampe 3 aus
    CO2 an
    Temperatur 24.35 °C
    Bodenheizer an
    Stabheizer aus

    Stimmt irgendwas nicht? Dann mal die Parameter im Code prüfen und die Anschlüsse der LEDs, ob das alles richtig gesteckt ist.

    Schritt 7: Anschluss der Relaiszeile

    Um Leistung zu schalten, brauchen wir Relais, die die I/O-Signale des Pi für Verbaucher „nutzbar“ machen. Zum Anschluss der Sainsmart Relaiszeile, die wir hier verwenden, gibt es einen wahren Glaubenskrieg im Netz. Es gibt Leute, die sagen „einfach anschließen und geht“ und solche, die meinen, dass man seinen Raspi zerstört, wenn man das Board nicht über Treiber-Transistoren anschließt. Wirklich verwirrend….
    Was stimmt nun?

    Ich bin dem Beitrag eines Amazon-Kunden gefolgt, der das Board einfach mal wie folgt durchgemessen hat:
    Wenn wir es stand alone an 5V anschließen, passiert erst mal nix, kein Relais schaltet. Dann können wir mal die In-Pins gegen Masse messen, die zeigen 3.0 V (Raspi GPIOs 0 bzw. 3.3 V). Wenn wir dann über ein Amperemeter einen der In-Pins gegen Masse legen, zeigt das Instrument 1.9 mA, das entsprechende Relais schaltet durch und die LED des Eingangs leuchtet. 1.9 mA sind kein Strom, der einen I/O des Raspi zerstört, von daher droht also keine Gefahr.

    Jetzt bleibt noch die Stromversorgung des Boards. Jedes Relais zieht im durchgeschalteten Zustand ca. 90 mA, d.h. wenn alle 8 Relais schalten, zieht das Board ca. 720 mA, also nicht unerheblich Strom. Geht das über das Pi-Netzteil und die on-board Sicherung des Pi? Ich habe das Board einfach über die 5V-Pins des Pi angeschlossen und über mehrere Wochen so betrieben. Mein 2A-Netzteil ist nicht heiß geworden und auch mein Pi lebt noch.


    Daher: Versuch macht klug! Trauen wir doch unseren Beobachtungen. Bei mir funktioniert es fehlerfrei, die Relaiszeile direkt an den Pi anzuschließen. Hierzu sind die I/O-Kabel (weiblich-weiblich) da. 5V an VCC, GND an GND, die Pins IN1 bis IN8 des Relais-Boards mit den ausgewählten GPIO des Raspi verbinden, den Jumper VCCJD-VCC habe ich stecken lassen.

    Wie gesagt, wer Manschetten hat, die Relaiszeile direkt an den Pi zu stecken, der bemüht am Besten mal ein Messgerät und macht sich sein eigenes Bild.


    Nun sind die Eingänge der Relaiszeile invertiert, das heißt, wenn der Eingang auf Masse liegt, schaltet das Relais durch und die zugehörige LED auf dem Relaisboard geht an. Wie gehen wir damit um? Alle Relais sind Umschalter, d.h. wir können in jedem der Schaltzustände Durchgang verkabeln.

    Ich habe den Pi so programmiert und verkabelt, dass meine Verbraucher eingeschaltet sind, wenn das Relais durchgeschaltet hat, also die LED leuchtet und der Eingang auf Masse liegt. Das heißt, wenn ein Verbraucher eingeschaltet werden soll, legen wir den entsprechenden Pin auf Masse (GPIO auf „False“). Warum das am besten ist, klären wir gleich bei den Fehlerzuständen.

    Schritt 8: Fehlerzustände:

    Wenn alles „normal“ läuft, starten wir unser Programm, die Endlosschleife startet und läuft bis in alle Ewigkeit weiter. So die Theorie und der Normalzustand, aber in der Wirklichkeit müssen wir uns mit den Fehlerfällen und deren Auswirkungen beschäftigen, damit es nicht zu unangenehmen Überraschungen kommt.

    Was kann uns alles dazwischen kommen?

    • Ein kurzfristiger Stromausfall (hohe Wahrscheinlichkeit)

    Wenn das passiert, ist der Raspi, die Relaiszeile und alle Verbraucher aus.
    (Kein Wunder, ist ja kein Strom da….)
    Wenn der Strom wieder eingeschaltet wird, dann soll der Raspi aber wieder automatisch in den geordneten Betriebszustand zurückkehren und alles ein- und ausschalten wie es soll.
    Das beschreibe ich gleich noch, wie das geht

    • Das Netzteil des Pi (und damit auch der Relaiszeile) könnte sterben (mittlere Wahrscheinlichkeit)


    In diesem Fall müssen alle Verbraucher ausgeschaltet werden (d.h. wenn die Relais abfallen, müssen die Verbraucher AUS sein)
    Andernfalls bliebe die Heizung an, das Becken würde zu warm mit den entsprechenden Folgen. Außerdem würde sich der komplette Tagesdünger und Nachfüllvorrat in den Kanistern ins Becken entleeren. Das dauerhaft brennende Licht würde den Pflanzen auch auf Dauer nicht gut tun, richtet aber keinen kurzfristigen Schaden an.

    • Die Relaiszeile als Ganzes könnte sterben (mittlere Wahrscheinlichkeit)

    In diesem Fall gilt das Gleiche wie beim Ausfall des Netzteils des Pi.

    • Der Pi könnte „durchdrehen“ wg. Programmfehler (geringe Wahrscheinlichkeit)

    In diesem Fall würde unkontrolliert geschaltet.
    Wg. des eher einfachen Programms ist dies nicht wirklich zu erwarten.

    • Ein Relais könnte im Einschaltzustand kleben (geringe Wahrscheinlichkeit)

    Wirklich desaströs wäre das nur beim Stabheizer und vielleicht noch beim Tagesdünger.
    Den Stabheizer fangen wir ab, indem wir den mechanischen Thermostat im Heizer etwas höher als unsere im Pi eingestellten Werte setzen, also z.B. auf 26 °. Eben so, dass er im Normalbetrieb nicht in die Regelung eingreift. Das wäre dann die „Notbremse“ für den Heizer bei klebendem Relais.
    Das Becken sollte auch so befüllt sein, dass es notfalls noch den gesamten Vorrat aus Nachfüllbehälter und Tagesdünger aufnehmen kann, ohne überzulaufen. (so 10 l Platz lassen).
    Ein klebendes Relais kann im Übrigen auch bei Zeitschaltuhren und elektrischen Thermostaten auftreten, hier unterscheidet sich unsere Pi-Lösung vom Fehlerrisiko nicht von der konventionellen aus Einzelkomponenten.

    Hier sehen wir aber, das wir alles so programmieren müssen, dass bei sterbendem Pi-Netzteil und/oder Relaiszeile die Verbraucher nicht auf Dauer-Ein geschaltet werden (D.H. GPIO auf low bedeutet Relais durchgeschaltet). 100 % Sicherheit gibt es nicht, aber wir stellen uns so auf, dass die wahrscheinlichsten Fälle korrekt abgefangen sind.

    (Es sei nicht verschwiegen, dass eine Transistor-Treiberstufe vor der Relaiszeile auch die Invertierung dreht, dann wäre bei GPIO True (=high) auch das Relais durchgeschaltet. Das würde einen sterbenden Pi bei gleichzeitig noch lebender Relaiszeile noch besser abfangen. Aber dann dürfen wir auch die Transistorstufe nicht auf dem Steckbrett zusammenstöpseln, das wären m.E. zu viele wackelige Kontaktstellen.)

    Schritt 9: Automatischer Reboot

    Um sicherzustellen, dass wir nach unfreiwilligem Reboot nach einem Stromausfall wieder im Programm landen, habe ich die Variante über einen Eintrag in die Datei /etc/rc.local gewählt
    Ist hier beschrieben:

    https://raspberry.tips/raspberrypi-ei…men-einrichten/

    Dort trägt man am Ende der Datei vor „exit 0“ ein:

    python /home/pi/Aquarium.py

    Wenn man jetzt den Pi kurz vom Stromnetz trennt, bootet er nach dem Wiederherstellen der Stromversorgung direkt wieder in unser Programm. Das Booten dauert ca. 30 sec, d.h. während dieser 30 sec. sind unsere GPIOs nicht wirklich in definiertem Zustand. Ich habe beobachtet, dass die LEDs der Relaiszeile so leicht glimmen, aber die Relais nicht durchgeschaltet sind. Die GPIOs sind also in einem undefinierten Zustand, die Relais alle „Aus“. Das ist erst mal gut, aber auch wenn es nicht so wäre, in 30 sec. beim Reboot passiert nicht viel Unheil, wenn wir dann sicher in einem definiertem Zustand im Programm landen.

    Vermouthstropfen dieser Lösung: Das Programm startet bevor die graphische Benutzeroberfläche geladen ist, d.h. wir erhalten keinen Output im Terminal. Unsere „Health-LEDs“ geben aber Auskunft, ob alles OK ist.
    Ich denke, das ist verschmerzbar, wenn wir uns wirklich einloggen und den Output verfolgen wollen und wir stellen fest, dass offenbar ein automatischer Reboot stattfand, machen wir das über die Kommandos:

    sudo killall python
    python Aquarium.py

    Dann sind wir wieder im Terminal unterwegs und erhalten jede Sekunde die Schaltzustände und Temperatur gedruckt.
    Aber Hand aufs Herz: Wir wollen ja einen AUTOMATEN, der unser Becken steuert, und da wollen wir ja (nach einer Einlaufphase) nicht jeden Tag 20 x schauen, ob alles läuft, oder?.
    Im Normalfall starten wir das Programm im Terminal, wenn es keinen Output mehr gibt, dann war da ein Störfall dazwischen.

    Schritt 10: Ansprechen des Pi über VNC

    Wenn der Pi in unserem Heimnetz angemeldet ist, können wir ihn von jedem Rechner (egal ob Windows, Mac, Tablet oder Smartphone oder Linux) über VNC ansprechen und Parameter ändern. Dazu installiert man sich den VNC-Server auf dem Pi und einen VNC-Client auf dem Rechner, mit dem man den Pi ansprechen will. VNC clients gibt es für alle o.g. Geräte. Wie das geht, ist sehr gut hier beschrieben:

    http://www.codeclinic.de/de/2014/01/ras…richten-teil-1/

    Schritt 11: Inbetriebnahme am Aquarium

    So, wenn alles oben Beschriebene funktioniert und eine Weile im Test auf dem Tisch gelaufen ist, ist es soweit, die Steuerung kann an der echten Hardware am Aquarium installiert werden. Hierzu müssen wir die Komponenten noch in einem Gehäuse oder auf einer Montageplatte montieren und sauber verkabeln Wie gesagt, Vorsicht mit 230 V, sauber arbeiten oder vom Fachmann helfen lassen!
    Wenn wir das Programm im Terminal starten wollen stoppen wir das automatisch im Hintergrund gestartete und starten es im Terminal neu (s.o. Schritt 9)

    Schritt 12: Erweiterung

    Jetzt seid Ihr dran. Die Basics funktionieren, und nun können weitere Ideen hinzukommen. Wichtig war mir, erst mal die Grundfunktionen eines Aquarien-Pi erfolgreich zum Laufen zu bringen. Der Pi ist damit nicht mal zu 2 % seiner Rechenleistung ausgelastet. Also, was immer Euch einfällt, setzt es um!

    Am Ende: Der Code hängt als Datei an

    Viel Spaß, wenn Ihr Euch entschließt, das nachzubauen!

    Einfacher Aquariencomputer mit Raspberry Pi

    Warum beschreibe ich dieses Projekt? Es gibt doch schon reichlich Anleitungen für Aquarien-computer mit Raspberry Pi!


    Viele der Projekte steigen mit sehr hohen Anforderungen ein. Da soll dann Licht, Temperatur, Heizung, Leitwert, ph-Wert, CO2-Gehalt, Wasserstand, Luftdruck usw. kontrolliert, graphisch aufbereitet, ins Netz gestellt und auf dem Handy per Schieberegler eingestellt werden, natürlich Webcam usw., um nur einiges zu nennen.Auch wenn so ein Pi das wahrscheinlich von seinen Möglichkeiten her locker kann, brechen doch viele der so gestarteten Projekte nach 3 bis 4 Posts ab, weil die Wünsche eben doch größer waren, die Zeit und das Durchhaltevermögen, die nötig sind, um so ein Projekt fertig zu stellen.

    Solche Posts sind frustrierend, und viele interessierte Aquarianer wenden sich vermutlich abgeschreckt ab, weil ihnen so ein Projekt zu kompliziert erscheint. Dabei ist es gar nicht so schwer, einen funktionierenden Anfang zu setzen, auf dem man später aufbauen kann.

    In diesem Beitrag möchte ich ein Aquarienprojekt beschreiben, das auch normal versierte Bastler in überschaubarer Zeit fertigstellen können. Die funktionierende Anlage kann dann natürlich beliebig erweitert werden. Aber wir haben erst mal etwas, das funktioniert!

    Diese Anleitung ist sicher nicht der einzig mögliche oder auch nicht der optimale Weg. Vermutlich gibt es viele Möglichkeiten das anders, besser, vielleicht einfacher zu machen als ich das getan habe, das steht auch nicht im Vordergrund. Ziel war es, einen vernünftigen Funktionsumfang mit überschaubaren Mitteln und in überschaubarer Zeit umzusetzen und das Projekt abzuschließen. Dies Projekt ist nicht nur eine Idee oder ein Wunsch, sondern wurde in überschaubarer Zeit erfolgreich umgesetzt und funktioniert.

    Was soll das Projekt können?

    Wichtig ist immer erst mal, dass wir uns darüber klar werden, was wir am Ende wollen. Wir könnten uns z.B. die Basisanforderungen einer Aquariensteuerung vornehmen:


    3 Lampen unabhängig voneinander ein- und ausschaltenEine Temperaturregelung mit Boden- und Stabheizer darstellen CO2-Zufuhr ein- und ausschaltenEine Dosierpumpe mit Tagesdünger schaltenEine Pumpe für eine Nachfüllautomatik schalten(Futterautomaten klammern wir mal aus, da diese Geräte i.d.R. bereits mit Steuerung kommen, sonst wäre das auch eine Anforderung)

    Daneben wollen wir die Steuerung über externe Computer oder Tablet/Smartphone im Heimnetz ansprechen können (soll kein eigenes Keyboard und Display benötigen).

    Die Steuerung muss fehlersicher sein, d.h. zum Beispiel, dass sie nach einem Stromausfall automatisch wieder in einen stabilen Betriebszustand findet.

    Und wir wollen den „Gesundheitszustand“ der Steuerung im Vorbeigehen erkennen können, ohne dass wir an einem PC einloggt sein müssen (Visuelle Rückmeldung: Steuerungsprogramm läuft und Temperatur ist im Zielbereich).

    Ein so ausgestattetes Becken darf man sicher als technisch auf einem guten Stand bezeichnen. Natürlich kann man so etwas auch mit diskreten Komponenten (einzelnen Zeitschaltuhren und Thermostaten) darstellen, aber eine Pi-Lösung ist am Ende billiger, eleganter und erweiterungsfähig (und macht auch mehr Spaß).


    Was brauchen wir an Material?


    Raspberry Pi (ich habe einen Pi-2), am besten mit GehäuseNetzteil 5V, min 2AEinen USB-WLAN-AdapterEin Adapterkabel HDMI auf DVI (nur nötig, wenn Euer Monitor keinen HDMI-Eingang hat)Eine micro SD-Karte, 8 GB oder mehrEine 8-fach Relais-Zeile von Sainsmart (oder Nachbau)Einen Temperatursensor DS1820 + einen 4.7 kohm WiderstandEinen Satz I/O-Kabel (Stecker weiblich-weiblich)Ein paar LEDs und 330 ohm Widerstände

    Für den Pi gibt es Sets, die alles obige bis auf den Temperatursensor, die Relaiszeile und die I/O-Kabel beinhalten für ca. 70 € im Netz zu kaufen. Alle anderen genannten Teile gibt es ebenfalls beim großen Versandhändler. Abhängig davon, wie lange man warten kann, kommen die Relaiszeile und die T-Sensoren direkt aus China oder aus Europa. Alles zusammen sollte aber für 75 – 90 € zu beschaffen sein.

    Keyboard und Maus setzen wir mal als vorhanden voraus, brauchen wir, ebenso wie das Monitorkabel auch nicht dauerhaft am Pi.


    Was brauchen wir an Werkzeug?

    Ein Lötkolben und Schrumpfschlauch ist hilfreich beim Konfektionieren des T-Sensors oder von Kontroll-LEDs.

    Ein Vielfach-Messgerät wäre gut.

    Daneben das übliche Bastelwerkzeug, Zangen Schraubenzieher etc.


    Welche Kenntnisse sind nötig?

    Um dies Projekt erfolgreich fertig zu stellen, muss man kein Hacker sein, aber man muss sich an neue Dinge herantrauen. Etwas Erfahrung mit Linux ist hilfreich, ebenso darf man keine Angst vor einer Konsole und einigen Terminal-Befehlen haben. Der Python-Code, den ich hier veröffentliche, funktioniert erst mal, aber wenn man ihn für eigene Bedürfnisse anpassen will, dann muss man sich etwas mit der Programmiersprache Python beschäftigen. Ich werde hier natürlich auch nicht alles nochmals beschreiben, was bei der Inbetriebnahme und Konfiguration eines Raspi schon zig mal im Netz steht, aber ich werde die Links zitieren, die bei MIR funktioniert haben (es gibt leider auch ziemlich viel Zeug im Netz, das zumindest mal nicht aktuell ist).

    Etwas Vertrautheit mit Elektronik und einem Lötkolben hilft definitiv. Sonst kann das schwer werden, z.B. den Sensor zu konfektionieren. Und wer am Ende 230 V-Verbraucher an seine Relaiszeile anschließt, muss auf jeden Fall wissen, was er tut! 230 V sind genug, um sich daran ernsthaft zu verletzen oder schlimmeres. Hierzu kann ich nicht mal eben in 5 Zeilen eine Anleitung schreiben. Da muss sich jeder selbst einschätzen, ob er das kann. Im Zweifel immer einen Fachmann befragen!


    Schritt 1: Raspi aufsetzen und starten

    Dies ist im Netz hinreichend beschrieben. Ich habe Raspbian als Betriebssystem benutzt. Als Sofortmaßnahme muss man den Mouse-Lag beseitigen, damit man arbeiten kann, Die ersten Gehversuche habe ich mit dem Raspi mit angeschlossenem Monitor und Keyboard gemacht, später habe ich über VNC auf den Raspi zugegriffen. Zum Modifizieren des Codes benutzen wir Idle3, das bereits im Raspbian vorinstalliert ist.


    Schritt 2: Raspi an den Router anbinden

    Das ist aus zwei Gründen wichtig. Zum einen holt sich der Raspi selber die aktuelle Uhrzeit aus dem Netz und zum zweiten wollen wir ihn später über VNC remote ansprechen. Also erst mal dafür sorgen, dass der Raspi über Kabel oder den WLAN-Stick am Router angemeldet ist. Dann im Betriebssystem die korrekte Zeitzone einstellen, damit localtime uns später die korrekte Zeit im Programm liefert.


    Schritt 3: Temperatursensor konfektionieren und anschließen

    Der Anschluss eines DS1820 ist hier

    sehr gut erklärt. Ich habe den Sensor mit Schrumpfschlauch geschützt. Zur Temperaturmessung im Aquarium wird er dann einfach mit Tesafilm von außen an die Scheibe geklebt und auf der Rückseite mit etwas Schaumfolie isoliert, damit er nur (oder weit überwiegend) von der Temperatur im Becken beeinflusst wird. Wir schließen den Sensor korrekt an und nehmen die Einträge in den Dateien im Betriebssystem so vor, wie im Link oben beschrieben. Wer der Beschreibung im Link gefolgt ist, der weiß dann auch bereits, ob sein Sensor korrekt angesprochen wird.


    Schritt 4 : Sich mit dem Python Code vertraut machen, Schaltzeiten und Temperaturschwellen einstellen.

    Das Programm befindet sich in der angehängten Datei „Aquarium.py“ und ist vollständig kommentiert, sollte also in weiten Bereichen selbsterklärend sein. Welcher GPIO für welche Funktion zuständig ist, steht alles im Source file.

    Was macht das Programm?

    Licht:

    Es sind 3 Lampen vorgesehen. Für jede Lampe sind aktuell 2 Schaltintervalle definiert, d.h. man kann z.B. morgens x Stunden beleuchten, dann eine Pause von einigen Stunden machen und abends wieder für y Stunden beleuchten. Wenn man nur eine Beleuchtungsphase haben will, einfach beide Intervalle gleich einstellen.

    CO2:

    Für das CO2 gilt das Gleiche wie für das Licht, wir schalten ja mit 230 V ein Magnetventil.

    Heizung:

    Für die Heizer werden Schwelltemperaturwerte mit einer Hysterese von ca. 0.3 °C eingestellt, also z.B.


    Heizer an , wenn kälter als 24.0 °CHeizer aus, wenn wärmer als 24.3 °C

    Für den Stabheizer werden die Schaltschwellen ca. 0.2 ° tiefer eingestellt als für den Bodenheizer. Meist ist der Bodenheizer viel schwächer und nicht in der Lage, die Heizung komplett zu übernehmen. Er soll aber immer an sein (wenn es nicht insgesamt zu warm ist). Fällt die Temperatur weiter, obwohl der Bodenheizer an ist, wird der Stabheizer zugeschaltet. Er wird wieder ausgeschaltet, bevor der Bodenheizer seine Abschaltschwelle erreicht, übernimmt also weitgehend die eigentliche Temperaturregelung, während der Bodenheizer immer an ist, aber bei zu hoher Temperatur (beispielsweise im Sommer) natürlich ebenfalls automatisch ausgeschaltet wird.

    Temperatur-Anzeige

    Es werden dazu Temperatur-Warnschwellen definiert. Befindet sich die Temperatur innerhalb der Warnschwellen, wird mittels GPIO 5 eine LED eingeschaltet, ist die Temperatur außerhalb der Warnschwellen, wir die LED ausgeschaltet. Laufen wir am Pi vorbei, können wir also ohne weitere Info anhand der LED sehen, ob die Temperatur in Ordnung ist. Leuchtet sie, ist alles klar, leuchtet sie nicht, müssen wir nachsehen, was los ist. Idealerweise sind die Warnschwellen 0.1°größer/kleiner als die größten/kleinsten Schaltschwellen der Heizer.

    Natürlich werden im Terminal des Pi die aktuellen Temperaturwerte ausgegeben, aber wir gehen davon aus, das nicht ständig ein Display angeschlossen ist, und der Regler soll das auch hinbekommen, ohne dass wir alle 5 Minuten auf ein Display schauen müssen.

    Tagesdünger:

    Einmal am Tag können wir zu einer einstellbaren Zeit eine Dosierpumpe für x (einstellbar) Sekunden einschalten, um Tagesdünger aus einem Kanister zu dosieren.

    Bau der Dosierpumpe ist hier beschrieben


    Nachfüllen:

    Einmal am Tag können wir zu einer einstellbaren Zeit eine Nachfüllpumpe für y (einstellbar) Sekunden einschalten, um verdunstetes Wasser aus einem Kanister zu dosieren.

    Bau der Nachfüllpumpe ist an gleicher Stelle wie die Dosierpumpe beschrieben.

    Ungenutzte Ausgänge:

    Wer kein CO2, bzw. keine Tagesdüngung und Nachfüllung nutzt, kann die Ausgänge einfach ins Leere laufen lassen oder für andere Dinge nutzen (Futterautomat,…)


    Läuft unser Programm?

    Das Programm läuft in einer Endlosschleife mit einer Zykluszeit von ca. 1 sec. Wir wollen natürlich auch im Vorbeigehen sehen können, ob unser Pi „lebt“, d.h. sein Programm brav abarbeitet.

    Das lösen wir dadurch, dass wir mit jedem Schleifendurchlauf eine LED (GPIO 5) an- und ausschalten. Läuft unsere Schleife ordnungsgemäß, blinkt diese LED gleichmäßig mit einer Periode von ca. 1 sec. Läuft unser Programm nicht, blinkt sie nicht. Diese LED ist also ein „health indicator“, ob unser Programm ordnungsgemäß zykelt, ohne dass wir uns dazu auf dem Pi einloggen müssen.


    Festlegen der Schaltzeiten und Temperaturschwellen etc.:

    Alle Variablen werden im Programm „fest“ im Code vorgegeben. Wenn wir sie ändern wollen, wird der Python Code in der Datei Aquarium.py geändert. Nicht sehr elegant? OK, wie oft wollen wir an einem eingelaufenen Becken an diesen Variablen spielen…..? Für den Start ist das m.E komfortabel genug.


    Programmablauf:

    Am Anfang werden die GPIOs definiert und die Variablen gesetzt bzw. initialisiert.

    Danach geht es in eine Endlosschleife, in der folgendes passiert:


    Abfrage, ob die aktuelle Uhrzeit in einem definierten „Ein-Fenster“ liegtWenn ja, Lampe bzw. CO2 einschaltenWenn nein, Lampe bzw. CO2 ausschaltenVariable für den Ausgang dem Schaltzustand entsprechend setzenTemperatur von Sensor auslesenMit den gesetzten Temperaturgrenzen für Boden- und Stabheizer vergleichenWenn zu warm oder zu kalt, Heizer aus- oder einschaltenVariablen mit Schaltzustand entsprechend setzenPrüfung, ob Temperatur im ZielbereichSetzen/Ausschalten der LED für „Temperatur = OK“Abfrage, ob Uhrzeit für Dosierung des Tagesdüngers erreichtWenn ja, Dosierpumpe für die definierte Zeit einschaltenAbfrage, ob die Uhrzeit für die Nachfüllung erreichtWenn ja, Nachfüllpumpe für die definierte Zeit einschaltenAm Ende die Schaltzustände aller Lampen, Heizer und CO2 ausgebenSchaltzustand der „Health-LED“ ändernEine 1/10 Sekunde wartenDie Endlosschleife erneut starten


    Schritt 5 (optional): Test-Setup mit LEDs

    Wer sich ein Komplettset mit einem Breadboard zum Experimentieren gekauft hat, der kann dies mittels des Flachbandkabels anschließen und die GPIO-Ausgänge im Code (das sind GPIO 5,6,12,13,16,19,20, und 21) jeweils mit einer LED (Polung beachten) und 330 ohm Widerstand gegen Masse legen. Dann können wir sehen, welche Ausgänge gerade beschaltet sind (LED an). Auf diese Weise können wir das Programm erst mal im Testmodus laufen lassen und sehen, ob die Einstellungen, die wir vorgenommen haben, funktionieren, das Programm also das macht was wir wollen.


    Schritt 6: Programm starten

    Wir kopieren die Programmdatei ins Verzeichnis /home/pi.

    Dann öffnen wir ein Terminal und geben ein

    python Aquarium.py

    Mit angeschlossenem Temperatursensor und LEDs an den GPIOs startet unser Programm, gibt folgende Daten im 1-Sekunden-Takt aus und schaltet die entsprechenden LEDs.

    13:35

    Lampe 1 an

    Lampe 2 aus

    Lampe 3 aus

    CO2 an

    Temperatur 24.35 °C

    Bodenheizer an

    Stabheizer aus


    Stimmt irgendwas nicht? Dann mal die Parameter im Code prüfen und die Anschlüsse der LEDs, ob das alles richtig gesteckt ist.


    Schritt 7: Anschluss der Relaiszeile

    Um Leistung zu schalten, brauchen wir Relais, die die I/O-Signale des Pi für Verbaucher „nutzbar“ machen. Zum Anschluss der Sainsmart Relaiszeile, die wir hier verwenden, gibt es einen wahren Glaubenskrieg im Netz. Es gibt Leute, die sagen „einfach anschließen und geht“ und solche, die meinen, dass man seinen Raspi zerstört, wenn man das Board nicht über Treiber-Transistoren anschließt. Wirklich verwirrend….

    Was stimmt nun?

    Ich bin dem Beitrag eines Amazon-Kunden gefolgt, der das Board einfach mal wie folgt durchgemessen hat:

    Wenn wir es stand alone an 5V anschließen, passiert erst mal nix, kein Relais schaltet. Dann können wir mal die In-Pins gegen Masse messen, die zeigen 3.0 V (Raspi GPIOs 0 bzw. 3.3 V). Wenn wir dann über ein Amperemeter einen der In-Pins gegen Masse legen, zeigt das Instrument 1.9 mA, das entsprechende Relais schaltet durch und die LED des Eingangs leuchtet. 1.9 mA sind kein Strom, der einen I/O des Raspi zerstört, von daher droht also keine Gefahr.

    Jetzt bleibt noch die Stromversorgung des Boards. Jedes Relais zieht im durchgeschalteten Zustand ca. 90 mA, d.h. wenn alle 8 Relais schalten, zieht das Board ca. 720 mA, also nicht unerheblich Strom. Geht das über das Pi-Netzteil und die on-board Sicherung des Pi? Ich habe das Board einfach über die 5V-Pins des Pi angeschlossen und über mehrere Wochen so betrieben. Mein 2A-Netzteil ist nicht heiß geworden und auch mein Pi lebt noch.

    Daher: Versuch macht klug! Trauen wir doch unseren Beobachtungen. Bei mir funktioniert es fehlerfrei, die Relaiszeile direkt an den Pi anzuschließen. Hierzu sind die I/O-Kabel (weiblich-weiblich) da. 5V an VCC, GND an GND, die Pins IN1 bis IN8 des Relais-Boards mit den ausgewählten GPIO des Raspi verbinden, den Jumper VCCJD-VCC habe ich stecken lassen.

    Wie gesagt, wer Manschetten hat, die Relaiszeile direkt an den Pi zu stecken, der bemüht am Besten mal ein Messgerät und macht sich sein eigenes Bild.

    Nun sind die Eingänge der Relaiszeile invertiert, das heißt, wenn der Eingang auf Masse liegt, schaltet das Relais durch und die zugehörige LED auf dem Relaisboard geht an. Wie gehen wir damit um? Alle Relais sind Umschalter, d.h. wir können in jedem der Schaltzustände Durchgang verkabeln.

    Ich habe den Pi so programmiert und verkabelt, dass meine Verbraucher eingeschaltet sind, wenn das Relais durchgeschaltet hat, also die LED leuchtet und der Eingang auf Masse liegt. Das heißt, wenn ein Verbraucher eingeschaltet werden soll, legen wir den entsprechenden Pin auf Masse (GPIO auf „False“). Warum das am besten ist, klären wir gleich bei den Fehlerzuständen.


    Schritt 8: Fehlerzustände:

    Wenn alles „normal“ läuft, starten wir unser Programm, die Endlosschleife startet und läuft bis in alle Ewigkeit weiter. So die Theorie und der Normalzustand, aber in der Wirklichkeit müssen wir uns mit den Fehlerfällen und deren Auswirkungen beschäftigen, damit es nicht zu unangenehmen Überraschungen kommt.

    Was kann uns alles dazwischen kommen?


    Ein kurzfristiger Stromausfall (hohe Wahrscheinlichkeit)Wenn das passiert, ist der Raspi, die Relaiszeile und alle Verbraucher aus. (Kein Wunder, ist ja kein Strom da….)Wenn der Strom wieder eingeschaltet wird, dann soll der Raspi aber wieder automatisch in den geordneten Betriebszustand zurückkehren und alles ein- und ausschalten wie es soll.Das beschreibe ich gleich noch, wie das gehtDas Netzteil des Pi (und damit auch der Relaiszeile) könnte sterben (mittlere Wahrscheinlichkeit)In diesem Fall müssen alle Verbraucher ausgeschaltet werden (d.h. wenn die Relais abfallen, müssen die Verbraucher AUS sein)Andernfalls bliebe die Heizung an, das Becken würde zu warm mit den entsprechenden Folgen. Außerdem würde sich der komplette Tagesdünger und Nachfüllvorrat in den Kanistern ins Becken entleeren. Das dauerhaft brennende Licht würde den Pflanzen auch auf Dauer nicht gut tun, richtet aber keinen kurzfristigen Schaden an.Die Relaiszeile als Ganzes könnte sterben (mittlere Wahrscheinlichkeit)In diesem Fall gilt das Gleiche wie beim Ausfall des Netzteils des Pi. Der Pi könnte „durchdrehen“ wg. Programmfehler (geringe Wahrscheinlichkeit)In diesem Fall würde unkontrolliert geschaltet.Wg. des eher einfachen Programms ist dies nicht wirklich zu erwarten.Ein Relais könnte im Einschaltzustand kleben (geringe Wahrscheinlichkeit)Wirklich desaströs wäre das nur beim Stabheizer und vielleicht noch beim Tagesdünger.Den Stabheizer fangen wir ab, indem wir den mechanischen Thermostat im Heizer etwas höher als unsere im Pi eingestellten Werte setzen, also z.B. auf 26 °. Eben so, dass er im Normalbetrieb nicht in die Regelung eingreift. Das wäre dann die „Notbremse“ für den Heizer bei klebendem Relais.Das Becken sollte auch so befüllt sein, dass es notfalls noch den gesamten Vorrat aus Nachfüllbehälter und Tagesdünger aufnehmen kann, ohne überzulaufen. (so 10 l Platz lassen).Ein klebendes Relais kann im Übrigen auch bei Zeitschaltuhren und elektrischen Thermostaten auftreten, hier unterscheidet sich unsere Pi-Lösung vom Fehlerrisiko nicht von der konventionellen aus Einzelkomponenten.

    Hier sehen wir aber, das wir alles so programmieren müssen, dass bei sterbendem Pi-Netzteil und/oder Relaiszeile die Verbraucher nicht auf Dauer-Ein geschaltet werden (D.H. GPIO auf low bedeutet Relais durchgeschaltet). 100 % Sicherheit gibt es nicht, aber wir stellen uns so auf, dass die wahrscheinlichsten Fälle korrekt abgefangen sind.

    (Es sei nicht verschwiegen, dass eine Transistor-Treiberstufe vor der Relaiszeile auch die Invertierung dreht, dann wäre bei GPIO True (=high) auch das Relais durchgeschaltet. Das würde einen sterbenden Pi bei gleichzeitig noch lebender Relaiszeile noch besser abfangen. Aber dann dürfen wir auch die Transistorstufe nicht auf dem Steckbrett zusammenstöpseln, das wären m.E. zu viele wackelige Kontaktstellen.)


    Schritt 9: Automatischer Reboot

    Um sicherzustellen, dass wir nach unfreiwilligem Reboot nach einem Stromausfall wieder im Programm landen, habe ich die Variante über einen Eintrag in die Datei /etc/rc.local gewählt.

    Ist hier beschrieben:


    Dort trägt man am Ende der Datei vor „exit 0“ ein:

    python /home/pi/Aquarium.py

    Wenn man jetzt den Pi kurz vom Stromnetz trennt, bootet er nach dem Wiederherstellen der Stromversorgung direkt wieder in unser Programm. Das Booten dauert ca. 30 sec, d.h. während dieser 30 sec. sind unsere GPIOs nicht wirklich in definiertem Zustand. Ich habe beobachtet, dass die LEDs der Relaiszeile so leicht glimmen, aber die Relais nicht durchgeschaltet sind. Die GPIOs sind also in einem undefinierten Zustand, die Relais alle „Aus“. Das ist erst mal gut, aber auch wenn es nicht so wäre, in 30 sec. beim Reboot passiert nicht viel Unheil, wenn wir dann sicher in einem definiertem Zustand im Programm landen.

    Vermoutstropfen dieser Lösung: Das Programm startet bevor die graphische Benutzeroberfläche geladen ist, d.h. wir erhalten keinen Output im Terminal. Unsere „Health-LEDs“ geben aber Auskunft, ob alles OK ist.

    Ich denke, das ist verschmerzbar, wenn wir uns wirklich einloggen und den Output verfolgen wollen und wir stellen fest, dass offenbar ein automatischer Reboot stattfand, machen wir das über die Kommandos:

    sudo killall python

    python Aquarium.py

    Dann sind wir wieder im Terminal unterwegs und erhalten jede Sekunde die Schaltzustände und Temperatur gedruckt.

    Aber Hand aufs Herz: Wir wollen ja einen AUTOMATEN, der unser Becken steuert, und da wollen wir ja (nach einer Einlaufphase) nicht jeden Tag 20 x schauen, ob alles läuft, oder?.

    Im Normalfall starten wir das Programm im Terminal, wenn es keinen Output mehr gibt, dann war da ein Störfall dazwischen.


    Schritt 10: Ansprechen des Pi über VNC

    Wenn der Pi in unserem Heimnetz angemeldet ist, können wir ihn von jedem Rechner (egal ob Windows, Mac, Tablet oder Smartphone oder Linux) über VNC ansprechen und Parameter ändern. Dazu installiert man sich den VNC-Server auf dem Pi und einen VNC-Client auf dem Rechner, mit dem man den Pi ansprechen will. VNC clients gibt es für alle o.g. Geräte. Wie das geht, ist sehr gut hier beschrieben:


    Schritt 11: Inbetriebnahme am Aquarium

    So, wenn alles oben Beschriebene funktioniert und eine Weile im Test auf dem Tisch gelaufen ist, ist es soweit, die Steuerung kann an der echten Hardware am Aquarium installiert werden. Hierzu müssen wir die Komponenten noch in einem Gehäuse oder auf einer Montageplatte montieren und sauber verkabeln Wie gesagt, Vorsicht mit 230 V, sauber arbeiten oder vom Fachmann helfen lassen!

    Wenn wir das Programm im Terminal starten wollen stoppen wir das automatisch im Hintergrund gestartete und starten es im Terminal neu (s.o. Schritt 9)


    Schritt 12: Erweiterung

    Jetzt seid Ihr dran. Die Basics funktionieren, und nun können weitere Ideen hinzukommen. Wichtig war mir, erst mal die Grundfunktionen eines Aquarien-Pi erfolgreich zum Laufen zu bringen. Der Pi ist damit nicht mal zu 2 % seiner Rechenleistung ausgelastet. Also, was immer Euch einfällt, setzt es um!


    Hier der Code (hängt auch noch als Datei an):

    """
    **************************************************************************
    V24
    Aquariensteuerung Lampen/CO2/Tagesdünger/Nachfuellen/Temperatur
    Abends und Morgens
    ==> Aus-an-Zeiten selber einstellbar
    Zeit Variablen muessen im Format hh:mm angeben werden !!!!
    Nachfuell-Zeiten muessen min. 5 Minuten auseinander liegen!


    *************************** Variablen ******************************

    Lampe1 = Boolean, Schaltzustand Lampe1
    Lampe2 = Boolean, Schaltzustand Lampe2
    Lampe3 = Boolean, Schaltzustand Lampe3
    CO2 = Boolean, Schaltzustand CO2
    Duengerpumpe = Boolean, Schaltzustand Tagesduengerpumpe
    Fuellpumpe = Boolean, Schaltzustand Nachfuellpumpe
    Bodenheizer = Boolean, Schaltzustand Bodenheizer
    Stabheizer = Boolean, Schaltzustand Stabheizer
    alive = Boolean, Anzeige, dass Programm läuft

    m1 = Einschaltzeit morgens Lampe 1
    m2 = Ausschaltzeit morgens Lampe 1
    m3 = Einschaltzeit morgens Lampe 2
    m4 = Ausschaltzeit morgens Lampe 2
    m5 = Einschaltzeit morgens Lampe 3
    m6 = Ausschaltzeit morgens Lampe 3
    m7 = Einschaltzeit morgens CO2
    m8 = Ausschaltzeit morgens Co2

    a1 = Einschaltzeit abends Lampe 1
    a2 = Ausschaltzeit abends Lampe 1
    a3 = Einschaltzeit abends Lampe 2
    a4 = Ausschaltzeit abends Lampe 2
    a5 = Einschaltzeit abends Lampe 3
    a6 = Ausschaltzeit abends Lampe 3
    a7 = Einschaltzeit abends CO2
    a8 = Ausschaltzeit abends Co2


    Duengen = Zeitpunkt für Tagesduenger
    Nachfuellen = Zeitpunkt für Nachfuellen

    s1 = Dauer Doesierung Tagesduenger in sec
    s2 = Dauer Nachfuellen ins sec

    temp = Temperaur in °C

    BHL = Bodenheizer Low (ein)
    BHH = Bodenheizer High (aus)

    SHL = Stabheizer Low (ein)
    SHH = Stabheizer High (aus)

    TWH = Temperatur-Warnlevel High
    TWL = Temperatur-Warnlever Low

    ************************ Ende Variablen ******************************

    """

    # ******************** Importierte Module *****************************


    import RPi.GPIO as GPIO
    from time import *
    # from time import localtime
    import sys
    import os

    #import time

    # ******************* Definieren der GPIOs ***************************


    GPIO.setwarnings(False)
    GPIO.setmode(GPIO.BCM)
    GPIO.setup(13, GPIO.OUT) # Lampe1
    GPIO.setup(16, GPIO.OUT) # Lampe2
    GPIO.setup(19, GPIO.OUT) # Lampe3
    GPIO.setup(20, GPIO.OUT) # CO2
    GPIO.setup(21, GPIO.OUT) # Tagesduenger
    GPIO.setup(26, GPIO.OUT) # Nachfuellen
    GPIO.setup(12, GPIO.OUT) # Bodenheizer
    GPIO.setup(6, GPIO.OUT) # Stabheizer
    GPIO.setup(5, GPIO.OUT) # Alive
    GPIO.setup(7, GPIO.OUT) # Temperatur out of range


    # ****************** Beginn Einstellparameter **************************

    # Ein- und Ausschaltzeiten der Lampen

    #Lampe 1
    m1 = "10:0"
    m2 = "14:00"

    #Lampe 2
    m3 = "10:30"
    m4 = "13:30"

    #Lampe 3
    m5 = "11:00"
    m6 = "13:00"

    #CO2
    m7 = "08:00"
    m8 = "21:00"

    #Lampe 1
    a1 = "18:00"
    a2 = "22:00"

    #Lampe 2
    a3 = "18:30"
    a4 = "21:30"

    #Lampe 3
    a5 = "19:00"
    a6 = "21:00"

    #CO2
    a7 = "08:00"
    a8 = "21:00"

    # Tagesduenger
    s1 = 10
    Duengen = "08:00"

    # Nachfuellen
    s2 = 59
    Nachfuellen = "09:00"

    # Temperatur-Schaltpunkte

    BHL = 22.2 # Bodenheizer Low (ein)
    BHH = 22.5 # Bodenheizer High (aus)

    SHL = 21.9 # Stabheizer Low (ein)
    SHH = 22.3 # Stabheizer High (aus)

    TWH = 22.7 # Warnlevel Temperatur High
    TWL = 21.7 # Warnlevel Temperatur Low


    # ************************ Ende Einstellparameter *******************************


    # ************************ Beginn Programm **************************************

    # Initialisieren aller Ausgaenge auf AUS

    GPIO.output(12, True)
    GPIO.output(13, True)
    GPIO.output(16, True)
    GPIO.output(19, True)
    GPIO.output(20, True)
    GPIO.output(21, True)
    GPIO.output(26, True)
    GPIO.output(6, True)
    GPIO.output(5, True)

    # Initialisieren der Variablen

    Lampe1 = False
    Lampe2 = False
    Lampe3 = False
    CO2 = False
    Duengerpumpe = False
    Fuellpumpe = False
    Bodenheizer = False
    Stabheizer = False
    temp = 25
    zeit = strftime("%H:%M", localtime())
    alive = False

    # Endlosschleife

    while True:

    # Auslesen des Tempratursensors
     
    # 1-Wire Slave-Liste lesen
    file = open('/sys/devices/w1_bus_master1/w1_master_slaves')
    w1_slaves = file.readlines()
    file.close()

    # Fuer jeden 1-Wire Slave aktuelle Temperatur ausgeben
    for line in w1_slaves:
    # 1-wire Slave extrahieren
    w1_slave = line.split("\n")[0]
    # 1-wire Slave Datei lesen
    file = open('/sys/bus/w1/devices/' + str(w1_slave) + '/w1_slave')
    filecontent = file.read()
    file.close()

    # Temperaturwerte auslesen und konvertieren
    stringvalue = filecontent.split("\n")[1].split(" ")[9]
    temp = float(stringvalue[2:]) / 1000



    # Auswerten der Zeit und Schalten der Ausgaenge

    # Lampen

    if (zeit >= m1 and zeit<= m2) or (zeit >= a1 and zeit<= a2) :
    GPIO.output(13, False)
    Lampe1= True
       
    else :
    GPIO.output(13, True)
    Lampe1 = False
         
    #sleep(2)
       
    if (zeit >= m3 and zeit<= m4) or (zeit >= a3 and zeit<= a4) :
    GPIO.output(16, False)
    Lampe2 = True
       
    else :
    GPIO.output(16, True)
    Lampe2 = False
         
    #sleep(2)

    if (zeit >= m5 and zeit<= m6) or (zeit >= a5 and zeit<= a6) :
    GPIO.output(19, False)
    Lampe3= True
       
    else :
    GPIO.output(19, True)
    Lampe3 = False


    if (zeit >= m7 and zeit<= m8) or (zeit >= a7 and zeit<= a8) :
    GPIO.output(20, False)
    CO2= True
       
    else :
    GPIO.output(20, True)
    CO2 = False

    # Tagesduenger

    if zeit == Duengen:
    GPIO.output(21, False)
    sleep(s1)
    GPIO.output(21, True)
    print ("Duengen an")
    sleep(60)
                 
    # Nachfuellen


    if zeit == Nachfuellen:
    GPIO.output(26, False)
    print ("Nachfuellen an")
    sleep(s2)
    GPIO.output(26,True)

    sleep(60)

    # Temperatur

    if (temp < BHL) :
    GPIO.output(12, False)
    Bodenheizer = True

    if (temp > BHH) :
    GPIO.output(12, True)
    Bodenheizer = False

    if (temp < SHL) :
    GPIO.output(6, False)
    Stabheizer = True

    if (temp > SHH) :
    GPIO.output(6, True)
    Stabheizer = False

    if (temp >= TWL) and (temp <= TWH) :
    GPIO.output(7, True)
    else:
    GPIO.output(7, False)


    # Output von x Zeilen zum Klaeren des Bildschirms


    zaehler= 10
    while zaehler>0:
    print("*")
    zaehler-=1

    # Ausgabe der Zeit

    zeit =strftime("%H:%M", localtime())
    print (zeit)


    # Ausgabe aller Schaltzustaende
         
    if Lampe1== True:
    print("Lampe 1 an")
    else:
    print("Lampe 1 aus")

    if Lampe2== True:
    print("Lampe 2 an")
    else:
    print("Lampe 2 aus")

    if Lampe3== True:
    print("Lampe 3 an")
    else:
    print("Lampe 3 aus")

    if CO2 == True:
    print("CO2 an")
    else:
    print("CO2 aus")


    # Temperatur ausgeben
    print(str("Temperatur =") + ' %6.2f °C' % temp)

    if Bodenheizer == True:
    print("Bodenheizer an")
    else:
    print("Bodenheizer aus")

    if Stabheizer == True:
    print("Stabheizer an")
    else:
    print("Stabheizer aus")


    if alive == True:
    GPIO.output (5, True)
    alive = False
    print ("x")
    else:
    GPIO.output (5, False)
    alive = True
    print ("+")


    sleep (0.1)
    [/code]