Temperaturvariable einmal pro Tag löschen

Hallo zusammen,

Ich habe möchte mit den NRF24l01 Modulen Temperatur aus ca. 50 Meter Entfernung zu mir ins Büro funken. Sollte eigentlich sehr einfach sein Testläufe haben das bestätigt. Mein Frage hierzu bezieht sich auf das Programm. Ich möchte mir den aktuellen Temperaturwert, den tiefsten bzw. den höchst gemessenen pro Tag anzeigen lassen. Denke das bekomme ich auch hin. Aber wo meine Überlegungen im Moment scheitern ist, wie stelle ich es an das die nennen wir die Variable minimum einmal am Tag gelöscht wird und durch den tiefsten Wert am nächsten Tag überschrieben wird denn sollte dieser nicht tiefer sein als der vorherige würde ja immer der tiefste wert erhalten bleiben. Ich möchte keine Hardware Uhr benutzen.
Oder anders ausgedrückt ich möchte den minimum wert einmal pro tag auf null setzen
Für ein paar Denkanstöße wäre ich sehr dankbar.

MFG Günter

Wenn Du keine Uhr verwendest, woher bekommst Du den Tageswechsel?

Wenn es nur über eine Uhr geht, Ich hatte an die Arduino Uhr gedacht, es kommt mir nicht auf eine genau Uhrzeit an, kann auch alle 24 Stunden sein ist egal.

Wenn der Sensor im Außenbereich sendet, könntest Du zusätzlich zur Temperatur auch die Helligkeit messen und senden. Dazu reicht ggf. eine LED zur groben Messwerterfassung. Das Auswerteprogramm müßte den Tageswechsel dann daran erkennen, dass es einmal pro Tag eine Dunkelphase namens Nacht gibt.

Wenn es nicht auf den "richtigen" Tageswechsel ankommt, sondern nur ungefähr alle 24 Stunden die Temperaturen resettet werden sollen: Der Tag hat 86400 Sekunden, also brauchst Du nur nach einem Intervall von 86400000 Millisekunden resetten.

Hallo Jurs,

es kommt mir nicht auf den richtigen Tageswechsel an ich hatte an morgens so grob gegen 9:00 Uhr gedacht da sitze ich vorm Rechner wo auch der Arduino läuft und dann sind in der Regel die tiefsten Werte durch. Die Sache mit dem Intervall ist so glaube ich die beste Lösung, aber was meinst du mit reseten, soll nach dem Intervall ein Software-Reset durchgeführt werden ? Wie ich das mit dem Intervall löse finde ich bestimmt etwas hier im Forum.

Gruß Günter

Du könntest ein Zeitfenster und die Temperaturkurve kombinieren:

Wenn du nur einfach alle 24h löscht, ohne Echtzeituhr, dann wird dir der Löschzeitpunkt auf die Dauer weglaufen, da der Arduino-Quarz nicht so genau geht.
Parallel hast du ja aber eine Temperaturkurve aus der du Tagesmaxima und Tagesminima auslesen kannst.
Du könntest also den Zeitpunkt von Tagesmimimum und Tagesmaximum speichern und prüfen, ob die zeitlich weglaufen und damit ggf deine interne Uhr korrigieren.

Besser wäre es allerdings einfach eine Echtzeituhr zu verwenden. Die DS3231 ist hochgenau und gibts für wenige Euros zu kaufen

Das mit dem Intervall sieht in etwa so aus:

unsigned long last_Del_Time;
const unsigned long _24h = 24*3600*1000;

int min_Temp, max_Temp;
void setup(){}
void loop(){
  if (millis() - last_Del_Time > _24h){
    last_Del_Time = millis();
    min_Temp = +99;
    max_Temp = -99;
  }  
  // Rest vom code
}

Nein, damit meine ich, dass Du beim Wechsel des Intervalls die Höchst- und Tiefsttemperatur auf die aktuelle Temperatur resettest.

  static unsigned long lastIntervallChange;
  if (millis()-lastIntervallChange>86400000L)
  {
    lastIntervallChange=millis();
    tiefTemp=aktuellTemp;
    hochTemp=aktuellTemp;
  }

Wenn Du ein festes Intervall festlegst, wird Dir durch die Ganggenauigkeit des Arduino allerdings im Laufe des Jahres der Reset-Zeitpunkt einmal quer über den Tag laufen. Der Millis-Zähler moderner Arduino-Boards (mit Resonator statt Schwingquarz) zählt nämlich auf 1 Million Sekunden locker 1000 oder mehr Sekunden falsch. Und ein Jahr hat über 31 Millionen Sekunden...

Hallo Gunther,

ich weiß ich habe für anderen Sachen schon die DS3231 im Einsatz, die läuft jetzt seit September 2013 und hat erst eine Sekunde Differenz, ich wollte aber für diese Sache möglichst auf zusätzliche Hardware verzichten auch wenn ich in Kauf nehmen muss das die interne Uhr falsch läuft.
Danke für deinen Vorschlag werde ihn mal umsetzen.

Gruß Günter

Hallo Jurs,

Ok, habe ich verstanden.
Danke für deinen Vorschlag werde ihn mal umsetzen, ich denke ich kann damit leben das, dass mit dem reseten dann zeitlich abdriftet.

Gruß Günter

Hallo,
wenn Du es "automatisch" machst, dann führt um eine RTC kein Weg vorbei.
Die gezählten Timer laufen Dir aus dem Ruder. Vielleicht?

Wenn Du aber auf genaue Zeiten keinen richtigen Wert legst, warum nicht
einfach mit einem Taster?
Wenn der gedrückt wird, dann gehen alle gespeicherten Werte auf die aktuelle
Temperatur. Der Vergleich beginnt wieder von vorne.

Dann hast Du mit dem Intervall den Nachteil- wann willst Du diesen starten?
Welche "letzten" 24Std. willst Du erfassen?

Durch den nicht so genauen Quarz laufen Dir die Zeiten ja weg. ich weiß nicht
genau, wann das passiert. Vielleicht wird die Sache "genauer" wenn Du kurze
Intervalle hochzählst. Für 24Std. z.B. 48mal. Also alle 30Min den Timer neu
starten.
Ich weiß auch nicht, von was für Differenzen die Rede ist. Wenn der Timer am
Tag 1 Sekunde daneben liegt, dann sind das im Monat ne halbe Minute- und?!

So recht kann ich mit die Sache/den Sinn ohne RTC aber nicht vorstellen.
Gruß und Spaß
Andreas

Das mit dem manuellen Rücksetzen, wie von SkobyMobil vorgeschlagen, ist natürlich auch eine Alternative. Im vorelektronischen Zeitalter hatte man ja auch Minimax-Thermometer, die man per Drucktaste manuell zurückstellen mußte. Die Dinger gibt es immer noch, wenn auch nicht mehr in der guten alten Quecksilberausführung, sondern seit dem EU-Bann nur noch quecksilberfrei:
http://www.amazon.de/TFA-Maxima-Minima-Thermometer-10-3014-14-Quecksilber/dp/B004TWWU8A/

Ansonsten fällt mir noch diese Rücksetzmöglichkeit ein, wenn Du als zusätzliche Hardware wenigstens eine einzelne LED spendierst, die man als Lichtmesser verwenden könnte:
Man macht einmal pro Stunde eine Lichtmessung über die speziell geschaltete LED, und wenn die Lichtmessung in vier aufeinanderfolgenden Stunden "dunkel" ergeben hat und es danach "hell" wird, macht man den Reset der Temperatur.

Das hätte zwar den Nachteil, dass der Reset dann im Sommer zu anderen Zeiten erfolgt als im Winter, aber wenigstens würde die Reset-Zeit der Temperatur dann nicht quer über den Tag laufen. Das kann nämlich dazu führen, dass die Tiefsttemperatur morgens um 8 Uhr erreicht wird, die Höchsttemperatur um 14 Uhr, der Reset kommt um 15 Uhr, und wenn Du um 16 Uhr draufschaust, siehst Du als Tiefst- und Höchsttemperatur Werte, die beide etwas unter der tatsächlichen Höchttemperatur von 14 Uhr liegen.

Hallo Andreas,

der Arduino steht ca. 3 Meter von meinem Schreibtisch entfernt, dann müßte ich ja jedesmal aufstehen und den Taster drücken, das ist sehr umständlich -- war ein Scherz --
Mit dem Taster könnte man das vorlaufen der internen Uhr stoppen, da hast Du Recht.
Mit den letzten 24 Stunden sind die Stunden gemeint in denen ich den Arduino ablesen kann vorwiegend die Nachzeit und da ich immer gegen 9:00 Uhr im Büro bin, wenn auch nicht lange hätte ich den Startzeitpunkt auf 9:00 Uhr gesetzt, somit hätte ich am nächsten Tag immer die tiefste Nacht und die höchste Tagestemperatur vom Vortag und wenn ich die abgelesen habe sind die uninteressant und können gelöscht werden.

Gruß Günter

Hallo Jurs,

mit dem Thermometer ist das aber nur gut wenn man daran vorbei kommt und kann das ablesen. Mein Temp-Sensor ist aber gut 60 meter von dem Empfänger Arduino entfernt und hängt auch noch zudem an einer schwer zugänglichen Stelle, da ich direkte Sonneneinstrahlung vermeiden wollte, das ist dann doch sehr ungünstig.
Mit dem Lichtmesser da ist bestimmt auch gut, ich habe aber nur ein bestimmtes Zeitfenster in dem ich die Temperaturwerte ablesen kann, das könnte zeitlich schwierig werden, da ich sehr unregelmäßig im Büro bin und an manchmal auch nicht sehr lange, eben halt nur um die Kernzeit von 9:00 Uhr.

Grüße Günter

Du kannst ja auch die Anzeige "umlaufend" machen: Der Arduino merkt sich nicht eine Höchst- und Tiefsttemperatur pro Tag, sondern er merkt sich 24 (stündlich), 48 (halbstündlich) oder 96 (viertelstündlich) mal pro Tag die jeweils aktuelle Höchst- und Tiefsttemperatur dieses kleinen Intervalls (Stunde, halbe Stunde, viertel Stunde).

Und das macht er umlaufend, d.h. immer wenn ein neuer Wert dazu kommt, vergißt er den ältesten Wert.

Und wenn Du den Datenabruf machst, dann schaut der Arduino eben erst mal in seinen 24/48/96 Tiefst-/Höchstwerten nach, welches denn nun die absolut tiefsten oder höchsten Werte der letzten 24 Stunden waren und zeigt diese dann an.

Genug RAM-Speicher haben Arduinos ja, auch um sich jeweils 2*96 Werte zeitweilig zu merken, selbst wenn Du nur zwei Werte anzeigen möchtest. Und zu den Temperaturen könntest Du dann sogar ungefähre Zeitangaben machen, wie "Tief 9.8°C vor 15 Stunden" und "Hoch 22.3°C vor 2 Stunden").

Wenn du bei fallender Temperatur das Minimum nachziehst, bei steigender Temperatur aber stehen lässt?
( Wenn also die Temp von 15 auf 14 sinkt, merkst du dir 14 , auch wenn es vorher nur 10 waren )

Morgens um 9 hast du mit der Methode nur ein Problem mit dem Vortags-Maximum.

Und/Oder du merkst dir, wann und also wie alt ( in millis() ) das vorige Minimum/Maximum war.