AquaGrow Platine Software und Einstellungen

Der Letzte Schritt zum Funktionierenden Aquariencontroller: Software runter Laden und auf den Controller überspielen.

Hierzu brauchen wir erstmal die Arduino Umgebung und alle nötigen Treiber. Hierzu möchte Ich auf die Arduino Dokumentation unter http://arduino.cc/de/Guide/HomePage verweisen.

Den Code den man braucht um alle Komponenten steuern zu können findet Ihr unter http://svn.ravendev.de. Hierbei gibt es 2 wichtige Ordner:
Development -> Der Ordner an dem Ich immer mal wieder arbeite. Alles was hier drin ist ist evt nicht funktionsfähig.
Finals -> Lauffähiger und getesteter Code. Final steht hierbei nicht für Final, sondern nur dafür das es läuft. Der Code ist work in progress und wird evt immer mal wieder geändert und erweitert.

Wichtig ist zuerst einmal das Ihr euch die Ordner unter /Finals/arduino-1.0.4/libraries/ runter ladet und installiert. Diese libs werden Zwangsläufig benötigt.
Unter /Finals/MAQ/ ist das Eigentliche Programm/ der Code für den Controller. Diesen könnt Ihr komplett runter laden, entpacken und in Arduino öffnen.

Besondere Programmteile möchte Ich euch noch kurz erklären.

Zuerst einmal alle tabs die Ihr im oberen Rand seht. Hierbei steht jeder für eine Rubrik an Funktionssammlungen die zur Übersicht gesplittet wurden.

tabs

 

MAQ Ist der Hauptcode, Clock alles was unsere Uhr betrifft, Display die grafische Ausgabe, Duengung unsere Dosiereinheit, Functions Hilfsfunktionen ohne zugehörigkeit, Licht für alles was man dimmen kann (inc 10V Schnittstelle) und Menü mein Sorgenkind. ;)

Zuerst sollten wir mal schauen das die Parameter die wir einstellen müssen stimmen.

Display:
Hierbei ist wichtig das wir die richtige Adresse auswählen. Wir schauen also auf unsere Platine und suchen den IC2, neben dem Poti. Dieser trägt entweder die bezeichnung PCF8574P oder PCF8574AP.
Nun suchen wir die Zeile

1
LiquidCrystal_I2C lcd1( 0x38 ,20,4,LCD_BL); // LCD Adress / Chars / Rows / PWM Pin

Im Falle des PCF8574P muss 0x38 in 0x20 geändert werden.
Nun gibt es 2 Methoden um das Hintergrund Licht des Displays zu steuern: Automatisch und Manuell. Hierfür sind weiter unten die Zeilen

1
2
// lcd1.backlight(DaylightLevel*2.55);
lcd1.backlight(255);

zuständig. Die obere steht dafür für ne Automatische Anpassung nach „Tageslicht“, die untere für immer ganz an. Als Zahl kann man alles zwischen 1 und 255 eingeben, wobei 255 das Hellste ist.
Das was auf dem Display erscheint findet Ihr unter „Display“ und dann in der Funktion main_Screen(). Die könnt Ihr anpassen um sie nach euren wünschen zu gestalten.

Temperatursensoren:
Jeder Sensor ha teine eigene ID. Diese muss erstmal ausgelesen werden und dann eingetragen werden, so das der Controller bescheid weis. Öffnet am Besten den Beispiel Sketch ds18b20_demo. Ladet den auf euren Controller und schaut im Serial Monitor welche ID’s es gibt und welcher Sensor welche hat. Ihr müsst aber im Beispiel den Pin auf 44 ändern:

1
DS18B20_List ds18b20(44);

Dann sucht Ihr unter MAQ die Zeilen

1
2
#define TempOnBoard 0xC7B5
#define TempWater 0xBFAE

und ändert Sie passend ab.
Bisschen weiter unten finden wir noch die Temperatur.

1
2
//WasserTemperatur
float Water_Temp = 25.5;

Damit die Heizung nicht zu schnell schaltet wird immer +-1°C geregelt. 25.5 heist also das bei 25 geheizt wird und bei 26 es aus geht.

Relays: 
Nun geht es noch daran die Richtigen Pins den Relays zu zu ordnen.

1
2
3
4
5
6
7
8
const int RELAY1 = 23;  // Heizung
const int RELAY2 = 25;  // Netzteil LED
const int RELAY3 = 27;  // Filter
const int RELAY4 = 29;  // CO2
const int RELAY5 = 31;
const int RELAY6 = 33;
const int RELAY7 = 35;
const int RELAY8 = 37;

Licht und Dimmung: 
Die Dimmung ist etwas komplexer. Sie besteht aus 2 Teilen: Ein Array was alle gespeicherten Werte enthält und ein struct was die Werte interpretiert. Schauen wir uns zuerst einmal das Struct an:

1
2
3
4
5
6
7
8
9
10
typedef struct {
boolean Active;    // Über diesen Kanal Dimmen
float Sunrise;    // Zeit Sonnenaufgang
float Sunset;    // Zeit Untergang (Dunkel)
int Min;     // Minimum Helligkeit
int Max;    // Max Helligkeit
int Dim_in;    // Länge minuten eindimmen
int Dim_out;    // Länge Minuten ausdimmen
boolean Invert;  // Werte vertauschen
}LIGHT;

Was bedeutet das für uns? Jeder Kanal hat diese ganzen Einstellmöglichkeiten und wir können festlegen wann eine Lampe an/aus geht, wie hell die minimal/maximal ist und wie lange das ein/ausdimmen geht. Manche EVG’s und KSQ arbeiten nach anderen Prinzipien. So kann es passieren das 0 = ganz an und 100% ganz aus ist. Das legen wir über Invert fest. Doch wo stellen wir das Jetzt ein?

1
2
3
4
5
LIGHT light_channels[20] = { 
{ 0, get_ts(10,0,0), get_ts(23,0,0),0, 100, 30, 45,1}, 
{ 0, get_ts(10,30,0), get_ts(22,0,0),0, 100, 60, 120,1}, 
.....
.....

Genau hier. Die Reihenfolge ist gleich zum Struct oben. Doch anstelle von Zeiten ein zu geben benutzen wir ne kleine hilfsfunktion:
float get_ts(int h, int m, int s) macht nix anderes als eine Uhrzeit mit Komma getrennt in Sekunden um zu rechnen. also 10,0,0 steht für 10:00:00 Uhr, 10,30,0 für 10:30:00Uhr.
Noch wichtig ist die Zeile

1
2
3
4
5
6
7
//Abweichung für Tageslicht basierten Verlauf
int LightOffset[24]={
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0,
0,0,0,0,0,0
};

Hiermit können wir einen Tagesverlauf festlegen. jede Zahl steht dabei für eine Stunde. Wenn man jetzt eine 10 an 12ter Stelle schreibt bedeutet das das es um 12:00Uhr 10% Heller ist. -10 bedeutet 10% dunkler. Beachtet das 110% nicht möglich ist. Also wer seinen Kanal schon auf max 100 gestellt hat wird nix regeln können.

Uhrzeit:
Bleibt noch die Aktuelle Zeit. Hierfür finden wir in Clock 2 Zeilen:

1
2
  TimeIsSet = 0xffff;
RTC.setRAM(54, (uint8_t *)&TimeIsSet, sizeof(uint16_t));

Wenn wir den Sketch hoch laden wird automatisch die PC Zeit in die Uhr geschrieben. Es gibt aber einen Nachteil: Im Falle eines Resets wird diese Zeit wieder genommen. Da wir aber eine Backup Batterie haben und nicht immer diese Uhrzeit nehmen wollen, müssen wir den Sketch 2 mal hochladen. Einmal mit diesen Zeilen so wie sieh stehen, einmal mit auskommentierten Zeilen:

1
2
 // TimeIsSet = 0xffff;
// RTC.setRAM(54, (uint8_t *)&TimeIsSet, sizeof(uint16_t));

Wer mal testen möchte wie das Licht um irgend eine andere Zeit ist oder einfach eine Falsche Zeit einstellen möchte, der kann im Block unter diesen Zeilen den Wert manuell setzen.

Dünger:Bleibt noch der Dünger. Hierfür müssen die Düngermengen und Düngerzeiten angepasst werden.

1
2
3
4
5
6
7
8
9
10
11
12
// Düngermengen
float duenger1 = 3.00;    // Spezial N 1ml/50L
float duenger2 = 1.00;    // Spezial Flowgrow 2ml/100L
float duenger3 = 2.00;    // Mikro Basis Eisen 2ml/100L
float duenger4 = 1.00;
float duenger5 = 3.00;    // Estimate Index 5ml/40l
//Dünger Zeiten
float d1Time= get_ts(9,0,0);    // 9:00
float d2Time= get_ts(10,0,0);
float d3Time= get_ts(11,0,0);    // 11:00
float d4Time= get_ts(20,0,0);    // 18:00
float d5Time= get_ts(21,0,0);    // 12:00

Das sind quasi meine Mengen die Ich täglich dünge. Für die Zeiuteinstellung nehmen wir wieder unsere funktion get_ts(). Mit kleiner anpassung kann man auch 2 mal täglich einen dünger düngen. Wir müssen nur eine neue Variable für die Zeit schaffen und dann die passende Funktion:

1
2
//Achtung, dies ist keine Standart Variable, Sie kommt von mir!
float d2Time1= get_ts(15,0,0);

Und unter dem Reiter/Tab Duenger

1
2
3
4
5
  if(Daystamp>=d2Time1 && Daystamp<d2Time1+duenger2&&digitalRead(TIP2)==LOW){
digitalWrite(TIP2,HIGH);
}else if((Daystampd2Time1+duenger2) && digitalRead(TIP2)==HIGH){
digitalWrite(TIP2,LOW);
}

2 Kommentare auf “AquaGrow Platine Software und Einstellungen

  1. Hey Moritz,

    hab grad mal durch Deinen Blog geschaut. Dabei ist mir Deine LCD Backlight PWM Funktin aufgefallen, die ich bei mir auch aktivieren möchte. Hast Du da die Lib angepasst? bei meiner I2C Lib gibts eine Fehlermeldung beim Kompilieren.

    Ich komme auch nicht an die SW. Mit Deinem SVN stimmt irgendetwas nicht!

    Gruß,

    Volker

    • Hallo, Ja das ist richtig, Ich habe einige meiner libs umgeschrieben um Sie mir passend zu machen. ;) Das der SVN streigt ist eider bekannt, nach nem Hardware fehler im Rechenzentrum ist dieses noch nicht wieder her gestellt da auch sensible Daten evt überschrieben wrden beim Backup der Hardware. Ich muss daher warten bis Ich ins Rechenzentrum komme um Die Festplatte aus zu bauen.
      Diese und andere libs die Ich für mein Projekt verwende kannst du dir aber aus meiner Dropbox unter https://www.dropbox.com/s/bpwjodoyb0vfn2w/libraries.zip ziehen. Da ist auch nen kleiner Mod der DS1307 bei um die Uhrzeit des PC’s zu übernehmen. ;)

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.