Wie timed man einen logger ordentlich ?

Hi zusammen.
Hab nen Uno mit Dataloggingshield mit RTc1307
Programm soll:
Alle 5 min Minuten die Temp von 1-wire Thermometer erfragen. Und Speichern.
Einmal die Stunde Anpassung der Temp durch thermostat schalten.

  1. setzt man bei großen Intervallen auch ungeniert delays mit riesigen ms Werten ?

  2. Ich dachte daran: einmal zu Beginn der vollen Stunde ist die Bedingung wahr => Wunschbefehl wird ausgeführt . Und Lasthour auf die aktuelle Stunde gesetzt. Macht sowas Sinn oder würdet ihr mit der TimealarmsLib o.ä. arbeiten ?

setup:
char lasthour

loop:
if( lasthour != hour())
     relais an
     lasthour = hour

Grüße und Danke für die Hilfe, Daniel.

Hallo,
gewöhne Dir das "delay()" bloß nicht an.
Jede Zeit kannst Du mit millis() beikommen.
Wenn es hier nur um die 5 Minuten und 1 Stunde geht, dann würde ich das
mit "Modulo" machen:

Modulo = Minuten % 5;
if (Modulo == 0)
{
Zähler = Zähler + 1
  hole Temperatur
}
if (Zähler == 12)
{
regel Temperatur
  Zähler = 0
}

Gruß und Spaß
Andreas

Genialer Vorschlag. Vielen, vielen Dank.

Eine Verständnissfrage hätte ich aber noch.

Angenommen mein gesamter loopteil teilt sich beginnend in dieser einen If. (alle 5min Bedingung und dann weiter Stunde...Tag..)
(Insgesamt soll das Programm 3Monate durchlaufen und loggen, das wird dann hinten heraus ungenau, oder ?)

Lasse ich diesen Loop dann permanent durchrauschen ? Keine Delays oder ähnliches zum, ich sag mal laienhaft heruntertakten ?

Das kommt darauf an, wie genau deine Zeitbasis ist. Du hast ja die Wahl zwischen einer externen RTC, DCF77-Empfang, selbst GPS oder Uhrzeit aus dem Internet wären möglich.

Hallo,
wenn Du auf dem Arduino einen Sketch hast, dann wird dieser sicherlich eine
"loop" haben.
Wenn der Arduino mit Spannung versorgt wird, dann rauscht der bis ans Ende
seiner Tage durch diese loop.
Es ist u.a. die Aufgabe eines µC, die gleichen Abläufe immer zu wiederholen.
Es gibt keinen Grund, das zu unterbinden- es sei denn Du möchtest z.B.
Energie (BatterieBetrieb) sparen.

Ob sich delay nun auf die Lebensdauer der Bauteile auswirkt, ist wohl
Spekulation.
Gruß und Spaß
Andreas
P.S.
Du kannst die lopp ja auch so schreiben…
loop

{
if ((jear == 15) && (month == 8) && (day == 28))
{
mache was
}
}

hier fragt er ein Jahr die "if" ab sonst nichts

loop
{
delay(31104000000)
{
mache was
}
}

hier fragt er ein Jahr delay ab. Wenn das überhaupt möglich ist.

delay(31104000000) nicht, aber delay(4294967295) wäre möglich.

Ob sich ein delay auf den Stromverbrauch stark auswirkt, mag ich zu bezweifeln.
Ich würde behaupten,
Rechenoperationen sind identisch vom Stromverbrauch wie das einsetzen von delays. Lediglich beim ändern von Schaltzuständen kommt es zu einer "erhöhten" Strombelastung.

Für 3 Monate würde die DS1307 reichen. Deine Zeitachse wird dadruch halt um ein paar Minute, vielleicht eine Stunde gestreckt oder gestaucht.
Wenn das für dich okay ist, lass das Teil drin. Ansonsten, für RTCs kann man, wenn man ohne externe Inputs arbeiten möchte, besser eine DS3231 einsetzen. Kostet nicht wirklich viel mehr und gibt es auch mit GoldCaps.

P.S. Mit Stromsparen brauchst du nicht anfangen. Der Uno verbrät schon genug bei der externen Hardware, zumal du warscheinlich auch noch über den PowerJack speist. Was da verbraucht wird, holst du mit dem sleep Befehl nicht rein. Anders wenn du nackte Controller nimmst. Da lässt sich schon was machen. Aber wo ist das Problem, einfach ein Steckernetzteil anzuschließen?

Hallo,
"delay(31104000000) nicht, aber delay(4294967295) wäre möglich."
ein Schelm- der da Böses denkt...
Gruß und Spaß
Andreas

Insgesamt soll das Programm 3Monate durchlaufen und loggen, das wird dann hinten heraus ungenau

nicht nur hinten heraus :wink:

Es wird zwar viel über die DS1307 geschimpft, aber genauer als millis() ist sie allemal.
Ich denke auch der Quarz auf dem adafruit Loggershield ist besser als was in den chinesischen Billiguhrenmodulen verbaut wird.

Man sollte schon mindestens jede Minute die RTC abfragen und dann dieses Ergebnis für die weitere Zeitsteuerung verwenden.

Oder: jede halbe Sekunde, und immer wenn die Sekunde auf 0 geht, die Minute aktualisieren und eine gute Sekunde warten, damit man diesen Minutenwechsel nicht nochmal mitmacht. Weiter würde ich nicht "runtertakten".

Ausserdem: Wie siehst du dem Logger an, was er macht ? Ist ein Display dran oder wird zum Test/Uhrzeit stellen die serielle Schnittstelle verwendet ...

Ich habe eine DS1307 die in 3 Monaten vielleicht 10-20 Sekunden falsch geht. Weit besser als was viele Leute hier berichten.

4-8 ppm mit DS1307 kann vorkommen, ist aber Zufall. Die Dinger streuen stärker. Wenn es nicht auf ein paar Cent mehr ankommt: DS3232 und Du bist garantiert auf 2 ppm genau. Wenn das nicht reicht: Funkuhr oder GPS. Ich kenne da ein aktives DCF77 Projekt :wink: