Meerwasser

Aquarium Computer

Der Begriff Computer ist vielleicht etwas hochgegriffen. Eine Aquariumsteuerung ist vielleicht eher die Beschreibung zu diesem Projekt, aber ich denke, wir wissen was gemeint ist. Dieser Beitrag wird in der folgenen Dokureihe auf Youtube gezeigt: -> LINK

In der Vergangenheit habe ich immer auf bereits fertige „Module“ wie z.B. Zeitrelais zurückgegriffen, um eine automatische Nachspeisung, oder die Temperaturregelung zu realisieren. Jetzt ist es an der Zeit, den Horizont zu erweitern. Das Ganze darf natürlich nicht ewig dauern und nach ein paar Gesprächen, habe ich mich dazu entschlossen einen Arduino Uno zu bestellen. Das das Ganze nur 10€ kostet, gibt dem ganzen einen entspannten Beigeschmack. Falls es scheitert…. nicht so schlimm.

Die Software zum programmieren findest Du hier:

https://www.arduino.cc/

Die Möglichkeiten sind fast unbegrenzt und erschlagen einen zuerst, aber es gibt so viele gute Tutorials auf Youtube, dass ich schon nach 5 Minuten den erste erfolgt hatte. Sketch aus den Vorlagen auf den Arduino kopiert, fertig.

Programmiert wird das in C und C++, aaaaber… wenn Du denkst, dass ich jetzt Bücher lese und die Sprache auswendig lerne, ne. Keine Zeit! Das muss schneller gehen. Ich ändere bestehende Programme und lerne so das ganze zu verstehen.

Folgendes möchte ich in der ersten Ausbaustufe realisieren:

  • automatische Nachspeisung von VE-Wasser
  • Temperaturanzeige auf einem kleinen OLED Display
  • Lüftersteuerung für den Sommer zur Kühlung
  • RGB Stripe Steuerung und Zustandsmeldung falls ein Alarm vorliegt

In der Zweiten, später folgenden Ausbaureihe, könnte ich mir eine PWM Steuerung für Pumpen, Heizungsregelung, Fütterungsbetrieb etz. vorstellen. Das benötige ich jedoch nicht bei dem 30l Becken.

In diesem Beitrag, wirst Du das Programm finden und auch alle Komponenten zum nachbauen. Ebenfalls einen Verdrahtungsplan.

Einkaufsliste (Amazon Links)

Arduino Uno: Kostet ca. 10€ https://amzn.eu/d/hFOhr13

OLED Display 0,96″ SSD1306: Kostet ca. 5€

Temperatursensor DS18B20 onewire: Kostet ca. 2€

Die Einkaufsliste wird natürlich noch aktualisiert!

Schritt 1:

Ich beginne vorerst mit der Anzeige der Temperatur. Hierfür habe ich mir einen DS18B20 one wire Temperatursensor bestellt. Dieser ist vielleicht noch nicht der, den ich einsetzen möchte, aber zur Übung, einfach mit dem Arduino einzubinden. Der Sensor benötigt nur die 5V Spannungsversorgung (5V+ und GND) vom Arduino und die Signalleitung (gelb) geht direkt auf einen Eingang am board. Zusätzlich muss man jedoch einen 4,7kOhm Widerstand von der Signalleitung auf die 5V+ legen, sonst funktioniert es nicht.

Der Sensor hat zwar einen Edelstahlmantel und wirkt vielleicht etwas träge, da die Meerwassertemperatur jedoch nicht so extrem schnell schwankt, wird das wohl so reichen. INS Wasser möchte ich jedoch den Sensor nicht verbauen, ich messe später am Becken, indirekt. – Ob´s reicht?

Das OLED Display hat eine Auflösung von 128×64 Bildpunkten und macht schon echt Laune. Mit den kleinen Displays kann man schon richtig schön rumspielen, doch was es dann wirklich anzeigt, liegt am Programmierer 😀

Ich habe ca. 2h versucht die Temperaturanzeige selber zu programmieren, dann habe ich einfach mal in die KI von ChatGPT als Suche eingegeben: Arduino, DS18B20, OLED Display anzeigen eingegeben und zack, kommt ein brauchbarer Code, mit dem gut weiterarbeiten kann.

Ich möchte zusätzlich noch folgendes auf dem Display anzeigen:

  • Wasserlevelstatus des Aquariums vom Niveauschalter: OK / !
  • VE-Nachspeisebehälter Wasserstand: OK / !
  • Lüfter aktiv bei einer Temperatur >27°C: Bitmap Lüfter sichtbar
  • Störungssymbol bei Fehler mit Schaltung der RGB auf rot: Bitmap ! sichtbar

Da ich keine Ahnung vom Programmieren habe, dauert das bis zur Vollendung noch etwas, ach, und da sind dann noch die anderen 100 Hobbys.

– – – Nach dem Code geht´s weiter – – –

//Hier der Code für Schritt 1:


#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <OneWire.h>
#include <DallasTemperature.h>

#define ONE_WIRE_BUS 2
#define OLED_RESET -1
Adafruit_SSD1306 display(OLED_RESET);

void setup() {
  // Initialisieren Sie das OLED-Display
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  // Löschen Sie den Bildschirm
  display.clearDisplay();

  display.setTextColor(WHITE);
}

void loop() {
  // DS18B20-Objekt instanziieren
  OneWire oneWire(ONE_WIRE_BUS);
  DallasTemperature sensors(&oneWire);
  // Messung starten
  sensors.begin();
  sensors.requestTemperatures();
  // Temperatur lesen
  float temp = sensors.getTempCByIndex(0);
  // Anzeige aktualisieren
  display.clearDisplay();
  display.setCursor(0,0);
  display.setTextSize(1);
  display.print(„Wasserstand:“);
  display.setCursor(0,10);
  display.setTextSize(1);
  display.print(„VE-Wasser:“);
  display.setCursor(72,25);
  display.print(temp, 2);
  display.setTextSize(2);
  display.setCursor(118,25);
  display.setTextSize(1);
  display.print(„C“);
  display.setCursor(109,22);
  display.setTextSize(1);
  display.print(„o“);
  display.display();
  // Verzögerung zwischen den Messungen
  delay(1500);
}

– – – – – – Aktueller Stand: 21.04.23 – – – – – – –

Schritt 2:

Ich bin jetzt in einen Holzkoffer umgezogen, je mehr das Projekt an Umfang gewinnt, desto mehr können sich Fehler einschleichen, wenn ein Kontakt nicht richtig im Breadboard steckt. So kappe ich den KRam einfach zu und alles bleibt an seinem Ort.

Was hat sich getan, der Schwimmerschalter (oben links) soll später den Wasserstand im VE-Tank überwachen, damit die Pumpe nicht trocken laufen kann. Ist etwas überzogen, aber das kommt von meiner Vergangenheit in der Industrie. Der Zustand – Wassertank ist voll – wird im Moment noch mit 1=voll und 0=leer visualisiert.

Der kontaktlose Füllstandssensor (unten links) wird durch das Acrylglas den Wasserstand detektieren, da ich ja keine Technik im Becken sehen will. Also so wenig wie möglich. Dieser meldet im Moment noch den Füllstand mit 1=voll und 0=zu wenig.

Wenn nun der Schwimmerschalter einen vollen VE-Tank meldet und der Füllstandssensor merkt, dass Wasser fehlt, wird eins der blauen Relais (unten rechts) angesteuert, wo die Spannungsversorgung der Nachspeisepumpe geschaltet wird und das Aquarium seinen Füllstand so konstant halten kann. Das ist je extrem wichtig, da ich einen definierten Überlauf für den Oase Biomaster 350 Thermo benötige. Bleibt der Füllstand nicht gleich, zieht der Filter Luft (ich plane keinen variablen Skimmer!)

Da ich im Moment keinen Lüfter habe, der ein PWM Signal direkt verwerten kann, also die Drehzahl abhängig von der Temperatur geregelt wird, habe ich ein Mosfet zur Regelung des Lüfters dazu genommen. Was jetzt als nächstes an Programmieraufwand kommt, ist, dass der Lüfter zwischen zwei Sollwerten z.B. 26°C – 28°C seine Lüfterleistung von 0-100% anpasst.

– – – Nach dem Code geht´s weiter – – –

//Hier der Code für Schritt 2:

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <OneWire.h>
#include <DallasTemperature.h>

#define ONE_WIRE_BUS 3
#define OLED_RESET -1
Adafruit_SSD1306 display(OLED_RESET);

int Wasserstand;
int VETank;
int Level = 8;
int Tank = 11;
int Nachspeisung = 9;


void setup() {
  // Initialisieren Sie das OLED-Display
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  // Löschen Sie den Bildschirm
  display.clearDisplay();

  display.setTextColor(WHITE);
  pinMode(Level, INPUT);
  pinMode(Nachspeisung, OUTPUT);
  pinMode(Tank, INPUT);
  Serial.begin(115200);
}

void loop() {
  // DS18B20-Objekt instanziieren
  OneWire oneWire(ONE_WIRE_BUS);
  DallasTemperature sensors(&oneWire);
  // Messung starten
  sensors.begin();
  sensors.requestTemperatures();
  // Temperatur lesen
  float temp = sensors.getTempCByIndex(0);
  // Anzeige aktualisieren
  display.clearDisplay();
  display.setCursor(0, 0);
  display.setTextSize(1);
  display.print(„Wasserstand:“);

  display.setCursor(90, 0);
  display.setTextSize(1);
  display.print(Wasserstand);

  display.setCursor(90, 10);
  display.setTextSize(1);
  display.print(VETank);

  display.setCursor(0, 10);
  display.setTextSize(1);
  display.print(„VE-Wasser:“);

  //Temperaturanzeige auf dem Display
  display.setCursor(72, 25);
  display.print(temp, 2);
  display.setTextSize(2);
  display.setCursor(118, 25);
  display.setTextSize(1);
  display.print(„C“);
  display.setCursor(109, 22);
  display.setTextSize(1);
  display.print(„o“);
  display.display();

  // Verzögerung zwischen den Messungen
  // delay(500);

  Wasserstand = digitalRead(Level);
  VETank = digitalRead(Tank);
  //Serial.println(„Wasserstand“);
  // Serial.println(Wasserstand);
  //Serial.println(„VETank“);
  // Serial.println(VETank);



  if (Wasserstand == 0 && VETank == 1) {
    digitalWrite(Nachspeisung, HIGH);
    delay(500);
  }
  if (Wasserstand == 1) {
    digitalWrite(Nachspeisung, LOW);
  }
}

5 4 votes
Article Rating
Abonnieren
Benachrichtige mich bei
guest

1 Kommentar
Oldest
Newest Most Voted
Inline Feedbacks
View all comments