Der Flowgrow Aquacomp

Harrdy

Member
Bevor ich Anfange das ganze nachzubauen habe ich es erstmal am PC gemacht. Wenn ich deine Beiträge alle richtig verstanden habe müsste meine Schaltung so wie ich sie gezeichnet habe ja eigentlich funktionieren?



Vielleicht kann mir jemand dazu vielleicht was schreiben bzw. n Tipp geben was falsch ist oder geändert werden kann/muss. Hab bis dato noch nie mit Elektrischen Schaltungen usw. gearbeitet und habe nur die letzten Tage ziemlich viel gelesen.
 

Anhänge

  • Aquacomp_Steckplatine (Large).png
    Aquacomp_Steckplatine (Large).png
    409 KB · Aufrufe: 780

MajorMadness

Active Member
heiko77":12o62977 schrieb:
Du kannst den Timer beim Triggern gegen die RTC prüfen und ggf. nachlaufen lassen.
Hast du nen Code beispiel?

Snakey":12o62977 schrieb:
Hallo,
ich verstehe zwar nicht, was an meiner Lösung falsch ist und ihr versucht die nachzubauen aber naja ... meine läuft zumindest und ist schon getestet.
Falsch ist da im Prinzip nix dran, ausser das es ne Idee der Umsetzung ist und kein Code den Ich einbauen könnte. Sinn und Zweck war es ja das jemand/einer/alle überlegen wie man das Licht Steuern könnte und Ihre Ideen präsentieren damit wir evt denkfehler sehen.
Code:
wenn startSekunden <= stopSekunden: (z.B . 01:00 - 23:59 oder 06:00 - 21:00 oder 08:01 - 08:05), dann
   wenn startSekunden <= aktuellSekunden UND aktuellSekunden < sekundenStop, dann Einschalten
        sonst Ausschalten
Das ist pseudocode und funktioniert genausowenig wie "Na morgens ein und abends ausschalten" als Lösung oder auf die Frage was muss Ich düngen zu antworten "Na Dünger"...
Nehm es mir bitte nicht übel, Ich will nicht behaupten das deine Lösung schlecht ist oder nicht funktioniert, Sie ist ja auch eigentlich das gleiche wie Meine für die Düngung oder was in meinem Code steht den wir hier nachbauen, ausser das Ich nix direkt umrechne sondern mich an funktionen bediehne. Richtig oder Falsch gibt es bei Programmierung eh nicht und viele Wege klappen. Auch wenn meine seit dem ersten Tag stabil läuft, ist Olli's ansatz über "startzeit, X Stunden an" interessant und Heiko's Lösung über nen timer auch sehr Interessant. Welche die beste ist möchte ich nicht sagen solange alle funktionieren können wir uns ja für eine entscheiden (In meinem Finalen Code wird es die sein die ich jetzt schon drin habe ;) )
 

MajorMadness

Active Member
Hi Sven,
direkt fallen mir paar dinge auf:
RTC und PCF8574 -> das sind beides I2C Bausteine. Die müssen beim Uno an A4 und A5. Also alles zusammen an die 2 Ports und nicht die RTC in nen PCF8574. Beim Mega sind das Port 20 und 21 wo du die PCF und RTC ect anschliessen kannst.
DS18... -> Müssen an nen Digital, nicht Analog. Es fehlen die Widerstände zwischen Datenleitung und 5V (Es sei denn du nimmst NTC Temp Sensoren. Diese haben aber nur 2 Pins und müssen mit nem widerstand an ground.)
5V -> nehm nicht die vom Arduino sondern nur die vom NT. Nur Adruino Ground mit NT Ground zusammen anschliessen.
LCD -> statt dem wiederstand besser nen Poti nehmen.

Ich versuch das selber mal in Fritzing nachzubauen, evt versteht man es dann besser.
 

Harrdy

Member
Also müssen alle I2C Bausteine parallel angeschlossen werden. Richtig?
 

Anhänge

  • Aquacomp_Steckplatine (Large).jpg
    Aquacomp_Steckplatine (Large).jpg
    150,9 KB · Aufrufe: 765
  • fritzing-project.zip
    36 KB · Aufrufe: 144

heiko77

New Member
Ich hab keinen Arduino, daher nur Pseudocode:

Code:
adjust = 0;
int triggertime = seconds_till_trigger(time_timer, time_now);
set_timer(seconds_till_trigger + adjust, timer_func)

void timer_func(void){
    int triggertime = seconds_till_trigger(time_timer, time_now);
    adjust = triggertime;
    action();
}

Aber wie gesagt, ich glaube kaum das die Zeit binnen 24h bedeutend wegläuft. zumal es für Beleuchtung und co ja auch egal ist ob die ein paar Sekunden kürzer oder länger läuft. Wenn Du die Timer direkt beim Booten setzt überlebt das ganze auch reboots ohne probleme, da du die Zeiten ja gegen die RTC ausrechnest. Das ist deutlich eleganter als nonstop zu pollen. Kannst das Teil sogar in einen Energiesparmodus setzen wenn nichts mehr zu tun ist (was ja zu 99,99% der Fall ist).

Die Timer musst Du Dir alle in einer Datenstruktur speichern und immer wenn einer procct oder neu gesetzt wird, festellen welches der nächste ist und den auf den HW-Timer setzen. Aber vielleicht gibt es auch schon eine Software-Timer Lib für das System die Dir diese Arbeit komplett abnimmt.

Grüße,
Heiko
 

MajorMadness

Active Member
Ich hab mal mein gesammtes künstlerisches Können zusammen genommen und bisschen gemalt... Ich hoffe man kann es erkennen. Bitte nagelt mich nicht auf die Pinbelegung der Sensoren und Transistors fest. Ich hab keine Ahnung ob Ich die richtig rum gedreht habe... Die Skitze diehnt nur als Hilfestellung des Anschliessens und ersetzt kein Datenblatt oder Schaltplan. ;)

Display hab Ich absichtlich raus gelassen weil Das erst als nächstes eingebaut wird. Ich komme nur grade nicht zum tippen :(
 

Anhänge

  • MAQ.jpg
    MAQ.jpg
    114,5 KB · Aufrufe: 729

MajorMadness

Active Member
Hiho,
und ein weiteres mal geht es voran mit unserem Tutorial.

Also was ist bisher passiert? Nun, es stand die Frage im Raum wie wir unser Licht ein und aus schalten können und es wurden ein paar möglichkeiten diskutiert. In kurzform:
1. Wir vergleichen die verstrichenen Sekunden mit der Aktuellen anzahl der Sekunden und schalten zu einer gewissen Zeit an und aus
2. Wir sagen wann es an gehen soll und wie lange ( wieviele Std) es Hell sein soll
3. Wir trigern nen timer der den Strom abstellt.

Für unser Projekt wollen wir uns für die erste Möglichkeit entscheiden. Also brauchen wir erstmal wieder ein paar Variablen die unsere Zeiten halten:
Code:
int DaylightPowerPin = 22;    // Relay 1
int DaylightPowerState = HIGH;
float Sunrise = get_ts(10,30,0);  //34200;    // 9:30
float Sunset = get_ts(22,30,0);   //77400;    //21:30
und im Setup müssen wir noch die Pins richtig setzen:
Code:
  pinMode(DaylightPowerPin, OUTPUT);
  digitalWrite(DaylightPowerPin, HIGH);
Wir haben noch keinen Reiter der unsere Licht funktionen hält, also legen wir am Pfeil oben Rechts nen neuen Tab an und nennen Ihn ganz kreativ "Licht". Warum dafür nen extra tab? Naja es macht es übersichtlicher und wir wollen ja auch mal sowas machen wie Auf-,Untergang, Mondlicht, Wolken Sim. ect.... Da ist es schon besser wenn wir was haben wo wir unsere Funktionen sammeln können.
Erstmal eine Funktion fürs Licht, dann eine fürs Dimmen und eine für den Mond. Wir benutzen die zwar noch nicht, aber es schadet ja nicht Sie zu haben:
Code:
void switchLight(){
    if(RTC.daystamp>=Sunrise && RTC.daystamp<=Sunset && DaylightPowerState==HIGH){ 
        DaylightPowerState=LOW;
        digitalWrite(DaylightPowerPin,DaylightPowerState);
    }else if((RTC.daystamp<Sunrise || RTC.daystamp>Sunset) && DaylightPowerState==LOW){
        DaylightPowerState=HIGH;
        digitalWrite(DaylightPowerPin,DaylightPowerState);
    }
  
}

int PWM_Licht(float time, float Start, float Ende, float Dim_time, int Min, int Max){
  return 1;
}

int MondPhase(int Year,int Month,int Day){
  return 1;
}
Wie Ihr seht hab Ich die funktionen für Mond und Dimmung schon vorbereitet. Wie die genau aussehen, können wir aber erst sagen nachdem wir nen bisschen mehr in die Möglichkeiten geschaut haben. Je nachdem ob wir mit 0-10V, PWM, Current Sink oder anderm arbeiten gibt es unterschiede. Wichtig ist erstmal das es hell wird im AQ, daher wollen wir die funktion swichtLicht kurz einbauen:
Code:
	if(loopTime !=int(RTC.second)){         // Das steht ja schon in unserem Code
	    loopTime =int(RTC.second);
            switchLight();
Das war es auch schon. Gott sprach es werde Licht und Ich armer sündiger folgte seinem Wort... :lol:

Nun dann, machen wir nochmal nen bisschen weiter und geben unserem Computer ein Gesicht. Nein wir holen nicht die Filzstifte raus, Wir schliessen ein Display an. Nun welche möglichkeiten haben wir?
24" TFT :shock: ok lassen wir das... bleiben wir bei realistischem.
ein Keypad shield mit 16x2 Zeichen
ein 20x4 Zeichen Display
ein GLCD :?
Erstmal das einfache: Ein LCD mit HD44780 Controller. Die dinger gibts ab 4€ und werden alle gleich angeschlossen. Davon können wir sogar welche mit Roter, Grüner und schwarzer Beleuchtung bekommen, also schön um es an zu passen.
Dann, wie schliessen wir es an? Wer nen keypad shield hat der kann es ja einfach aufdrücken. Wer das nicht hat (wie Ich bei meinem 20x4) der nimmt sich die Pins vor:
Pin 1 => Ground
Pin 2 => 5V+ (ACHTUNG! Wenn euer display ne andere Spannung als 5V braucht müsst ihr nen Widerstand dazwischen setzen. bei mir waren es 4,2V als 3,3ohm)
Pin 3 => Kontrast über 10Kpoti anschliessen
Pin 4 => D8
Pin 5 => Ground
Pin 6 => D9
Pin 7 =>
Pin 8 =>
Pin 9 =>
Pin 10 => D3
Pin 11 => D4
Pin 12 => D5
Pin 13 => D6
Pin 14 => D7
Pin 15 => 5V+
Pin 16 => Ground
Sieht komisch aus, ist aber genau so wie mein Keypad Shield verdrahtet ist...
Dann können wir uns Jetzt einfach das LCD initialisieren und eigentlich auch benutzen.
Code:
#include "LiquidCrystal.h"

LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

// In Setup
  lcd.begin(20, 4);     // Diese Zeile anpassen für eure Displaygröße

// In loop

  lcd.setCursor(0, 1);
  lcd.print(millis()/1000);
Joar Ich weis ist nen bisschen aus Hello World geklaut, soll ja auch nur zeigen das es klappt ;)

So, jetzt ist das Essen bei mir fertig, morgen Zeig ich euch wie man alle Pins einsparrt :flirt: und dann gibts auch Bilder :thumbs:
 

MajorMadness

Active Member
Ich sachte ja morgen gehts weiter... Drecks schlaflossigkeit :D

Also erstmal der Vergleich der Displays:
Links das 20x4, Rechts nen Keypad Shield und unten nen 264x92px GLCD. Ob Ich das aber einbaue, weis ich noch nicht... Liebäugel da grade mit nem anderen :pfeifen:

Dann aber weiter. Also wie Sieht so nen displayanschluss ohne Keypad aus? Hier mal schnel lwas im Fritzing gebastelt:
Jetzte hab Ich euch aber versprochen das Wir alle Pins einsparen... Naja, Ganz ohne geht es nicht, aber wir können keinen Extra belegen.
Hierzu hilft uns entweder ein I2C Backpack oder wir investieren 1-2€ und besorgen uns einen pcf8574 I2C Port expander. Mit dem kann man viele schöne dinge machen ;) unter anderem ein LCD anschliessen. Wie sieht das dann aus?

Pin 1 => Ground
Pin 2 => 5V+
Pin 3 => Kontrast über 10Kpoti anschliessen
Pin 4 => P11
Pin 5 => P10
Pin 6 => P9
Pin 7 =>
Pin 8 =>
Pin 9 =>
Pin 10 =>
Pin 11 => P4
Pin 12 => P5
Pin 13 => P6
Pin 14 => P7
Pin 15 => P12 (ACHTUNG! Wenn euer display ne andere Spannung als 5V braucht müsst ihr nen Widerstand dazwischen setzen. bei mir waren es 4,2V als 3,3ohm)
Pin 16 => Ground

Verdammt... Ich sehe grade in der Beschreibung oben ist nen Fehler. Der widerstand gehört an LCD pin15 NICHT 2!!!
Ok, aber der Schaltplan vom PCF8547:
Beim PCF müssen Pin 1,2,3 an Ground oder 5V angeschlossen werden. Dies gibt die Adresse an. (Datasheet)
Pin8 Muss an Ground, 16 an 5V und 14 an SCL, 15 an SDA. Das bedeutet der Chip funktioniert parallel zu unserer Uhr (DS1307). Somit verbrauchen wir keinen Pin. :D
Der Transistor den Ich eingezeichnet habe ist ein BC547 und funktioniert ganz einfach: Ist er an (Pin High) Ist die Hintergrundbeleuchtung an, Low= Kein Backlight. Aber warum opfere Ich dafür einen Kostbaren PWM Pin? Nun, wenn wir an die LED Dimmung gehen dimmen wir unser Display in einem mit. :gdance:
Und wie steuern wir das Ganze nun? Wir brauchen dazu natürlich wieder eine lib, und zwar die von http://hmario.home.xs4all.nl/arduino/LiquidCrystal_I2C (Nebenbei hier mal danke an den Autor Mario der mir auch bei paar anderen Hardware sachen super geholfen hat!).
Ich hab seine lib aber ein wenig umgeschrieben und um PWM ergänzt. Im Anhang ist die neue mit meinen änderungen.
Nun dann, lib entpackt, in richtigen Ordner verschoben, Alles angeschlossen, dann mal los:
Code:
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd1(0x20,20,4,12);  //  LCD Adress / Chars / Rows / PWM Pin
//setup()

  lcd1.init();                  // initialize the first lcd 
  lcd1.backlight(255);    // Backlight ganz an

// loop

  lcd1.setCursor(0, 0);
  lcd1.print("LCD with 2 wires");
  lcd1.setCursor(0, 1);
  lcd1.print(millis()/1000);
:shock: Coole sache! Wer will kann sich gerne auch mal das Hello World ansehen unter examples. Das hat nen lustiges Fading drin ;)
Ich bin grade dabei meinen Chip auf die Platine zu löten, dann gibts davon auch nen Bild und wieder nen Schaltplan. Für euch aber schonmal der Code bisher (Im Ordner libraries alle libs die wir verwenden. Einfach kopieren :cool: ). Die Tage überlegen wir uns dann mal was wir so auf dem Display anzeigen wollen...
Vorschläge? :glaskugel:
 

Anhänge

  • IMG_6182.JPG
    IMG_6182.JPG
    231,1 KB · Aufrufe: 686
  • hd44780 1.jpg
    hd44780 1.jpg
    194,2 KB · Aufrufe: 674
  • hd44780 2.jpg
    hd44780 2.jpg
    395,3 KB · Aufrufe: 690
  • LiquidCrystal_I2C.zip
    1,1 MB · Aufrufe: 194
  • MAQ.zip
    1,1 MB · Aufrufe: 179

*AquaOlli*

Member
:kaffee2: Moritz,

warst ja wieder richtig fleißig :thumbs:
Achso, was hälste hier von, also das mit dem Licht hat mir keine Ruhe gelassen :irre:
Code:
if (lStartTime == lStopTime)
  digitalWrite(12, LOW);
else
  if (lStartTime < lStopTime)
    if ((lTime >= lStartTime) && (lTime < lStopTime))
      digitalWrite(12, HIGH);
    else
      digitalWrite(12, LOW);
  else
    if ((lTime >= lStopTime) && (lTime < lStartTime))
      digitalWrite(12, LOW);
    else
      digitalWrite(12, HIGH);
Hab mal eben ne LED draufgesteckt, es scheint zu funktionieren.
Der Status muß aber noch eingebaut werden.
So, das Bett ruft, verflickste Nachtschicht...
 

MajorMadness

Active Member
if (lStartTime == lStopTime)
wird niemals sein, ausser du willst um 10:00 an und aus schalten...
if (lStartTime < lStopTime)
Das ist immer, es sei denn du machst abends licht an und morgens aus...
if ((lTime >= lStartTime) && (lTime < lStopTime))
permanentes schalten.... überprüfe ob du überhaupt was machen musst // && state != HIGH
digitalWrite(12, HIGH);
else
digitalWrite(12, LOW);
else
Wird nie erreicht, s.o. oben...

Schau dir mal mit serial print an was der eigentlich macht. Mich würde es wundern wenn der beim code:
Code:
if (lStartTime == lStopTime)
  digitalWrite(12, LOW);
else
  if (lStartTime < lStopTime){
    if ((lTime >= lStartTime) && (lTime < lStopTime)){
     print(1);
      digitalWrite(12, HIGH);
    }else{
     print(2);
      digitalWrite(12, LOW);
  }else{
    if ((lTime >= lStopTime) && (lTime < lStartTime)){
     print(3);
      digitalWrite(12, LOW);
    }else{
     print(4);
      digitalWrite(12, HIGH);
}
   }
dir alle 4 zahlen ausgibt. egal was du als zeiten setzt... In dem sinne kann man es kürzen, was dann wieder fast gleich zu meiner lösung ist.
 

heiko77

New Member
Hallo,

gehe mit MM koform - sinnvoll ist das nicht - allerdings ist das permanente "Schalten" kein Problem. Es wird eine eins in ein Register geschrieben wo schon eine eins drinnen steht, da passiert einfach nichts.
Aber wie schon geschrieben, sauber ist das sowieso nicht, dass per busy-waiting zu machen. Sowas macht man per Timer...

LG,
Heiko
 

MajorMadness

Active Member
Eleganter auf jeden Fall... Evt kommt es daher das Ich zu lange php programmiert habe und viel zu wenig runtime sachen... Aber diese Methode verstehen die meisten und es ist simpel (Basiswissen vorrausgesetzt). Ich überlege Grade ob es sinn macht es wirklich mal auf Timer umzubauen... Grade bei den Dosierpumpen hätte es glaube ich nen vorteil weil wir sie noch genauer schalten könnten...
http://lmgtfy.com/?q=arduino+timer :pfeifen:
 

Harrdy

Member
Mal eine Frage: Wie hast du die ID deiner D18B20 ausgelesen? Find keine Function die mir die hw ID ausgibt.

Der einzige weg wie ich Temp Werte bei meinen rausbekomm ist die Anzahl von Sensoren abzufragen und per Schleife abzuarbeiten.

Code:
  ds18b20.update(); 

  for (int i=0;i<ds18b20.count;i++)
    {
    Serial.print("Sensor ");
    Serial.print(i,DEC);
    Serial.print(", T=");
    print_temperature(ds18b20.get_temp(i));
    Serial.println("C");
    }
 

MajorMadness

Active Member
Im Beispiel ist ne funktion/aufruf der dir die anzeigt. Lad dir einfach mal die ds18b20_demo oder tip in nen test_sketch
#include <DS18B20.h>

DS18B20_List ds18b20(10); // pin nummer

void setup(void) {
Serial.begin(9600);
}

void loop(void) {
ds18b20.update();
for (int i=0;i<ds18b20.count;i++){
Serial.print("Sensor ");
Serial.print(i,DEC);
Serial.print(", id=0x");
Serial.print(ds18b20.get_id(i),HEX);
Serial.print(", T=");
print_temperature(ds18b20.get_temp(i));
Serial.println("C");
}
}
Wenn du 2 dran hast, halte einen in der hand und schau welcher sich verändert.
 
Ähnliche Themen
Themenersteller Titel Forum Antworten Datum
Tobias Coring Flowgrow - das gelebte Miteinander in der Community Ankündigungen 0
Ewald Flowgrow Forum Uhr - der Zeit voraus? Kein Thema - wenig Regeln 2
HaManFu HaManFu grüßt den Rest der Welt@Flowgrow Mitgliedervorstellungen 15
Tobias Coring Der Flowgrow Dünger ist da ;) Nährstoffe 127
D Neu in der Aquaristik (Benjamin aus Raum Köln/Bonn) Mitgliedervorstellungen 4
D Was kann der Sera CO2-Dauertest (nicht)? Technik 2
Maj.Monogwam Hilfe bei der Geschlechtsbestimmung, Königssalmler. Fische 2
Heiko Muth (Sumpfheini) Leptochilus pteropus, der Javafarn... Pflanzen Allgemein 0
T Weiß jemand, wer der Hersteller des Harzes ist, das sich "Purigen" nennt? Technik 11
Benjamin87 Der Zustand meiner Aquarium Pflanzen Pflanzen Allgemein 4
Benjamin87 Klares Wasser nach der Einlaufphase Technik 2
Benjamin87 Unerfahren in der Düngung Nährstoffe 1
Benjamin87 Trübung in der Einfahrphase Erste Hilfe 8
T In Zeiten der sog. Klimakrise ... Was ist Eure Sicht auf das "Teufelszeug" CO2? Kein Thema - wenig Regeln 10
S Optimierung der Düngung Nährstoffe 40
E Kalium Mangel (meine Pflanzen sagen ja der Test sagt nein) Nährstoffe 42
T Hilfe bei der Namenssuche Artenbestimmung 1
S Düngen in der Einfahrphase Nährstoffe 315
J Tropica Dünger in der Einfahrphase Nährstoffe 19
B4m8i Aquarium in der Arbeit - Proxima 250 ohne allem Aquarienvorstellungen 12

Ähnliche Themen

Oben