Projektvorstellung: Terrariensteuerung

Vorab: die Projektvorstellung hat folgenden Zweck:
a) Hilfe für Leute, die Ähnliches realisieren möchten
b) Wenn Jemand Optimierungsvorschläge und Verbesserungsmöglichkeiten hat, bitte zögert nicht, diese zu posten :slight_smile:

Es handelt sich um ein Automatisierungssystem für ein Terrarium, welches die aufgelisteten Punkte beinhaltet:
-Beregnungsanlage (über Relais geschaltet) (Ulka Ex5)
-Leuchtstoffröhre (über Relais geschaltet) (Osram Fluora)
-RGB-LED-Streifen (PWM-Ausgänge steuern MOSFETs an)

5m, 60LED/m
grün-gelbliches Licht am Tag, Rot in der Nacht (Rot ist für die Terrariumbewohner nicht sichtbar)
Simulation sanfter "Sonnen"auf- und untergänge
kleine Temperaturregelung durch die Lichtintensität des LED-Strips
-Temperatur- und Feuchtigkeitssensor DHT22
-fällt die Luftfeuchtigkeit unter einen Grenzwert, so schaltet sich die LCD-Beleuchtung ein
-externes Uhrmodul (DS3231)
Berechnung von Sommer- und Winterzeit (DST)
-Anzeige durch 20x4 LCD-Display (I2C)
Uhrzeit, LF, Temperatur/ PWM-Intensität der einzelnen Farben des RGB-Strips bei Knopfdruck für gewisse Zeit
-4 Taster
LCD-Beleuchtung für gewisse Zeit anschalten
Beregnung manuell starten
LCD-Anzeige umschalten (LCD-Beleuchtung wird dabei auch gestartet)
RGB-Intensität auf Grundeinstellung der jeweiligen Tageszeit setzen
Taster sind entprellt

Der Code ist im Anhang zu finden.

Nachfolgend der Schaltplan:

Edit:
#1: Code aktualisiert (5.3.2016)

Terrarium_gro_.ino (12.1 KB)

Dinge die sich nie ändern wie Pin-Belegungen macht man “const”. Dann sind das keine Variablen, sondern Konstanten und belegen kein RAM

Globale Variablen (und lokale statische) müssen nicht auf extra auf 0 initialisiert werden. Das geschieht automatisch. Sollte aber auch nichts schaden, da der Compiler das weg-optimieren sollte.

Der Watchdog Reset geht zwar wo er ist, aber logisch gehört das eher in loop(), da es mit der Funktion erkenneZeit() nichts zu tun hat

Statt Status nur mit Ziffern zu machen, wäre das eventuell mit einem enum besser lesbar. Aber du wird wissen was was bedeutet

Statt:

lcd<<"Intensit";
lcd.write(225);
lcd<<"t Rot:";

So:

lcd<<"Intensit\xE1t Rot";

Oder:

lcd<<"Intensit\xE1" "t Rot";

Letzteres ist zwingend nötig wenn nach dem Hex-Wert ein Zeichen folgt dass auch eine Hex-Ziffer sein kann

Außerdem kannst du mit << auch write() machen wenn du den Wert als _BYTE() übergibst!

@Serenifly: Danke vielmals, hab den Code dementsprechend neu angepasst.

Der Watchdog Reset geht zwar wo er ist, aber logisch gehört das eher in loop(), da es mit der Funktion erkenneZeit() nichts zu tun hat

–>Stimmt, war noch ein Überbleibsel vom Programmvorgänger, dort hatte ich mit delay() gearbeitet, und in der loop() waren sozusagen Schleifen, die er nur beim Statuswechsel verlassen hat. erkenneZeit() war daher die nächstpassende Methode, wo ich den wdt.reset() ausführen konnte. Steht jetzt da wo es hingehört.

Statt Status nur mit Ziffern zu machen, wäre das eventuell mit einem enum besser lesbar

–>aber verbraucht auch mehr Speicher, oder?

Außerdem kannst du mit << auch write() machen wenn du den Wert als _BYTE() übergibst!

–>hoffentlich habe ich das richtig abgeändert:

lcd.write(byte(0));

zu

lcd<<byte(0);

DerLehmi:
–>aber verbraucht auch mehr Speicher, oder?

Schau mal nach was enums in C sind. Das sind standardmäßig lediglich ints. In C++11 kann man auch Bytes draus machen.

Es geht natürlich auch ohne, aber es kann Code dieser Art leserlicher machen, da man sofort sieht welcher Zustand was bedeutet.

lcd<<byte(0);

Ich habe _BYTE() gesagt! Nicht byte(). Analog zu _HEX() oder _FLOAT()

lcd << _BYTE(0);

Gute, Danke....hab es entsprechend abgeändert (y)

Mit den enums müsste ich mich erstmal befassen, hab die bisher noch nicht genutzt.... In dem Sinne danke für den Hinweis, werde ich noch nachholen :wink:

Hallo Carsten,

ich habe vor, ein Terrarium für Achatschnecken zu automatisieren und auf der Suche nach Anregung, bin ich auf dein Projekt gestoßen. Es bildet alles ab, was ich vor hatte umzusetzen. Allerdings habe ich nicht ganz verstanden wie das mit dem Zusammenhang zwischen dem LED-Strip und der Temperatur funktioniert. Zudem würde mich interessieren ob die Steuerung bei dir noch läuft und ob es seit dem noch Änderungen gegeben hat?
Würdest du mir bei der Umsetzung, und den notwendigen Änderungen für mein Projekt mit evtl. Antworten und Hilfestellungen unterstützen? Ich habe noch nicht so viel Erfahrung mit dem Programmieren von komplexen Programmen.

Freundliche Grüße
Stefan

Ich könnte mir vorstellen, dass der 5V Spannungsregler auf dem UNO seit 2016 schon mehr als einmal gestorben ist. Die 12 Volt auf VIN sorgen schon für einiges an Temperatur am Regler, dann noch das LCD, die RC Uhr, der Temp.Sensor, die zwei Relais, die alle diese 5 Volt ziehen. Das ist zuviel. Man sollte für die 5V einen extra DC/DC Regler verwenden, der als den 12 Volt die 5 Volt macht, und nicht mehr die Spannung von UNO benutzen. Nur die GND Verbindung muss bleiben, aber die +5V Versorgung vom DC/DC Regler

Würdest du mir bei der Umsetzung, und den notwendigen Änderungen für mein Projekt mit evtl. Antworten und Hilfestellungen unterstützen?

-->Kann ich gerne machen

Allerdings habe ich nicht ganz verstanden wie das mit dem Zusammenhang zwischen dem LED-Strip und der Temperatur funktioniert.

-->Ich habe einfach die Abwärme der LED-Streifen genutzt, um die Temperatur zu regeln. Je nach Tageszeit hat jede Farbe einen bestimmten Wert. Und alle Werte werden mit einer Regelgröße für die Temperatur verrechnet.

Zudem würde mich interessieren ob die Steuerung bei dir noch läuft und ob es seit dem noch Änderungen gegeben hat?

-->Aktuell habe ich es nicht mehr in Betrieb, habe das Hobby vorerst pausiert (wollte während der Prüfungszeit keine neuen Tiere zulegen)
Zumindest eine Änderung gab es: wie Franz54 richtig vermutet hat, hat es den Linearregler nach ca. einem Jahr erwischt. Habe also einfach noch einen Step-Down-Wandler dazugeschaltet, siehe Anhang.

Hallo Carsten,

vielen Dank für deine Antwort und dein Angebot zur Hilfeleistung. Zunächst mal Entschuldigung dass ich mich nicht schon eher mal gemeldet habe....wir waren im Urlaub und da war keine Zeit für Terrariensteuerung.
Ich habe mich nun etwas näher mit deinem Projekt beschäftigt und auch mal mein "Materiallager" durchforstet. Erstaunlicherweise habe ich fast alles da, was dein Schaltplan verlangt....mal abgesehen von der Pumpe und den Mosfets (ist aber bereits geordert). Der Schaltungsaufbau scheint also kein Problem zu werden (denke sogar darüber nach, ein kleines Shield für den UNO daraus zu machen).
Mit dem Code komme ich allerdings wenig klar und muss gestehen dass meine Kenntnisse für solch komplexe Sachen wohl weit weniger reichen als ich gehofft hatte. Zudem kommt noch, dass meine Vorstellungen vom Funktionsumfang meines Projektes doch an einigen Stellen mehr abweichen als anfänglich gedacht. Ich fühle mich nicht in der Lage den Code so abzuändern wie es geschehen müsste und so möchte ich dich hier bitten, mir den Code umzuschreiben. Wenn es dir möglich ist, wären (in Anlehnung an deine Funktionsbeschreibung) folgende Punkte wünschenswert:

-Beregnungsanlage automatisch und Luftfeuchtigkeitsabhängig (unterer Schwellwert 80%) (über Relais geschaltet) (Ulka Ex5)
-Leuchtstoffröhre (über Relais geschaltet) (Osram Fluora)
-RGB-LED-Streifen (PWM-Ausgänge steuern MOSFETs an)

5m, 60LED/m
grün-gelbliches Tageslichtähnliches Licht am Tag, Rot in der Nacht (Rot ist für die Terrariumbewohner nicht sichtbar) gilt das auch bei Schnecken?
Simulation sanfter "Sonnen"auf- und untergänge Einstellbare Uhrzeiten wären toll, wenn möglich über die Tasten
kleine Temperaturregelung durch die Lichtintensität des LED-Strips Dafür aber Temperaturreglung über Relais (Tag 27,5 Grad, Nacht 24 Grad +-1 Grad)
-Temperatur- und Feuchtigkeitssensor DHT22
-fällt die Luftfeuchtigkeit unter einen Grenzwert, so schaltet sich die LCD-Beleuchtung ein Muss nicht sein, wichtiger ist dass gesprüht wird (siehe oben)
-externes Uhrmodul (DS3231)
Berechnung von Sommer- und Winterzeit (DST)
-Anzeige durch 20x4 LCD-Display (I2C)
Uhrzeit, LF, Temperatur/ PWM-Intensität der einzelnen Farben des RGB-Strips bei Knopfdruck für gewisse Zeit
-4 Taster Ich habe sogar 5 Tasten zur Verfügung
LCD-Beleuchtung für gewisse Zeit anschalten
Beregnung manuell starten
LCD-Anzeige umschalten (LCD-Beleuchtung wird dabei auch gestartet)
RGB-Intensität auf Grundeinstellung der jeweiligen Tageszeit setzen
Taster sind entprellt

Ich weiß, dass die Änderungen nicht mal schnell gemacht sind, aber vielleicht findest du die Zeit dafür?! Ich wäre dir sehr sehr dankbar wenn das klappen sollte!

Freundliche Grüße Stefan

Hallo Fetzer,
also ich kann gerne bei einzelnen Punkten helfen...aber speziell jetzt den Code für Dein Projekt zu schreiben, dazu fehlt mir momentan einfach die Zeit.

Noch ein paar Anmerkungen:
-Beregnungsanlage: wenn Du entsprechend der Feuchtigkeit das Teil steuern willst, sollte ein besserer Sensor zum Einsatz kommen. Der DHT wäre dafür nicht zu empfehlen. Daher habe ich auch nur das Display aufleuchten lassen, um selber zu entscheiden ob nun eine Beregnung nötig ist.
-rotes Licht: das weiß ich nicht, mit Schnecken kenne ich mich 0 aus.

Für den Anfang empfehle ich, erstmal die Komponenten einzeln anzusteuern und damit rumzuspielen, damit Du weißt was es für Möglichkeiten gibt. Ein Zustandsautomat wäre dann der nächste Schritt (Grundlage: Blink without delay/ Nachtwächtererklärung)