Noch ein DIY Controller

thisischris

New Member
Liebe FlowGrower

Es wird Zeit, dass ich Euch mal etwas zurückgebe. Ich bin Chris, etwas über 40, aus der Schweiz (sorry, kein „Eszett“ auf meiner Tastatur). In den frühen 90er-Jahren war ich lange glücklicher Holland-Aquarianer: viele Pflanzen, viele Fische, viel Wachstum, aber auch ein trauriges Ende, das irgendwie mit meiner Ferienabwesenheit und (wie man mir erzählte) Vodka während einer Studentenparty zusammenhing.

Nun, da die Kinder schon etwas grösser sind, hat’s mich wieder gepackt. Ich habe ein algendurchwachsenes Jahr gebraucht, um festzustellen, dass das Trinkwasser in meiner Stadt mittlerweile absolut kein Phosphat mehr enthält. Doch dann ging’s Schlag auf Schlag: Amano, Knott und Co. und eben bald auch Flowgrow. Ihr habt für mich bewiesen, was ich schon immer vermutet habe: dass es möglich ist, ein System zu finden, das vielleicht nicht das einzig mögliche oder absolut richtige ist, das aber aufgrund von viel Erfahrung und ernsthaftem Austausch tatsächlich funktioniert und bei Problemen Lösungswege bietet.

Mein erstes Scape vorzustellen traue ich mich noch nicht so recht, da haben mich manche hier mich mit ihren unglaublichen Kreationen einfach zu sehr eingeschüchtert. Vielleicht hilft einigen von Euch aber ein Einblick in mein schon recht gut „eingefahrenes“, Arduino-basiertes Controller-Projekt.

Es gibt viele Wege, einen solchen DIY Controller zu bauen und meiner ist ein Bisschen anders, als die Projekte, die hier schon vorgestellt wurden (ganz speziell und ganz inspirierend natürlich die von @MajorMadness).

Eine Anleitung zum einfachen Nachbau kann ich nicht bieten (und auch keine Garantie, dass mein „Zeugs“ anderswo funktionieren wird), aber vielleicht inspiriert mein Ansatz ja noch ein paar Leute mehr, in die unglaublich mächtige Welt der Mikroprozessoren abzutauchen. Ich beantworte auf jeden Fall gerne Fragen (sobald ich Zeit habe - ganz SO gross sind die Kinder nun auch wieder nicht).

Ich habe begonnen, das Projekt hier zu dokumentieren:

https://github.com/thisischris/aquarium_controller

Die Features meines Controllers soweit:

  • Messen: pH, Sauerstoffkonzentration, Temperatur
  • Reporting: pH, Sauerstoffkonzentration, Temperatur, Echtzeit, Ventilation (Kühlung)
  • Steuern: 3 Düngerpumpen, PC-Ventilatoren zur Kühlung, bis zu fünf Steckdosen

Ich nehme die „Reports“ vom Controller mit einem Raspberry Pi auf und generiere daraus eine kleine Web-Page mit Statistiken und Statusangaben.

Das GIT-Projekt enthält nebst Code schon einiges an Infos und Dokumentation (allerdings auf Englisch). Sogar drei Bilder von meinem bescheidenen Prototypen sind dabei (unter „Dokumentation“).

Die Aquarien haben mich irgendwann in den 90ern verlassen, die Elektronik nur teilweise und die Programmierung ist immer mit mir geblieben. Deshalb weiss ich gar nicht so recht, wie ich hier anfangen soll. Stellt einfach Fragen, falls Euch das Projekt interessiert.

Beste Grüsse

Chris
 

thisischris

New Member
Hallo

Also gelesen hat der/die eine oder andere den Beitrag schon. Ich erkläre hier mal der Reihe nach den Einstieg (und weshalb überhaupt Arduino?), später dann die einzelnen Komponenten des Systems und die Überlegungen, die ich mir dazu gemacht habe.

Mein Tipp wäre, mit dem Arduino Starter Kit zu beginnen und die darin vorgestellten Experimente durchzuführen. Da kommt zwar etwas Teenager-Elektronikbaukasten-Feeling auf und dieser Einstieg ist auch etwas teurer (in Deutschland um die 100€) als einfach einen Arduino zu erstehen. Das Starter Kit vermittelt dafür einen leicht verständlichen Einblick in alle wichtigen Wissensbereichen rund um das Arbeiten mit Mikroprozessoren und verhindert später viel sinnloses Stochern im Dunkeln. Zudem enthält das Starter Kit viele Teile, die später für Experimente rund ums Aquarium gebraucht werden können (und einzeln gar nicht immer so leicht aufzutreiben wären).

http://arduino.cc/en/Main/ArduinoStarterKit

Nebst dem Starter Kit braucht's vorläufig nur einen PC (oder Mac) mit USB-Anschluss.

Es gibt viele Mikroprozessor-Alternativen zum Arduino, das Arduino-Projekt besticht aber durch eine grosse Community, eine ausgezeichnete Dokumentation und durch eine gewisse Robustheit in der Bedienung, vor allem für Anfänger. Zudem sieht alles rund um den Arduino sau gut aus, finde ich :).

Ein Aquarien-Controller könnte auch auf Basis z.B. eines Raspberry PI aufgebaut werden, Features wie Echtzeit oder Internet-Zugang kämen dann quasi gratis dazu. Jedoch haben diese kleinen Computer einen gewaltigen Nachteil: sie sind eben Computer, d.h. sie haben ein Betriebssystem (das auch mal abstürzt), müssen regelmässig aktualisiert werden, sind komplex zu administrieren etc. Das wunderbare am Arduino ist, dass sich damit quasi eine direkte Beziehung zwischen der Eingabe (einem Sensor, z.B. für Temperatur) und der Ausgabe (z.B. einem Ventilator-Motor) herstellen lässt. Einmal richtig aufgesetzt und programmiert läuft ein Arduino einfach, fast wie Strom aus der Steckdose. So zumindest meine Erfahrung bisher. Diese Zuverlässigkeit braucht's für einen richtigen Aquarien-Controller.

Beste Grüsse

Chris
 

Tim

Member
Hallo Chris,

liest sich gut und ist sehr interessant. Schön das hier noch mehr Personen ihre Projekte so ausführlich vorstellen.

Beste Grüße,
Timo
 

thisischris

New Member
Hallo

Danke Timo, das motiviert! Heute ist hier ein gesetzlicher Feiertag, da bleibt mir etwas mehr Zeit. Deshalb: Funksteckdosen (und eine erste Limitierung des Arduino).

Mit der Zeit haben sich gefühlte 100 Zeitschaltuhren in meinem Unterschrank angesammelt, eine weniger zuverlässig als die andere. Diese abzulösen hat mir zuerst viel Respekt eingeflösst (schalten von 220V und so). Dank eines einfachen Tricks wurde das am Ende aber zum einfachsten Teil meines Arduino-Projekts.

Billige Baumarkt-Funksteckdosen beruhen nämlich fast alle auf einem einfachen Prinzip: ein Sender in der Fernbedienung sendet Funk-Pulse und die Steckdosen "lauschen" permanent auf diese Pulse: muss ich mich nun ein- oder ausschalten? Biiip Biiip Bip Bip Biiip, gesendet auf 434MHz bedeutet also vereinfacht gesagt: Steckdose 3, bitte einschalten und Biiip Biiip Bip Bip Bip. wäre dann Steckdose 3, bitte ausschalten. Den Part des Senders kann der Arduino anstelle der Fernbedienung sehr leicht übernehmen, mit diesem einfachen Bauteil für 3.50€:

http://www.watterott.com/de/RF-Link-Sender-434MHz

Funksteckdosen gibt's im Baumarkt um die 5 Euro pro Stück (eine reicht für Experimente am Anfang und ja, hier in der Schweiz kosten dieselben Steckdosen etwa 5 mal mehr). Ich empfehle die Version, die über 10 DIP-Switches konfiguriert wird (siehe Bedienungsanleitung), da sie sich am cleversten ansteuern lässt.

Der Sender hat drei Anschlüsse: +, -, Puls und Antenne, siehe die Angaben im Datenblatt auf der Website oben. Als Antenne eignet sich ein einfacher Kupferdraht, ich habe meinen 20cm lang gemacht und erreiche damit eine Reichweite von ca. 10m. Der Puls kommt an einen Arduino-Digitalpin und + und - an, ja, + und -. Nun kann der Arduino Funksteckdosen-Fernbedienungs-Signale senden.

Für das Ansteuern der Steckdosen mit Fernbedienungs-Signalen gibt's eine zuverlässige Arduino-Library, RCSwitch:

https://code.google.com/p/rc-switch/

Hier ein Blogpost mit den Hintergründen dazu:

http://sui77.wordpress.com/2011/04/12/163/

Vielleicht braucht's ein paar Versuche, bis die erste Steckdose richtig schaltet: das Protokoll muss stimmen, das gesendete Signal und die Steckdose (DIP-Switches) muss richtig konfiguriert sein. Doch dann: die Macht über 220V, ohne sie je berührt zu haben (und über die Verandabeleuchtung des Nachbarn, hehe).

Rein rechnerisch liessen sich mit dieser Methode 160 DIP-Steckdosen fernbedienen (2^5 Kanäle à je 5 Steckdosen). Das sähe dann aber gar nicht schön aus im Unterschrank. Auch Dimmen sollte möglich sein, denn es gibt diese Steckdosen auch in einer Dimmer-Variante (habe ich allerdings nicht getestet).

Ich habe längere Zeit damit experimentiert, die Steckdosen via einen Alarm (dazu kommen wir später) zu einer gegebenen Zeit ein- und auszuschalten. Leider "vergassen" einige Steckdosen in längeren Abständen ihren Zielzustand. So erwies es sich als zuverlässiger, einfach jede Minute oder so die Zeit zu prüfen und alle Steckdosen durchzugehen: welche sollte nun ein-, welche ausgeschaltet sein? Steckdosen, die bereits eingeschaltet sind regagieren überhaupt nicht negativ, wenn sie jede Minute nochmals das Signal zum Einschalten erhalten und dasselbe gilt für ausgeschaltete Steckdosen. Für den genauen Code, siehe mein anfangs verlinktes Github-Projekt.

Aber Moment: Zeit? Der Arduino weiss ja gar nicht, welche Zeit gerade ist. Es gibt zwar eine Library, Time, die es erlaubt, die Zeit zu verfolgen. Ohne eingebaute Uhr beginnt die Zeitrechnung nach jedem Reboot aber wieder von neuem. Hier gibt's einige Infos dazu:

https://www.inkling.com/read/arduino-cookbook-michael-margolis-2nd/chapter-12/recipe-12-4

Es gibt ein paar Tricks, dem Arduino die aktuelle Zeit auf Programmebene einzubläuen. Für einen Aquarien-Controller sind aber alle diese Methoden zu unzuverlässig. Wir wollen erreichen, dass der Arduino IMMER, auch nach einem Stromausfall und ohne Hilfe eines verbundenen Computers, weiss, welche Zeit gerade ist und die Aquarium-Hardware zuverlässig zum richtigen Zeitpunkt ein- und ausschalten kann. Dafür brauchen wir eine Echtzeituhr. Dazu mehr beim nächsten Mal.

Beste Grüsse

Chris
 

thisischris

New Member
Hallo

Nachdem wir die Macht über 5 (theoretisch 160) Funksteckdosen und die Verandabeleuchtung des Nachbarn erlangt haben, gilt es diese weise und vor allem zur richtigen Zeit zu nutzen. Dafür brauchen wir Echtzeit.

Ein häufig für die Zeitmessung mit dem Arduino verwendeter Chip ist der DS1307 und es dürfte sogar möglich sein, aus diesem Chip, ein Bisschen Quartz und ein paar weiteren Bauteilen eine Echtzeituhr zu basteln. Es geht aber auch fast fertig mit diesem Breakout von Adafruit (zu ähnlichem Preis auch in D erhältlich):

http://www.adafruit.com/products/264

Der Breakout muss in der Regel zusammengelötet werden und bietet dank seines geringen Preises hierfür auch eine gute Übungsgrundlage. Löten müssen wir später noch öfters. Einmal zusammengelötet kann der Breakout nach der Anleitung unter der Adafruit-URL oben (Link „Learn") angeschlossen werden: +, -, SDA, SCL. Wir können die „echten“ SDA, SCL-Eingänge des Arduino Uno verwenden. SQW brauchen wir nicht.

Adafruit bietet eine eigene Library für diese Echtzeituhr, die sich leicht mit den Arduino-Libraries Time und TimeAlarms verbinden lässt (siehe syncProvider() im Projekt). Die Uhr muss einmalig und nach jedem Batteriewechsel neu eingestellt werden, Skripts dazu finden sich im Projekt oder in den Adafruit-Tutorials.

Nun steht uns im Skript Echtzeit zur Verfügung und die Möglichkeit, periodische Alarme oder Alarme zu einer bestimmten Zeit auszulösen. Eigentlich alles, was wir brauchen, um unsere Funksteckdosen und die Verandabeleuchtung des Nachbarn rechtzeitig ein- und auszuschalten. Wie schon erwähnt hat es sich als zuverlässiger erwiesen, periodisch alle Steckdosen durchzugehen und richtig „einzustellen“, anstatt sie über Alarme ein- und auszuschalten. Siehe (checkSwitches(), setSwitchState(), inTimeWindow() im Projekt, gesetzt wird der periodische Aufruf von checkSwitches() in setup()).

Im Sinne von „Learning by Doing“ empfehle ich immer, mit den neu entdeckten Techniken etwas zu experimentieren, also z.B. die Tutorials für den Adafruit-Breakout durchzumachen und etwas mit Time und TimeAlarm zu spielen.

Als nächstes dann: Düngerpumpen.

Ich hoffe, es stört niemanden, dass ich hier auf diese Weise über mein Projekt „blogge“. Einige scheinen mitzulesen. Sagt mir, falls ich eine andere Form wählen soll.

Beste Grüsse

Chris
 

Jürgen71

Member
Hallo Chris,

Mach nur so weiter. Das ist sehr informativ, wenn man sich was ähnliches basteln will.
Für mich persönlich wird es aber erst richtig interessant, wenn du zur Lichtsteuerung kommst. Die kommt doch hoffentlich auch noch, oder ? :hechel:

Grüße,

Jürgen
 

MajorMadness

Active Member
Finde es auch gut was du schreibst und wie du schreibst. Liest sich wie nen Buch. :D Werde mir sicherlich mal bisschen Code bei dir leihen wenn ich die Funktsteckdoesen in meinen grpoßen Controller einbaue. :bier: Manchmal praktisch wenn man das Rad nicht neu erfinden muss.
Ic hwürde dir aber empfehlen deinen Code in mehrere Teile und Tabs zu splitten wegen der Übersicht und statt der 1307 die DS3231 zu nehmen. Code ist gleich aber die ist zig mal genauer... Ich hatte bei der 1307 schon abweichungen von mehreren Minuten am Tag von Sommer zu winter (Uhr lag rum mit Batterie und wurde unregelmässig geprüft). Die DS ist m.M.n. nur gut wenn die Zeit "so halbwechs" stimmen kann und es egal ist ob es nun 18:00 oder 17:30 ist nach einem Monat...
 

thisischris

New Member
Hallo

Super, dann mach' ich bald mal mit den Düngerpumpen weiter.

Lieber Jürgen: ich bin leider Lichtbanause, bei mir hat's unter der Abdeckung noch ganz normale T5er (Giesemann Razor). Mein "Sonnenaufgang" besteht darin, dass ich den hinteren Doppelleuchtbalken 15min. früher einschalte als den vorderen (per Funksteckdose) und beim "Sonnenuntergang" ist's dann umgekehrt. Sehr fortschrittlich :). Im Sommer habe ich nochmals länger Zeit, dann möchte ich entweder auf LED umstellen, oder, etwas verrückter, N P K-Düngung mit Sensoren realisieren. Vielleicht gehe ich aber auch einfach in den Bergen wandern, passt eher zu meinem aktuellen Kontostand :).

Lieber Moritz: stimmt, über die DS1307 hattest Du mal was geschrieben, damals hatte ich meine schon. Meine ist etwas besser, ca. eine Minute pro Woche, aber hier in der Schweiz darf man sowas ja längerfristig nicht zulassen. Ich hatte mir überlegt, einfach gelegentlich ein Zeitsignal an den Arduino zu senden, aber eine bessere Uhr wäre sicher auch angezeigt. Über das posten von Code habe ich mir ehrlich gesagt noch gar nicht so richtig Gedanken gemacht (peinlich), ich wollte das quasi am Schluss anhängen.

Beste Grüsse

Chris
 

MajorMadness

Active Member
Du kannst die ds1307 mit Funk signal synchronisieren. Das ist aber aufwändiger als die ds3231 die auch nur 3€ kostet.
Zum code: einfach fleißig github aktualisieren dann passt das. Mur sortieren ist sehr wichtig. Man verliert sich schnell in den ganzen Dateien, deswegen Kapsel ich alles von den einzelnen Einheiten immer in seperate tabs. Macht es übersichtlicher.
Hast du mal drüber nachgedacht nen rcf Empfänger einzubauen und den ein/ausschalten code im eeprom ab zu legen? Das ist mein Ansatz weil ich so nicht suchen muss. Arduino auf Empfang stellen, Fernbedienung drücken, eeprom ablegen ind von da dann aufrufen zum steuern.
 

thisischris

New Member
Lieber Moritz

Ah, jetzt verstehe ich den Input mit dem Code, so werde ich das bei nächster Gelegenheit auch machen. Der Arduino macht's einem da nicht ganz leicht mit den .ino-Dateinamen (vs. .h und .c).

Das mit der Fernbedienung via EEPROM verstehe ich inhaltlich noch nicht ganz, kann ich das irgendwo in Deinem Code auf Github sehen? Könnte es sein, dass ich da einen ganz anderen Ansatz im Kopf habe, weil mein Arduino an einem konstant laufenden Raspberry PI hängt? Mein Ansatz wäre, eine kleine Website auf dem Raspberry PI zu machen mit Formularen und diese Daten dann via Serial an den Arduino zu senden. Der speichert dann alles im EEPROM wie Du vorschlägst. So würde ich immer sehen was ich konfiguriere und dennoch läuft der Arduino auch zuverlässig wenn's dem Raspberry PI mal nicht so gut geht. Den Raspberry PI brauche ich, weil ich ja Daten aufzeichnen und grafisch darstellen möchte. Ich hatte kurz erwogen, ein Ethernet-Shield zu nutzen. Wirklich viel kann man damit aber nicht machen, weil bei solchen Anwendungen PROGMEN und RAM sofort vollaufen.

Chris
 

thisischris

New Member
Hallo

Dann werden wir mal Dünger pumpen.

Es wurde hier und anderswo schon beschrieben, dass sich sogenannte Peristaltikpumpen für diese Anwendung eignen. Ich habe drei davon auf eBay ersteigert. Leider gibt es dieses Modell jetzt dort nicht mehr. Auf folgendes sollte man beim Kauf achten:

  • Die Fördermenge sollte nicht zu hoch sein, 40 oder 60 ml/Minute lassen sich gut beherrschen, für kleinere Aquarien ev. noch kleinere Mengen.
  • Betriebsspannung: ich habe auf 12V DC gesetzt.
  • Dosiergenauigkeit: es lohnt sich wohl, nicht die allerbilligsten Pumpen zu kaufen, wie ich es getan habe :(.
  • Schlauchanschlüsse und ev. sogar Schläuche schon dabei. Ich habe mir hier einiges aufgehalst, indem ich Pumpen ohne Schlauchanschlüsse und Schläuche gekauft habe und dann viel basteln musste (s. u.).

Das sieht mir spontan, d.h. ohne es selber getestet zu haben, nach einem guten Angebot aus:

http://www.ebay.ch/itm/12V-Schlauch...h-/350878343827?pt=Pumpen&hash=item51b1faa293

Diese Pumpen haben in der Regel ganz einfache Geleichstrommotoren. Bereits im Arduino Starter Kit gibt's eine Anleitung, wie solche Motoren betrieben werden können. Bei meinen Experimenten bin ich mit dieser Methode und mit günstigen Motortreibern aus dem Internet jedoch schnell an Grenzen gestossen. Die Komponenten haben die für den Dauereinsatz nötige Leistung bei mir nicht gebracht und zudem hätte dieser Weg bedeutet, dass pro Motor ein PIN am Arduino draufgegangen wäre. Ich habe mich dann wieder für eine Adafruit-Komponente entschieden, dieses Motor Shield (auch in D erhältlich):

http://www.adafruit.com/products/1438

Dieses Shield muss wieder zusammengelötet werden und, das ist sehr wichtig, es sollten die Stacking Header dazu gekauft und eingelötet werden, denn wir wollen die PINs des Arduino ja weiter nutzen, nachdem das Shield aufgesteckt wurde.

Nun braucht der Arduino auch mehr Power, um die Motoren zu betreiben. Deshalb sollten wir ihm einen eignenen 12V DC Netzadapter spendieren. Passende Adapter sind z.B. häufig bei Internet-Routern, aber auch bei vielen anderen Geräten dabei. 1A sollte der Adapter für unsere Anwendung mindestens haben, 1.5A wären besser, falls wir später noch "ventilieren" möchten. Das Motor Shield kann die 12V vom Adapter ganz einfach übernehmen, indem der VIN-Reiter gesetzt wird (siehe die Erklärungen von Adafruit). Und eine gute Library gibt's natürlich auch dazu.

Ich habe dann runde Löcher in eine alte Weinkiste gebohrt und die Pumpen auf diese Löcher geschraubt. Hier ein Bild dazu:

https://github.com/thisischris/aquarium_controller/blob/master/documentation/outside_view.jpg

Dann kam der grosse Schreck: geeignete Schläuche und Schlauchverbinder waren in meinen Breitengraden einfach nicht aufzutreiben, oder sie waren lächerlich teuer. Ich habe dann zum grossen Bastel angesetzt, indem ich CO2-Rückschlagventile aus denen ich die eigentlichen Ventile entfernt hatte an die Pumpen gehängt habe und von dort graue CO2-Schläuche zur Düngerflasche, respektive zum Aquarium geführt habe. Tobi wundert sich wohl jetzt noch, weshalb einer so viele Rückschlagventile bestellt. Keine elegante Lösung, sie funktioniert aber (auch wenn die Schläuche etwas gar viel Flüssigkeit "zwischenspeichern"). Die Pumpen brauchen übrigens keine Rückschlagventile, denn sie verschliessen den Schlauch, wenn sie nicht im Betrieb sind.

Ich habe dann jede Pumpe während einer Minute laufen lassen um den Durchsatz pro Minute zu prüfen. Diesen verwende ich im Skript, um die Laufzeit der Pumpe zu berechnen:

Laufzeit in Sekunden = gewünschtes Volumen / Durchsatz pro Sekunde.

Die Funktion fürs Pumpen wird einmal pro Tag via TimeAlarm aufgerufen und that's it. Düngerpumpen um die 100€.

Ein Kuriosum ist mir noch untergekommen: Easy Carbo lässt sich mit diesem System nicht pumpen, es blubbert in den Schläuchen vor sich hin und sorgt so für unzuverlässige Fördermengen. Es würde mich interessieren, ob jemand mit einer professionellen Düngerpumpe dieses Phänomen auch schon beobachten konnte.

Ah, und noch etwas: ich habe die CO2-Schläuche durch eine Holzleiste gezogen, in die ich vorher Löcher gebohrt hatte mit einem etwas geringeren Durchmesser als die Schläuche. Diese Holzleiste habe ich dann in meiner Abdeckung oberhalb der Wasseroberfläche verkeilt. Zuerst habe ich während einigen Tagen drei Becher unter die Düngerausläufe gestellt um zu messen, ob das System auch tatsächlich die richtigen Fördermengen bringt. Bei meinen Billigpumpen werde ich das wohl alle paar Monate wiederholen müssen :(.

Beste Grüsse

Chris
 

MajorMadness

Active Member
Mir ist beim durch schauen deines Codes der Pumpen noch was aufgefallen :pfeifen:
Code:
     delay((int) (pump1Volume / pumpCapacity * 1000.0));
Das ist seeeehr ungünstig. Mit Delay hälst du den Arduino an. Wenn du also 5ml Düngst bei 60ml/L "steht" der ~5 Sekunden. In der Zeit macht der garnichts, auch nicht andere Pumpen düngen, Heizung, Co2 schalten ect. Schau dir besser mal die Timer.h an und setz nen Trigger das die nach x Sekunden im Betrieb ausgeschaltet werden.
Dann: 5ml will ich düngen und meine Pumpe fördert 67ml/min, also 1,127ml/L. Rechnung ist 5/1,127*1000,0 ~ 4,436*1000. Besser, weil schneller und mit weniger Ram verbrauch ist das du dir die ml speicherst und dann mit int rechnest.
Code:
// pump1Volume =5
// pumpCapacity = 67
// 60000 = 1Min in ms
     delay(int(60000 * pump1Volume / pumpCapacity ) );
wobei da immernoch das Delay drin ist was du unbedingt vermeiden solltest. Ich kenne den Motor Driver nicht, aber du solltest mal schauen ob es ne funktion gibt um das ohne delay zu machen oder aus der timer.h den trigger einer userfunction benutzen um den an/aus zu schalten.

Zu Easy Carbo: Kann ich bei mir zuverlässig und ohne Probleme mit billig 12€ Pumpen pumpen. Muss also an der Rückschlagventil konstruktion liegen...
 

thisischris

New Member
Da würde mich Deine Erfahrung interessieren: hast Du es je erlebt, dass sich der Arduino "aufhängt", d.h. abstürzt und stehen bleibt, aber nicht neu startet? Ich hatte das nämlich mal so wie Du es beschreibst: Pumpe an, fröhlich weiterarbeiten, Pumpe aus. Doch dann bekam ich, ohne es erlebt zu haben Angst vor folgender Situation:
  • Pumpe an
  • Arduino arbeitet fröhlich weiter
  • Arduino blockiert
  • Pumpe läuft weiter und pumpt die ganze Flasche ins Becken
Meine Überlegung war deshalb: lieber blockiere ich den Arduino für ein paar Sekunden während des Pumpens, minimiere dafür aber das Risiko eines Absturzes, als die Situation oben zu erleben. Aber vielleicht liege ich völlig falsch und der Arduino hat einen Mechanismus, der einen solchen Blockierer bemerken und neu starten würde, oder er könnte (z.B. aufgrund eines Interrupts) auch während eines Delays abstürzen. Davon verstehe ich einfach zu wenig. Weisst Du dazu mehr oder hast Du solches sogar schon erlebt? Ich habe bisher nur Abstürze mit quasi sofortigem Reboot erlebt.
Die Alarme von TimeAlarm werden übrigens nachgeholt falls sie während eines Delays eingetreten wären, das habe ich geprüft. D.h. das Licht würde dann einfach ein paar Sek. später ausgemacht.

Beste Grüsse

Chris
 

thisischris

New Member
Ich habe dieses Projekt ursprünglich als reines Mess-, bzw. Aquarien-Überwachungsprojekt gestartet. Anlass dafür war der Besuch eines noch sehr kleinen Gastes mit leider zuerst unerkanntem experimentellem Interesse für Aquarien-Hardware. Meine erste Idee war, Temperatur, pH und Sauerstoffkonzentration zu messen und bei raschen Veränderungen, sowie beim Überschreiten von Maximal- und Minimalwerten Alarm zu schlagen. Mich hat dann überrascht, wie, ehm, messy, die gemessene Natur sein kann. Doch dazu mehr später.

Die Temperatur zu messen ist wohl am niederschwelligsten und wir können sie z.B. brauchen um über den noch freien Ausgang am Motor Shield (M4) einen PC-Lüfter in der Abdeckung ein- und auszuschalten.

Das Arduino Starter Kit enthält einen TMP 36 Temperatursensor. Damit können erste Experimente gemacht werden. Dieser Sensor liesse sich auch leicht in ein Metallröhrchen eingiessen und ins Aquarium hängen (Anleitungen im Internet). Ich habe es mir etwas leichter gemacht und diesen robusteren Sensor gekauft:

https://www.atlas-scientific.com/product_pages/sensors/env-tmp.html

Angeschlossen wird er ganz einfach: +, - und Analogeingang für die Temperaturmessung.

Die Temperaturmessungen müssen stark geglättet werden (Durchschnitt von mehreren Messungen kurz nacheinander nehmen), weil die gemessenen Werte, eben, messy sind. Hier ein Beispiel aus meinem Code für Atlas Scientific ENV-TMP:

Code:
temperature = (((analogRead(temperaturePin)/1024.0) * 5.0) * 51.2) - 20.5128;  
// Werte glätten über 1000 einzelne Messungen
tempAverage = tempAverage - ((tempAverage - temperature)/1000.0);

Die gemessenen Werte sind auch abhängig von der genauen Voltzahl auf dem Arduino-Board (in der Formel oben als Konstante 5.0V angenommen). Ich habe aber keine nennenswerte Verbesserung der Messwerte durch den Einbezug der realen Voltzahl feststellen können. Anfangs sollte das korrekte Funktionieren der Temperaturmessung mit anderen Methoden (z.B. einem konventionellen Thermometer) geprüft werden und es schadet nicht, diese Prüfung gelegentlich zu wiederholen.

Den ganzen Code, der rasche Temperatur-Veränderungen und Über- bzw Unterschreitungen von bestimmten Temperaturen feststellt habe ich wieder aus dem Projekt genommen. Irgendwie gelang es mir nicht, den Mechanismus so zu bauen, dass wirklich zuverlässig gefährliche Situationen erkannt wurden. Rasche Veränderungen sind zudem in meinem neuen, grossen Becken recht unwahrscheinlich und starke Überschreitungen oder Unterschreitungen eines Wertes auch eher nicht. Die schwache Bodenheizung (ja, ich weiss), die hohe Raumtemperatur und die Lampen halten die Temperatur recht hoch, eine Heizung die überhitzen könnte brauche ich aus diesem Grund nicht und die Kühlung (PC-Kühler) schaltet der Arduino nur über bestimmten Temperaturwerten ein. Momentan besteht in meinem Setup also kaum Gefahr für wirklich starke Abweichungen von den Zielwerten, hoffe ich.

Beste Grüsse

Chris
 

MajorMadness

Active Member
thisischris":e5aqpdbg schrieb:
Da würde mich Deine Erfahrung interessieren: hast Du es je erlebt, dass sich der Arduino "aufhängt", d.h. abstürzt und stehen bleibt, aber nicht neu startet?
Jup, alles schon geschafft. :D Meist dadurch das der in einer berechnung zuviel Ram braucht und dadurch einfach nicht weiter macht.
Problem am Delay ist ja das er anhält. Gut, dadurch ist das risiko des abstürzens geringer während er Pumpt aber er macht ja nix anderes. Bei mal kurz nur Pumpen ist das egal doch wenn dein Projekt größer wird (was abzusehen ist :lol: :bier: ) unterbrichst du den loop und keine Sensoren, Pins ect werden angesteuert. Auch Display oder Tasten werden nicht angesprochen und das Signal geht verlohren ODER bringt in dadurch zum Absturz. Ein delay von 1-5ms kann Sinnvoll sein wenn man z.b. einen Sensor anspricht und "Zeit" braucht bis er ein Signal verarbeitet hat und das nächste empfangen kann, sollte aber außerhalb von Hardware ansprechen nie verwendet werden.
Die Timer.h verwendet milli() um die Eve3nts und callbacks zu triggern was sehr zuverlässig ist solange dein loop schnell läuft. Ansonsten gibt es noch die sicherste methode über Hardware Interrups die immer triggern, die lib TimerOne verbraucht aber zuviel speicher. Ne Sinnvolle umsetzung der internen Interups für Dosierpumpen steht auch noch auf meiner todo liste. Solange der Code aber Stabil läuft (findet man nach einem Tag raus) erfüllt die timer.h sehr gut ihren dienst und Display und Keypad sind kein Problem während des Düngens.

thisischris":e5aqpdbg schrieb:
Die Alarme von TimeAlarm werden übrigens nachgeholt falls sie während eines Delays eingetreten wären, das habe ich geprüft. D.h. das Licht würde dann einfach ein paar Sek. später ausgemacht.
Mir ist beim durchsehen deines Codes und libs was anderes aufgefallen bzw ne alternative zu delay:
Code:
void Fertilize(){
  if(pump1Volume > 0.0){
     pump1->run(FORWARD);
     Alarm.timerOnce(int(60 * pump1Volume / pumpCapacity ), pump1release);
    // delay((int) (pump1Volume / pumpCapacity * 1000.0));
     pump1->run(RELEASE);
  }
   .......
  Serial.println(F("ST Fertilization done"));
}
void pump1release(){
     pump1->run(RELEASE);
}
auf die Art bist du den delay los, kannst aber nur sekundengenau pumpen. Ich hatte die lib selber nicht im Einsatz, nach der beschreibung
Creating Timers

Timers call a function at regular intervals.

Alarm.timerOnce(seconds, function);
Create a timer that will call a function once in "seconds".
Müsste das aber passen und gleich sein zu der funktion in timer.h die ich verwende.
 

Ähnliche Themen

Oben