Umbau AquaGrow Mini Platine

shooter

Member
Hallo zusammen,

ich wollte euch mal an einem kleinen Projekt teilhaben lassen. Es geht um den Umbau bzw. das Anpassen der AquaGrow Mini Platine vom Moritz an meine Bedürfnisse, ich denke das ist evtl. für den ein oder anderen auch interessant.

Als kleine Vorabinfo, ich bin Informatikstudent, habe unter anderem ein großes Diskusschaubecken mit angeschlossenem AquaPIC Aquariencomputer (ein anderes Eigenbauprojekt aus einem anderen Forum).

Ich wollte damit nur sagen ich weiß zumindest grundlegend was ich da tuhe :D :bier: und habe auch eine gute Vorstellung davon was ein Aquariencomputer (für mich!) können muss.

Zunächstmal was ich vor habe (in Teilen ist das schon fertig):

LED Steuerung (wie vorgesehen von Moritz)
- Sonnenauf / untergang mit roten LED
- Nachtlicht (blaue LED weils schick ausschaut)

Temperatursteuerung (hier möchte ich den Sensor, gedacht für die LED Temperatur, misssbrauchen um die Wassertemperatur zu messen.)

Steckdosenleiste schalten ((Eigenumbau mit eigener Ansteuerung, 2x Dauerstrom 4x Schaltbar)
Ich benutze hier eine fertig konfektionierte 6-Fach Leiste von Gembird, nicht ganz billig dafür alles an Board was wir brauchen ohne groß zu basteln. Die grundlegende Idee war eine Steckdose sekundengenau schalten zu können etwa für Dosierpumpen. Nun haben wir ja schon Anschlüsse für Dosierpumpen, also brauchen wir das dafür schonmal nicht.

ABER wir haben ja z.B. noch einen Temperatursensor, sehr genau das kleine Teil!
Damit werde ich über eine Steckdose die Heizung steuern, denkbar sind auch zwei Heizstäbe die Abhängig vom Temperaturunterschied einzeln oder parallel geschaltet werden (+ redundanz).

Die Pumpe wird ebenfalls auf eine Schaltbare Steckdose gelegt.

Warum? Ganz einfach! Über das Keypad kann ich dann Funktionen wie z.B. Wasserwechsel (Filter aus, Heizung aus, Licht an) ganz einfach per Tastendruck ansteuern.
Eine weitere Idee ist die Futterpause, Pumpe aus für 10 min...

Grundlegend funktioniert die Ansteuerung der Steckerleiste schon via Arduino, jetzt fehlt noch eine ordentliche Logik dahinter...

Für die Ansteuerung habe ich vier analoge Pins des Arduino benutz welche noch nicht belegt waren. Es sollte auch möglich sein noch vier weitere Schaltsteckdosen zu implementieren wenn dies notwendig wird.

Für die Kabelanbindung habe ich mich für Westernstecker 6p6c entschieden, das reicht für die meisten Anwendungen (im Moment ja eh nur die eine Steckdose).

Das Gehäuse für das Gerät wird am Ende im 3D Drucker entstehen.

Das Display werde ich auch entsprechend anpassen, Wassertemperatur ist hier schonmal ein muss, genau wie die Uhrzeit (steht ja schon da, nur noch nich wo es am Ende stehen soll.)

Wenn jemand Interesse am Nachbau oder Vorschläge hat dann immer her damit.

Ausblick in die Ferne:

Ich liebäugel mit einer PH Steuerung, Magnetventil gesteuert über eine schaltbare Steckdose. Ich kann nur noch nicht sagen ob der Platz auf dem Nano dafür ausreicht. Das messen von PH über Sonde ist auch nicht ganz so einfach.

Viele Grüße,

Flo
 

rrnetz

Member
shooter":3ixboe3k schrieb:
Zunächstmal was ich vor habe (in Teilen ist das schon fertig):

LED Steuerung (wie vorgesehen von Moritz)
- Sonnenauf / untergang mit roten LED
- Nachtlicht (blaue LED weils schick ausschaut)
Das würde mich auch interessieren :pfeifen:
Temperatursteuerung (hier möchte ich den Sensor, gedacht für die LED Temperatur, misssbrauchen um die Wassertemperatur zu messen.)
Hab ich auch gemacht, da die led s gut gekühlt sind.

Dein restliches Vorhaben hört sich ganz gut an, aber im grossen und ganzen ist das auch in Moritz seinem neuen Controller schon drin.
Würde mich aber trotzdem sehr interresieren wie du alles umsetzen willst.

Gruss Rene
 

shooter

Member
Hallo zusammen, kurzer Zwischenstand:

Steckdosen können jeweils mit einem Timer (sekundengenau) oder einer Temperatursteuerung belegt werden.

Nachdem ich den code optimiert hatte passte er auch gerade so auf den Nano. Gibt es evtl Interesse an dem code? Dann würde ich ihn online stellen....

Im Moment sitze ich an der Wasserwechsel-Steuerung und allgemein an der config.h.

Später soll nur noch über die config.h eingestellt werden was der Controller macht, welche Steckdosen mit welchem Endverbraucher verbunden sind....also auch eine automatisierte Auswertung und Zuordnung von Funktionen auf die definierten Steckdosen.

Weiter geht es denn mit der Futterpausentaste, hier soll die Pumpe vom Filter für einen Zeitraum pausieren.

Sobald ich ein voll funktionsfähiges LCD Display habe (meins zeigt nur die 1. und 2. Zeile korrekt an, da defekt) geht es an die Optimierung der Darstellung. Ich hätte noch gern die Dimmung der einzelnen Kanäle etwas einfacher und dauerhaft dargestellt. Die Statusanzeige der einzelnen Steckdosen funktioniert dagegen schon, muss aber noch optimiert werden was denn Platzbedarf auf dem Display angeht.

Viel zu tun....

Sollte die Resonanz doch nicht so groß sein werde ich den Thread hier einstellen bzw. nur rudimentär am leben halten....dann können mich die Interessierten ja per PM erreichen falls Fragen auftauchen.

Gruß,

Flo
 

MajorMadness

Active Member
Hi, also mich interessiert das auf jeden Fall und fände es Klasse wenn du mir deinen code mailst oder schickst. Grade auch weil ich den code ja für oleds Anlässe fast ausschließlich inzwischen da die einfach besser sind. Generelle code Verbesserungen sind natürlich auch gerne gesehen da mir dafür teils die Zeit fehlt gerade. Ich Bartel ja wieder an neuem...
 

rrnetz

Member
Hallo Flo

Auf jeden fall wäre ich auch sehr interressiert am Code. Vor allem an deine Umsetzung der dimmung und sonnauf und Untergang.
Welches display nutzt du, geht auch das oled display?
Gruss Rene
 

shooter

Member
Hallo zusammen, schön das es Resonanz gibt, das freut mich sehr...

Rene, schick mir mal bitte Deine Mailadresse per PN dann schick ich euch beiden meinen code raus...

Gruß,

Flo
 

shooter

Member
Hallo zusammen,

nach massiven Umbauten im Code wird es heute Abend nach diversen Tests (und deren positiven Verlaufs) ein neues Release geben. Dann könnt ihr damit ein bischen Spielen.

Viele Funktionen in der socket.ino sind um einiges eleganter aber auch etwas unverständlicher geworden.

Die Konfiguration läuft wie gewohnt NUR über die config!

Aktueller Funktionsumfag:

- automatische Belegung der Steckdosenfunktionen über ein Array
0 = Pumpe (noch ohne Funktion, später wichtig für Wasserwechsel und Futterpause
1 = Heizung (Temperatursteuerung via TempSensor, dazu in der config zusätzlich Wassertemperatur anpassen!)
2 = Timer (Zeitschaltuhr, sekundengenau, dazu Schaltzeitenarray anpassen)
3 = Licht (noch ohne Funktion)

- Temperatursteuerung auf alle Steckdosen legbar
- Sekundengenaue Zeitschaltuhr auf alle Steckdosen legbar

ToDo:
- Wasserwechselpause
- Futterpause

Wünsche?

Gruß,

Flo
 

rrnetz

Member
Hi
Hört sich gut an, hoffen du postest oder sendest mir deine Änderungen
 

shooter

Member
Hallo zusammen,

@Rene: na klar, ist bereits unterwegs!

Es waren noch kleine Modifikationen notwendig (von wegen Theorie und Praxis....) aber nun läuft es !

Ich wünsche euch viel Spaß damit, große Änderungen sind jetzt erstmal nicht mehr geplant.

Was die Tage definitv noch kommen soll (wenn ich das hinbekomme...) ist die Zeitschaltuhr Absicherung. Im Moment schaltet die Zeitschaltuhr zu jeder Schaltzeit einfach in einen anderen Status, prüft dabei aber noch nicht ob schon eingeschaltet ist wenn sie nochmal ein Einschaltsignal bekommt (da wird einfach nicht zwischen den Signalen unterschieden). Sollte also zwischen einer Schaltzeit manuel ein oder ausgeschaltet worden sein so wird im nächsten Schaltzyklus einfach "umgeschaltet" egal wie der aktuelle Stand ist.

DURCH MANUELLES SCHALTEN KANN ALSO DER SCHALTZYKLUS AUS DEM TAKT GEBRACHT WERDEN!

Wenn manuell geschaltet wird dann muss auch wieder zurück geschaltet werden!

Klingt komplizierter als es ist, wird demnächst auch noch irgendwie abgefangen.

Gruß,

Flo

NACHTRAG / WICHTIGE ZUSATZINFOS

Betr.: config.h

Im Schaltzeiten Array und beim Eintrag SCHALTZEITEN muss angepasst werden.

Ausgelegt ist die Zeitschaltuhr für 4 Schaltzeiten. Benötigt man nur zwei und ist es unwichtig ob zwischendrin kurz einmal an/aus geswitched wird dann lasst alles wie es ist und stellt bei den nicht benötigten Zeiten im Array zweimal den selben Wert ein.

Andernfalls müsst ihr den Eintrag SCHALTZEITEN auf 2 setzen und das Array in der Länge anpassen!

Fragen?
 

shooter

Member
Die Zeitschaltuhren synchronisieren sich jetzt unabhängig vom Schaltzustand mit der nächsten Schaltzeit!

Zusätzlich wurde noch die Anzeige der Schaltzustände im LCD Display verändert.

Zusätzliches ToDo:
- Display Dimmen nach x Minuten (in der Theorie schon fertig...*g*)

Gruß,

Flo
 

omega

Well-Known Member
Hi Flo,

wo kann ich Deine Sourcen sehen? Mich interessiert, wie Du die Dimmung umgesetzt hast.

Grüße, Markus
 

shooter

Member
Hi Markus,

die Dimmung habe ich noch garnich angefasst, die kommt weiterhin von Moritz.

Ansonsten schick mir einfach ne pn mit Deiner Mailadresse dann bekommst Du den code.

Falls Du die LCD Dimmung meinst: da habe ich auch noch nichts gemacht aber da wird ein freier pwm pin benötigt und dann eine zusätzliche Leitung zum lcd...

Gruß,

Flo
 

omega

Well-Known Member
Hi Flo,

nö, mir ginge es nur um die Dimmung der Beleuchtung. Ich hab' da meine eigene Lösung und bin daran interessiert, wie das andere umgesetzt haben.

Grüße, Markus
 

omega

Well-Known Member
Hallo Moritz,

MajorMadness":2oh4iw17 schrieb:
Kannst ja mal dein Projekt vorstellen und source code uploaden. Dann kann flo und ich mal sehen wie du das machst.
o je, den würdet Ihr wahrscheinlich zerreissen, da er so gar nicht den so oft propagierten angeblichen Maßstäben eines Microcontrollers entspricht: Minimalismus. :smile:

Ich kann das Konzept ja mal kurz in Worten zusammenfassen. Bei blankem Code plus etwas Kommentare verliert man sich schnell in Details:
Meine Anwendung ist event-getrieben und in C++ implementiert.
Tastendruck (nach Peter Dannegger entprellt, allerdings objektorientiert) und Timer erzeugen Events, die in der Main-Loop durch einen Event-Handler dispatcht werden. An diesem Event-Handler sind Listener registriert. Neben diesen beiden Event-Typen gibt es noch zwei weitere:
  • PaintEvent, der ausgelöst durch einen TimerEvent einmal pro Sekunde das LCD neu beschreibt (für die Anzeige der Uhr, wenn sie denn angezeigt wird)
  • LightSettingsEvent, der durch die interaktive Änderung der Lichtparameter ausgelöst wird und die Dimmer-Objekte reinitialisert
Listener gibt es 4. Einer verarbeitet nur Tasten, ein anderer Tasten und TimerEvents, noch einer Tasten und LightSettingsEvent, der letzte nur PaintEvents, wie es funktional halt zusammengehört.

Für Sonnenauf- und -untergang und Wolken habe ich eine kleine Klassenbibliothek implementiert, die u.a. einen Sinus- (0.5 + sin(x*pi-pi/2)/2), Exponential- (1.0384*(33*x-3 - 0.037)) und Linearverlauf (x), Wolken und den sog. Peak (PWM auf 100%) kennt. Die sind alle polymorph. D.h., es ist egal, welche dieser Klassen ich instantiiere und verwende, da sie von derselben abstrakten Basisklasse abstammen.
Ein solches Objekt kennt die Dauer, in der es aktiv sein soll, die Dauer in der hoch- und runtergedimmt werden soll und den max. PWM-Level, den es verwenden soll, und ein ihm artverwandtes Objekt, um verschiedene dieser Objekte kombinieren zu können.
Ein solches Objekt erhält 50x in der Sekunde den null-basierten Zeitstempel (ein float in Stunden), ab dem das Licht anging und errechnet anhand der erwähnten Funktion den PWM-Level. Den Zeitstempel rechnet ein dimmfähiges Objekt während der Dimmdauer dazu in den Wertebereich 0.0-1.0 der Funktion um. Die Funktion liefert Werte zwischen 0.0 und 1.0, die mit dem max. PWM-Level skaliert werden. Der daraus resultierende PWM-Level wird dann mit einem globalen Level 0-100% und dem LED-spezifischen Level 0-100% verrechnet, bevor der daraus resultierende PWM-Level an die PWM-Controller gesendet wird. Es werden nur PWM-Level-Änderungen versendet, identische unterdrückt.

Das ganze ist noch viel komplexer. EEProm-, Menü-, Hardware-, I/O-Klassen und weitere Lichtsteuerung (Schalten von LED-Gruppen und manuell Ein/AUS jeweils mit sanftem Übergang, manuelles Dimmen, Tages/Wochenzeitschaltuhr) kommen noch dazu. Aber es ist nicht kompliziert, da sich die gesamte Komplexität auf viele Klassen verteilt und so jede Klasse für sich einfach zu verstehen ist, sich z.T. sogar nahe an der Trivialitätsgrenze bewegt, aber dennoch erhebliche Auswirkungen besitzen kann. Die Klassen bzw. deren Objekte beeinflussen sich nicht gegenseitig, da jede nur ihren eigenen Aufgabenbereich abdeckt, außer dort, wo sie es sollen. Das ist ja gerade der Witz an OOD.
Speicher verbraucht das ganze 52928 Byte an Code plus Heap plus Stack und läuft auf einem Arduino Mega 2560 R3.

Hochgeladen auf meine Homepage hätte ich das schon längst. Allerdings sind meine Webdesign-Kenntnisse auf dem Stand von FrontPage 98. Das will ich mir und anderen nicht noch weiter antun. Der jetzige Müll ist schon genug.

Grüße, Markus
 

Ähnliche Themen

Oben