Der Flowgrow Aquacomp

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
 
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:

)
 
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:
 
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.
 
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);
 
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: )
 
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:
 
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...
 
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 :?
 
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)
 
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
 
*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
 
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...
 
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
 
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
 
Oben