Der Flowgrow Aquacomp

Snakey

Member
MajorMadness":364hz42s schrieb:
Problem ist an deiner Lösung, was wenn du den Arduino resettest nachdem das Relay geschaltet wurde? es bleibt aus bis zum nächsten Tag... Grade bei Uhrzeiten immer schauen ob größßer oder kleiner ist, niemals gleich...
if time = 10:00:00
mach an
if time = 20:00:00
mach aus

und jetzt hängt der genau um 9:59:59 für 2 Sekunden und schon bleibt unser licht den ganzen tag aus...

Ja, das ist wirklich nicht so prickelnd....

MajorMadness":364hz42s schrieb:
(für die es trotzdem machen wollen, ihr müsst prüfen:
if(Stunde==10 ||Stunde==11 ||Stunde==12 ||Stunde==13 ||Stunde==13 || ect...)
) :stumm: Nicht effektiv...

Hmpf, warum rechnet ihr nicht einfach alles in Sekunden um (Stunden * 3600 + Minuten * 60 + Sekunden) ?? Beispiel:
startSekunden = 10:10 Uhr = 10 * 3600s + 10 * 60s = 36600s
stopsekunden = 20:00 Uhr = 20 * 3600s + 0 * 60s = 72000s
aktuellSekunden = aktuelle Uhrzeit ebenfalls in Sekunden umrechnen.

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
sonst: (z.B. 23:00 - 06:00), dann
	wenn (sekundenStart <= aktuellSekunden UND aktuellSekunden < 86400) 
                                  ODER (0 <= aktuellSekunden UND aktuellSekunden < sekundenStop), dann Einschalten
        sonst Ausschalten

Gruß,
Andi
 

MajorMadness

Active Member
Schau dir mal die Funktion get_ts() an und die Variable RTC.daystamp. :wink: (Hab es mal gesucht... erste Seite, erstes Posting. Da steht: 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.)

Es ging sich um Beispiele warum man nicht vergleichen sollte. Ob man jetzt Sekunden vergleicht oder Stunden ist dabei egal.

(wobei ich trotzdem mal gerne sehen würde wie das aussieht wenn jemand jede sekunde zwischen 10:00 und 21:00 vergleicht..
if(Zeit==2160000 || Zeit==2160001 || Zeit==2160002|| usw){ einschalten}esle{ aus } :shock: :stumm: :irre:

)
 

*AquaOlli*

Member
Hallo Moritz,

ist, glaube ich, nicht so das Problem, denn es wird ja nur peer Stunde und Minute abgefragt und nicht peer Sekunde. In dem Fall habe ich also eine Minute zeit das Relais zu schalten. Also für Licht kein Thema, aber bei Dosierpumpen isses nicht so schön. Oder wir machen es so, setzen nur die Startzeit und anstatt Endzeit "Laufzeit" in Sekunden.

Code:
long gettimenow=0;
int ON=0;

#define ON_HOUR   23 
#define ON_MIN     0
#define OFF_Time   28800 //8h in Sekunden

void schaltUhr(){ 
  if(ON==0){
    if(hour==ON_HOUR && minute==ON_MIN){  
      digitalWrite(13,HIGH);
      ON=1;
      gettimenow=RTC.time2000;}
  }  
  if(ON==1]{
    if(RTC.time2000-gettimenow<=OFF_Time){
      digitalWrite(13, LOW);
      ON=0;}
  }
}

ungetestet da meine Arduinoklamotten leider schon eingemottet sind wegen Umzug :nosmile:
 

MajorMadness

Active Member
es ist kein problem wenn er grade durchläuft, aber es ist nen problem wenn du schon nach dem vergleich einschaltest... ich hatte das bei meiner dimmung am anfang. jede sekunde lichtlevel -1. klappte super bis ich wärend der dimmung die dosierzeit geändert habe und damit das dimmlevel überschrieben habe...
Dennoch, auch beim anschalten von licht nich schauen ob zeit = stunde und minute ist, sondern immer ob zeit größer als stunde und minute ist.
 

*AquaOlli*

Member
Hallo Moritz,

mal nen anderer Ansatz, könnte das gehen ?
Ich kann's mom nicht testen...

Code:
const int iHOUR = 60 * 60;
const int iMINUTE = 60;
long lTime;
long lStartTime;
long lStopTime;
byte second, minute, hour;

#define ON_HOUR   23 
#define ON_MIN     0
#define ON_SEC     0
#define OFF_HOUR   1 
#define OFF_MIN   30
#define OFF_SEC    0

void schaltUhr(){ 
  lTime = (hour * iHOUR) + (min * iMINUTE) + second;
  lStartTime = (ON_HOUR * iHOUR) + (ON_MIN * iMINUTE) + ON_SEC;
  lStopTime = (OFF_HOUR * iHOUR) + (OFF_MIN * iMINUTE) + OFF_SEC;

  if (lTime >= lStartTime && lTime < lStopTime)
    digitalWrite(13, HIGH);
  else
    digitalWrite(13, LOW);
 

MajorMadness

Active Member
kann nicht klappen...
du schmeisst const int, long, int, byte und defenierte werte wild durch einander ohne die ein einziges mal zu casten oder umzuwandeln... Das geht in php, aber nicht in C. Bleib besser bei einem type und verwende define nur wenn du dir sicher bist das du den wert nicht mehr anpacken musst. Später im menü könnten wir die schaltzeit der Uhr bei define nicht ändern... nen int kann man überschreiben und wegspeichern.

(wobei ich den code auch nicht getestet habe... bin noch am arbeiten :nosmile: )
 

*AquaOlli*

Member
Hallo Moritz,

war auch nur ein grober Ansatz, das der Code noch optimiert werden muß ist klar. Mir ging es erstmal um die funktionsweise, ob das so klappen könnte. Und das mit #define ist mir schon klar, ich will die Werte ja später auch über's Display ändern können. Ist ja jetzt nur mal zum testen... :smile:
 

MajorMadness

Active Member
aso, ok dann schreiben wir das mal anders: (ohne typen)
Code:
void schaltUhr(){ 
  lTime = (hour * iHOUR) + (min * iMINUTE) + second;	// (h*60*60) + (m*60) + s
  lStartTime = (ON_HOUR * iHOUR) + (ON_MIN * iMINUTE) + ON_SEC;	// (23*60*60)+(0*60)+0
  lStopTime = (OFF_HOUR * iHOUR) + (OFF_MIN * iMINUTE) + OFF_SEC;	// (1*60*60)+(30*60)+0

  if (lTime >= lStartTime && lTime < lStopTime)	// X >= 82800 && X < 5400
    digitalWrite(13, HIGH);
  else
    digitalWrite(13, LOW);
Ich tippe er würde immer LOW bleiben... X kann nie >82800 UND dabei kleiner 5400 sein... er springt immer in den else.
Wenn du && gegen || ersetzt ginge der weg auch. wobei ich wieder eine abfrage auf den momentanen status machen würde. Also: if ( (lTime >= lStartTime || lTime < lStopTime) && State==LOW)
wobei du State natürlich als variable anlegen müsstest und dann auch setzen bevor du digitalWrite() schreibst. Das wäre dann wieder fast das gleiche wie mein code, ausser das Ich die umrechnung viel früher über die funktion gemacht hab...
 

*AquaOlli*

Member
Hallo Moritz,

ok, ich mach dann erstmal Pause :pfeifen:
Irgendwie kriege ich das aus dem Kopf nicht raus das es wohl nur mit "Startzeit" und "Laufzeit" laufen würde :?
 

MajorMadness

Active Member
Ginge auch:
float startzeit= get_ts(10,0,0); // 10:00 Licht an
float laufzeit = get_ts(9,0,0); // 9:00 Stunden Hell
Int relayState = LOW;
#define relayPin 13

Code:
if(RTC.daystamp>=startzeit && RTC.daystamp<=startzeit+laufzeit&&relaystate==HIGH){
relay=LOW;
digitalWrite(relayPin,relayState);
}else if((RTC.daystamp<startzeit || RTC.daystamp>startzeit+laufzeit) && relaystate==LOW){
Relay=HIGH
digitalWrite(relayPin,relayState);
}

(ungetestet, müsste aber stimmen)
 

heiko77

New Member
MajorMadness":g1gclqkv schrieb:
kann nicht klappen...
du schmeisst const int, long, int, byte und defenierte werte wild durch einander ohne die ein einziges mal zu casten oder umzuwandeln... Das geht in php, aber nicht in C. )


Das geht in c. Ist aber risikoreich wenn man die Regeln des impliziten castens nicht kennt. Hier stehen die: http://openbook.galileocomputing.de/c_v ... ng_001.htm
Dafür gibt es in c den Datentyp Byte nicht.

Und wer denkt er weiss alles darüber, kann mal diese Quiz machen :D http://blog.regehr.org/archives/721

LG,
Heiko
 

heiko77

New Member
*AquaOlli*":1k1mw2q2 schrieb:
Hallo Moritz,

ok, ich mach dann erstmal Pause :pfeifen:
Irgendwie kriege ich das aus dem Kopf nicht raus das es wohl nur mit "Startzeit" und "Laufzeit" laufen würde :?


Ich würde sowas mit einem Timer machen und nicht ständig pollen. Also ausrechnen wie lange das Ereignis laufen soll und dann einen lokalen Timer auf die Endzeit setzen. Beim reboot/reset kann man das neu ausrechnen.

Grüße,
Heiko
 

MajorMadness

Active Member
heiko77":36nup758 schrieb:
Ich würde sowas mit einem Timer machen und nicht ständig pollen. Also ausrechnen wie lange das Ereignis laufen soll und dann einen lokalen Timer auf die Endzeit setzen. Beim reboot/reset kann man das neu ausrechnen.

Grüße,
Heiko
Wie das geht würde mich jetzt interessieren. ;) Ich denke nen timer der x sek. läuft und dann das Relay abschaltet ist über den Tag gesehen zu kritisch/nicht genau genug und die überprüfung eines timestamps oder sek seit 0:00 besser. Wenn du aber ne gute, funktionierende timer funktion hättest kann man die sicher noch verwenden...
 

heiko77

New Member
Hallo,

Du kannst den Timer beim Triggern gegen die RTC prüfen und ggf. nachlaufen lassen. Allerdings sollte der für einen Tag sowieso genau genug sein.

LG,
Heiko
 

Snakey

Member
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.

Gruß,
Andi
 
Ä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
I Algenprobleme und geringes Wachstum der Pflanzen Erste Hilfe 8
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

Ähnliche Themen

Oben