MajorMadness
Active Member
Hallo zusammen,
angelehnt an den Beitrag von Riff Aquaristik und durch meine Bastelei grade möchte ich für Flowgrow auch mal das Projekt eines AQ Computers starten.
Schwerpunkt hierbei soll natürlich auf den Pflanzen liegen und uns das Düngen und die AQ Steuerung abnehmen. Gplant ist dies ebenfalls als Roll up Treat zum nachbauen. Ich fange also an mit den Basics und wir werden das Projekt immer erweitern bis der Comuter fertig ist. Einfach zum nachbauen und/oder nachvollziehen um selbst etwas zu entwickeln.
Am Anfang aber eine Warnung:
Wir werden mit Strom im AC und DC Bereich mit bis zu 250Volt arbeiten, Kabel anschliessen, löten und mit Temperaturen über 70° uns beschäftigen müssen. Dies sollte nur mit Kenntnissen oder unter aufsicht geschehen!
Fangen wir also einmal an mit der ersten Planung. Was wollen wir am Ende haben?
Eine AQ Steuerung. Toll, das kann alles sein, also bischen genauer. Was wollen wir steuern?
Licht. Klar, ohne das wachsen Pflanzen ja nicht.
Dünger. Jup den brauchen wir.
Temperatur. Klar, mir ist ja auch grade kalt.
PH. Sehr wichtig für gutes Pflanzenwachstum.
Mondlicht/Sonnen auf-, untergang. Warum eigentlich nicht?
Verlaufskurve der Werte. Wir wollen ja nicht immer aufs Display schauen.
Display. Worauf sollen wir sonst schauen?
Filterkontrolle? Füllstand? Wasserwechsel? Warten wir mal ab...
Jemand noch Ideen was ein must have ist? Postet es und wir werden schauen. :bier:
Nun dann, Genug der Einführung, wir wollen beginnen.
Zuerst brauchen wir einmal das Herzstück. Wie manche schon ahnen wird dies ein Arduino sein. Gründe sind ganz einfach:
Er ist klein, einfach zu programmieren (Programmierkenntnisse voraus gesetzt, ansonsten viel probieren), nicht zu teuer, einfach zu beschaffen und zu erweitern.
Ich hab mich für das Mega2560 Board entschieden da es 40 Digital Pins, 14 weitere Digital PWM und 16 Analoge Inputs hat. Kostet in China 15€, Deutsches Lager 25€, Deutscher Shop 47€.
Als nächstes brauchen wir dann noch einige andere sehr wichtige Grund Dinge: eine Uhr (RTC -> Real Time Clock), Breatboard (Steckbrett) zum testen, Jumper wires (Steckbrettkabel) und wer für später schn mitkaufen möchte eine Leiterplatte (Streifen oder IC-Platine), Kabel (Telefonkabel mit Rot,Gelb,Schwarz,Weiss,Grün,Braun ist klasse und günstig), Stiftleisten, Stecker. Das müsste es erstmal sein. Finden können wir alles in der Bucht oder bei Contrad. Wer in der Bucht grade surft und über etwas stolpert was sich TIP122 (10x), BC547 (20x), BC557 (5x), PCF8574 (2x), LM324 (4x) heisst kann das in einem mit bestellen. Wir werden nicht alles brauchen, aber die Menge kommt so schon hin.
Ausserdem werden wir noch Elkos (4,7µF,10µF,und paar andere) und Widerstände (3,3ohm, 1k, 2,2k, 10k, 22k, 200ohm und andere) brauchen. Dann noch nen paar Minitaster, Potis (10k) und natürlich Lötkolben, Cuttermesser, Zinn, Voltmeter und viiiiiel Geduld.
Jetzt gehts aber endlich los:
Die Uhr: Welche nehmen wir? Im Prinzip haben wir 3 Möglichkeiten. Wir holen uns ein fertiges RTC-Modul (Breackout) mit DS1307 Chip, wir besorgen uns den DS1307+Quarz+Batterie einzeln oder wir versuchen den Ti BQ3200 + Quarz und Batterie zu bekommen. (Kleiner Tip hier am Rande -> Texas Instrument hat nen Free Sample Programm wo man immer mal wieder gute Chips für lau bekommt )
Auch wenn das Löten der eigenen RTC nicht so schwer ist, fangen wir doch mal einfach an und nehmen das fertige Modul. Kostet 8€ bei Komputer.de und ist das einfachste. Kommentare wie "oder in der Bucht" spar Ich mir ab sofort direkt und verlinke nur noch Shops.
Stecker oder Kabel müssen wir leider trotzdem dran Löten (zumindest bei meiner) und dann können wir das anschliessen.
5V an 5V
Ground an Ground
SDA an SDA (Mega Pin 20)
SDL an SDL (Mega Pin 21)
Wir laden uns die DS1307 lib ins lib verzeichniss und Starten nen Test Scratch. Und siehe da: Nix klappt. Komische Zeichen und Schrott. Also Modul kaputt und neues gekauft. STOP! Nein das ist leider etwas was passieren kann. probiert daher die DS1307new aus. Es war auch die einzige lib die bei mir die Uhr ans laufen brachte...
Wer nicht weis was Ich hier grade schreibe oder wovon ich rede, der möchte bitte einmal unter http://arduino.cc/en/Guide/HomePage nachlesen.
Sodale, wir haben viel geschafft. Ne menge Geld ausgegeben und eine Uhr gebaut die nur am PC läuft. Naja, wir haben nen Beispiel geöffnet. Damit das für uns etwas nützliches ergibt legen wir uns einmal ein neues Projekt an wo wir unsere Sachen Speichern.
Also Datei/Neu geklickt, dann Datei/Speichern unter und nen kreativen Namen überlegen. Meins heist "Mein AQ"... Sehr kreativ. :stumm:
In unserem neuen Sketch können wir dann erstmal ne Basisstruktur aufbauen:
Wow, das sieht ja schon mal toll aus.
Damit unsere Uhr funktioniert müssen wir diese Initialiesieren und einiges aufrufen. Der übersichtshalber machen wir das in der Datei Clock:
OK, was ist hier passiert? Es gibt nun eine Funktion setupClock(). Diese macht nix anderes als die Uhr (unser RTC Modul) zu initialisieren und wenn nötig ein neues Datum speichern. (Hierzu einfach ganz oben /* */ entfernen und paar zeilen drunter RTC.fillByYMD(2012,12,31); RTC.fillByHMS(2,27,0); mit eigenen werten ersetzen.)
Dann gibt es jetzt String printTime(), eine funktion die uns die Uhrzeit als string (Text) zurück gibt und String printDate() die das gleiche mit Datum macht. Ausserdem eine Funktion get_ts(int h, int m, int s). Diese rechnet uns eine Uhrzeit (z.B. 9:30) in einen Timestamp um. Dies brauchen wir später um Uhrzeiten zu vergleichen.
Man erkennt, Ich hab viel auskommentiert (// oder /*text*/), das könnte man auch löschen.
Jetzt noch mal schnell auf unsere erste Seite (MeinAQ) und die Funktion setupClock(); in die void setup() kopiert:
Damit das ganze auch mal Sinn ergibt was wir hier gemacht haben, Lasst uns das mal im serial Monitor ausgeben:
Mein Arduino hängt leider am AQ dran, Ihr müsstet aber jetzt jede Sekunde das Datum und die Zeit sehen.
Ich mach an der stelle Jetzt mal schluss, wenn es euch gefällt setz Ich mich die Tage wieder dran und es geht weiter.
Beste Grüße
angelehnt an den Beitrag von Riff Aquaristik und durch meine Bastelei grade möchte ich für Flowgrow auch mal das Projekt eines AQ Computers starten.
Schwerpunkt hierbei soll natürlich auf den Pflanzen liegen und uns das Düngen und die AQ Steuerung abnehmen. Gplant ist dies ebenfalls als Roll up Treat zum nachbauen. Ich fange also an mit den Basics und wir werden das Projekt immer erweitern bis der Comuter fertig ist. Einfach zum nachbauen und/oder nachvollziehen um selbst etwas zu entwickeln.
Am Anfang aber eine Warnung:
Wir werden mit Strom im AC und DC Bereich mit bis zu 250Volt arbeiten, Kabel anschliessen, löten und mit Temperaturen über 70° uns beschäftigen müssen. Dies sollte nur mit Kenntnissen oder unter aufsicht geschehen!
Fangen wir also einmal an mit der ersten Planung. Was wollen wir am Ende haben?
Eine AQ Steuerung. Toll, das kann alles sein, also bischen genauer. Was wollen wir steuern?
Licht. Klar, ohne das wachsen Pflanzen ja nicht.
Dünger. Jup den brauchen wir.
Temperatur. Klar, mir ist ja auch grade kalt.
PH. Sehr wichtig für gutes Pflanzenwachstum.
Mondlicht/Sonnen auf-, untergang. Warum eigentlich nicht?
Verlaufskurve der Werte. Wir wollen ja nicht immer aufs Display schauen.
Display. Worauf sollen wir sonst schauen?
Filterkontrolle? Füllstand? Wasserwechsel? Warten wir mal ab...
Jemand noch Ideen was ein must have ist? Postet es und wir werden schauen. :bier:
Nun dann, Genug der Einführung, wir wollen beginnen.
Zuerst brauchen wir einmal das Herzstück. Wie manche schon ahnen wird dies ein Arduino sein. Gründe sind ganz einfach:
Er ist klein, einfach zu programmieren (Programmierkenntnisse voraus gesetzt, ansonsten viel probieren), nicht zu teuer, einfach zu beschaffen und zu erweitern.
Ich hab mich für das Mega2560 Board entschieden da es 40 Digital Pins, 14 weitere Digital PWM und 16 Analoge Inputs hat. Kostet in China 15€, Deutsches Lager 25€, Deutscher Shop 47€.
Als nächstes brauchen wir dann noch einige andere sehr wichtige Grund Dinge: eine Uhr (RTC -> Real Time Clock), Breatboard (Steckbrett) zum testen, Jumper wires (Steckbrettkabel) und wer für später schn mitkaufen möchte eine Leiterplatte (Streifen oder IC-Platine), Kabel (Telefonkabel mit Rot,Gelb,Schwarz,Weiss,Grün,Braun ist klasse und günstig), Stiftleisten, Stecker. Das müsste es erstmal sein. Finden können wir alles in der Bucht oder bei Contrad. Wer in der Bucht grade surft und über etwas stolpert was sich TIP122 (10x), BC547 (20x), BC557 (5x), PCF8574 (2x), LM324 (4x) heisst kann das in einem mit bestellen. Wir werden nicht alles brauchen, aber die Menge kommt so schon hin.
Ausserdem werden wir noch Elkos (4,7µF,10µF,und paar andere) und Widerstände (3,3ohm, 1k, 2,2k, 10k, 22k, 200ohm und andere) brauchen. Dann noch nen paar Minitaster, Potis (10k) und natürlich Lötkolben, Cuttermesser, Zinn, Voltmeter und viiiiiel Geduld.
Jetzt gehts aber endlich los:
Die Uhr: Welche nehmen wir? Im Prinzip haben wir 3 Möglichkeiten. Wir holen uns ein fertiges RTC-Modul (Breackout) mit DS1307 Chip, wir besorgen uns den DS1307+Quarz+Batterie einzeln oder wir versuchen den Ti BQ3200 + Quarz und Batterie zu bekommen. (Kleiner Tip hier am Rande -> Texas Instrument hat nen Free Sample Programm wo man immer mal wieder gute Chips für lau bekommt )
Auch wenn das Löten der eigenen RTC nicht so schwer ist, fangen wir doch mal einfach an und nehmen das fertige Modul. Kostet 8€ bei Komputer.de und ist das einfachste. Kommentare wie "oder in der Bucht" spar Ich mir ab sofort direkt und verlinke nur noch Shops.
Stecker oder Kabel müssen wir leider trotzdem dran Löten (zumindest bei meiner) und dann können wir das anschliessen.
5V an 5V
Ground an Ground
SDA an SDA (Mega Pin 20)
SDL an SDL (Mega Pin 21)
Wir laden uns die DS1307 lib ins lib verzeichniss und Starten nen Test Scratch. Und siehe da: Nix klappt. Komische Zeichen und Schrott. Also Modul kaputt und neues gekauft. STOP! Nein das ist leider etwas was passieren kann. probiert daher die DS1307new aus. Es war auch die einzige lib die bei mir die Uhr ans laufen brachte...
Wer nicht weis was Ich hier grade schreibe oder wovon ich rede, der möchte bitte einmal unter http://arduino.cc/en/Guide/HomePage nachlesen.
Sodale, wir haben viel geschafft. Ne menge Geld ausgegeben und eine Uhr gebaut die nur am PC läuft. Naja, wir haben nen Beispiel geöffnet. Damit das für uns etwas nützliches ergibt legen wir uns einmal ein neues Projekt an wo wir unsere Sachen Speichern.
Also Datei/Neu geklickt, dann Datei/Speichern unter und nen kreativen Namen überlegen. Meins heist "Mein AQ"... Sehr kreativ. :stumm:
In unserem neuen Sketch können wir dann erstmal ne Basisstruktur aufbauen:
Code:
#include <Wire.h>
#include <DS1307new.h> // Unsere Uhr
// ********************************************* //
// VARIABLES //
// ********************************************* //
uint16_t startAddr = 0x0000; // Start address to store in the NV-RAM
uint16_t lastAddr; // new address for storing in NV-RAM
uint16_t TimeIsSet = 0xaa55; // Helper that time must not set again
float timestamp = 0;
// Hilfe für Loop ohne Delay -> mach nur was wenn es eine neue Sekunde ist
int loopTime =0;
// ********************************************* //
// Sensor Variablen und Pin Layout //
// ********************************************* //
// ********************************************* //
// Main Code //
// ********************************************* //
void setup() {
Serial.begin(9600); // Ausgabe am PC
pinMode(2, INPUT); // Test of the SQW pin, D2 = INPUT
digitalWrite(2, HIGH); // Test of the SQW pin, D2 = Pullup on
}
void loop() {
RTC.getTime(); // Aktuelle Uhrzeit holen
if(loopTime !=int(RTC.second)){ // Kleine Hilfe das wir nicht immer alles machen müssen.
loopTime =int(RTC.second);
}
}
Ich finde sauberen Code auch ganz klasse, also legen wir uns direkt mal ne neue Datei an wo wir alles von unserer Uhr (Alle Zeit funktionen) speichern. Rechts am Rand sehen wir nen kleinen Pfeil nach unten. Draufgeklickt, Neuer Tab, kreativname (Uhr oder Clock), "OK".Erklärbär":i8sgm20c schrieb:#include "name.h" bindet Headerfiles von anderen Libaries ein.
Wenn wir eine Variable benutzen wollen müssen wir diese erstmal unserem Programm bekannt machen und sagenwas es ist. Type Name; ODER Type Name = Wert; <= ";" am ende ganz wichtig
Hierbei ist zu beachten:
Variablen verbrauchen Speicher. wenn Ich die Zahl 3 in nem float speichere verbraucht das 4byte (0.0000038147 MB) es würde aber auch ein int tuen (2byte). Spart euch Platz für später
Variablen sind type spezifisch. D.h. float a= 6; int b = 3; long c = a-b; großer scheiss... Besser vorher nachdenken und wenn nötig "typecasten". D.h. long c= long(a-float(b)); (Behandel b als float und behandel die rechnung als long)
Wer Klugscheissen möchte: Jup ich weis kann man besser ausdrücken und erklären, so isset aber verständlich und das wissen reicht (erstmal).
void steht für eine funktion ohne rückgabewert. Das Schema ist immer:
Type Name ( type variablenname, type variablenname2 ) { unsercode}
Besonderheit: wenn es kein void ist muss am ende ein return gleichertype; vor } stehen.
void setup(){} MUSS da sein,
void loop(){} ist die Funktion die immer wieder aufgerufen wird und zwar so schnell wie möglich.
Damit unsere Uhr funktioniert müssen wir diese Initialiesieren und einiges aufrufen. Der übersichtshalber machen wir das in der Datei Clock:
Code:
void setupClock(){
RTC.setRAM(0, (uint8_t *)&startAddr, sizeof(uint16_t));// Store startAddr in NV-RAM address 0x08
// Set new Time Value
/*
TimeIsSet = 0xffff;
RTC.setRAM(54, (uint8_t *)&TimeIsSet, sizeof(uint16_t));
*/
RTC.getRAM(54, (uint8_t *)&TimeIsSet, sizeof(uint16_t));
if (TimeIsSet != 0xaa55){
RTC.stopClock();
RTC.fillByYMD(2012,12,31); // year,month,day
RTC.fillByHMS(2,27,0); //hour,min,sek
RTC.setTime();
TimeIsSet = 0xaa55;
RTC.setRAM(54, (uint8_t *)&TimeIsSet, sizeof(uint16_t));
RTC.startClock();
}else{
RTC.getTime();
}
/*
Control Register for SQW pin which can be used as an interrupt.
*/
RTC.ctrl = 0x00; // 0x00=disable SQW pin, 0x10=1Hz, 0x11=4096Hz, 0x12=8192Hz, 0x13=32768Hz
RTC.setCTRL();
uint8_t MESZ;
MESZ = RTC.isMEZSummerTime();
}
String printTime()
{
String sReturn;
// sReturn = String(int(value));
sReturn = "";
RTC.getTime();
if (RTC.hour < 10) { // correct hour if necessary
sReturn += "0";
sReturn += String(int(RTC.hour));
}else{
sReturn += String(int(RTC.hour));
}
sReturn += ":";
if (RTC.minute < 10) { // correct minute if necessary
sReturn += "0";
sReturn += String(int(RTC.minute));
}else{
sReturn += String(int(RTC.minute));
}
sReturn += ":";
if (RTC.second < 10) { // correct second if necessary
sReturn += "0";
sReturn += String(int(RTC.second));
}else{
sReturn += String(int(RTC.second));
}
/*
Serial.print(" ");
if (RTC.day < 10) { // correct date if necessary
Serial.print("0");
Serial.print(RTC.day, DEC);
}else{
Serial.print(RTC.day, DEC);
}
Serial.print("-");
if (RTC.month < 10) // correct month if necessary
{
Serial.print("0");
Serial.print(RTC.month, DEC);
}
else
{
Serial.print(RTC.month, DEC);
}
Serial.print("-");
Serial.print(RTC.year, DEC); // Year need not to be changed
Serial.print(" ");
switch (RTC.dow) // Friendly printout the weekday
{
case 1:
Serial.print("MON");
break;
case 2:
Serial.print("TUE");
break;
case 3:
Serial.print("WED");
break;
case 4:
Serial.print("THU");
break;
case 5:
Serial.print("FRI");
break;
case 6:
Serial.print("SAT");
break;
case 7:
Serial.print("SUN");
break;
}
Serial.print(" seconds since 1.1.2000:");
Serial.print(RTC.time2000, DEC);
uint8_t MESZ = RTC.isMEZSummerTime();
Serial.print(" MEZ=0, MESZ=1 : ");
Serial.print(MESZ, DEC);
Serial.print(" - Address in NV-RAM is: ");
RTC.getRAM(0, (uint8_t *)&lastAddr, sizeof(uint16_t));
Serial.print(lastAddr, HEX);
lastAddr = lastAddr + 1; // we want to use it as addresscounter for example
RTC.setRAM(0, (uint8_t *)&lastAddr, sizeof(uint16_t));
RTC.getRAM(54, (uint8_t *)&TimeIsSet, sizeof(uint16_t));
if (TimeIsSet == 0xaa55) // check if the clock was set or not
{
Serial.println(" - Clock was set!");
}
else
{
Serial.println(" - Clock was NOT set!");
}
*/
return sReturn;
}
String printDate()
{
String sReturn;
// sReturn = String(int(value));
sReturn = "";
RTC.getTime();
/* if (RTC.hour < 10) { // correct hour if necessary
sReturn += "0";
sReturn += String(int(RTC.hour));
}else{
sReturn += String(int(RTC.hour));
}
sReturn += ":";
if (RTC.minute < 10) { // correct minute if necessary
sReturn += "0";
sReturn += String(int(RTC.minute));
}else{
sReturn += String(int(RTC.minute));
}
sReturn += ":";
if (RTC.second < 10) { // correct second if necessary
sReturn += "0";
sReturn += String(int(RTC.second));
}else{
sReturn += String(int(RTC.second));
}
*/
// Serial.print(" ");
if (RTC.day < 10) { // correct date if necessary
sReturn += "0";
sReturn += String(int(RTC.day));
// Serial.print("0");
// Serial.print(RTC.day, DEC);
}else{
sReturn += String(int(RTC.day));
// Serial.print(RTC.day, DEC);
}
// Serial.print("-");
sReturn += ".";
if (RTC.month < 10) { // correct month if necessary
sReturn += "0";
sReturn += String(int(RTC.month));
// Serial.print("0");
// Serial.print(RTC.month, DEC);
}else{
sReturn += String(int(RTC.month));
// Serial.print(RTC.month, DEC);
}
sReturn += ".";
// String y = String(int(RTC.year))
// sReturn += y.replace("20",""); // Year need not to be changed
String DoW ="";
switch (RTC.dow) // Friendly printout the weekday
{
case 1:
DoW="Mo ";
break;
case 2:
DoW="Di ";
// Serial.print("TUE");
break;
case 3:
DoW="Mi ";
// Serial.print("WED");
break;
case 4:
DoW="Do ";
// Serial.print("THU");
break;
case 5:
DoW="Fr ";
// Serial.print("FRI");
break;
case 6:
DoW="Sa ";
// Serial.print("SAT");
break;
case 7:
DoW="So ";
// Serial.print("SUN");
break;
}
sReturn = DoW+sReturn;
/*
Serial.print(" seconds since 1.1.2000:");
Serial.print(RTC.time2000, DEC);
uint8_t MESZ = RTC.isMEZSummerTime();
Serial.print(" MEZ=0, MESZ=1 : ");
Serial.print(MESZ, DEC);
Serial.print(" - Address in NV-RAM is: ");
RTC.getRAM(0, (uint8_t *)&lastAddr, sizeof(uint16_t));
Serial.print(lastAddr, HEX);
lastAddr = lastAddr + 1; // we want to use it as addresscounter for example
RTC.setRAM(0, (uint8_t *)&lastAddr, sizeof(uint16_t));
RTC.getRAM(54, (uint8_t *)&TimeIsSet, sizeof(uint16_t));
if (TimeIsSet == 0xaa55) // check if the clock was set or not
{
Serial.println(" - Clock was set!");
}
else
{
Serial.println(" - Clock was NOT set!");
}
*/
return sReturn;
}
float get_ts(int h, int m, int s){
float r;
uint32_t t;
t = h;
t *= 60;
t += m;
t *= 60;
t += s;
r=float(t);
return r;
}
Dann gibt es jetzt String printTime(), eine funktion die uns die Uhrzeit als string (Text) zurück gibt und String printDate() die das gleiche mit Datum macht. Ausserdem eine Funktion get_ts(int h, int m, int s). Diese rechnet uns eine Uhrzeit (z.B. 9:30) in einen Timestamp um. Dies brauchen wir später um Uhrzeiten zu vergleichen.
Man erkennt, Ich hab viel auskommentiert (// oder /*text*/), das könnte man auch löschen.
Jetzt noch mal schnell auf unsere erste Seite (MeinAQ) und die Funktion setupClock(); in die void setup() kopiert:
Code:
void setup() {
Serial.begin(9600); // Ausgabe am PC
pinMode(2, INPUT); // Test of the SQW pin, D2 = INPUT
digitalWrite(2, HIGH); // Test of the SQW pin, D2 = Pullup on
setupClock();
}
Code:
void loop() {
RTC.getTime();
if(loopTime !=int(RTC.second)){
loopTime =int(RTC.second);
Serial.println (printTime());
Serial.println (printDate());
}
}
Ich mach an der stelle Jetzt mal schluss, wenn es euch gefällt setz Ich mich die Tage wieder dran und es geht weiter.
Beste Grüße