Forum: Mikrocontroller und Digitale Elektronik Min/Max über 24h


von Ingo L. (corrtexx)


Lesenswert?

Hallo Forum,

ich möchte über 24h gleitend Temperatur min/max Werte erfassen. Ich habe 
einen Temperatursensor, der von einem Mega8 (ja, alt, ich weiss, müssen 
aber weg ;) ) sekündlich ausgelesen wird. Die Abtastrate ist so hoch, 
weil ich die Temperatur in einem Container nicht unter eine bestimmte 
Temperatur fallen lassen will und ich mit bis zu 6kW gegen heize. Jetzt 
erscheint es mir wenig sinnvoll, 60*60*24 Werte in einen Buffer zu 
schreiben und dann daraus Min/Max suchen, kann der AVR auch nicht. Ich 
finde gedanklich keinen Ansatz, kann mir jemand helfen?

von Simi S. (kokoianer)


Lesenswert?

Salüü

Neuen Wert mit dem aktuellen Min/Max Werten vergleichen.
Wenn er grösser bzw. kleiner ist, den Min/Max Wert ersetzen.

Braucht keine Rechenleistung ;)

Gruss

von Ingo L. (corrtexx)


Lesenswert?

Simi S. schrieb:
> Neuen Wert mit dem aktuellen Min/Max Werten vergleichen.
> Wenn er grösser bzw. kleiner ist, den Min/Max Wert ersetzen.
Und wie bekomme ich da 24h rein? Ein Min/Max Tracker ist ja kein 
Problem. Eine RTC gibt es nicht, ich benötige die Werte also relativ zu 
24h, ohne Zeitstempel und co..

: Bearbeitet durch User
von Mario L. (mlatzig)


Lesenswert?

Warum musst du die History auf die Sekunde genau haben?

Reicht es nicht, aktuelle Temperaturwerte sekündlich aktuell zu haben 
und in der 24Stunden-History nur mit einer Auflösung von z.B. 1-5 
Minuten (Byte pro Temperaturwert) zu speichern, um daraus die 
statistischen Werte, wie Min/Max/Avg etc. zu berechnen?

von Chris D. (myfairtux) (Moderator) Benutzerseite


Lesenswert?

Ingo L. schrieb:
> Und wie bekomme ich da 24h rein? Ein Min/Max Tracker ist ja kein
> Problem. Eine RTC gibt es nicht, ich benötige die Werte also relativ zu
> 24h, ohne Zeitstempel und co..

Du benötigst also alle Werte?

1024 Bytes RAM und 512 Bytes EEPROM
Sportliche Aufgabe, je nach Daten ;-)

Wie sehen denn die Daten aus, insbesondere deren Auflösung?

Wenn sich die Temperatur über die Zeit wenig ändert, dann reicht 
eventuell ein Zeitstempel inkl. Richtung der Temperaturänderung.
Du lässt also einen Zähler sekündlich raufzählen und speicherst nur bei 
einer Temperaturänderung die Art der Richtungsänderung.

Wenn Du davon ausgehen kannst, dass sich die Temperatur wenigstens alle 
127 Sekunden einmal ändert, dann haut es schon ohne Komprimierung fast 
hin.
Die ersten sieben Bits sind dann die Anzahl der verstrichenen Sekunden 
und das achte gibt an, in welche Richtung sich die Temperatur um einen 
Schritt geändert hat.

Ändert sich die Temperatur aber schneller oder in größeren Sprüngen oder 
gar nicht, dann wird es wieder eng ;-)

Ansonsten müsste man wohl mit einer Komprimierung arbeiten, die 
sämtliche bisherigen Daten beinhaltet und sich daraufhin optimiert.

: Bearbeitet durch Moderator
von Ingo L. (corrtexx)


Lesenswert?

Danke für die Tips. Ich habe es jetzt so gemacht, dass ich die mittlere 
Temperatur in einem 5min-Fenster weglogge und aus diesem Mittel-Buffer 
(288 Ints) die Min/Max ermittele. Reicht mir so.

von georg (Gast)


Lesenswert?

Ingo L. schrieb:
> Die Abtastrate ist so hoch,
> weil ich die Temperatur in einem Container nicht unter eine bestimmte
> Temperatur fallen lassen will

Ich bezweifle sehr, dass sich die Temperatur in einem Container 
innerhalb einer Sekunde relevant ändert. Aber so ein Overkill schadet 
auch nicht.

Grundsätzlich ist die Frage: brauchst du nun ein Temperatur-Log über 24 
Stunden oder nur die Min/Max-Temperatur? Dafür musst du nicht mehr als 
diese beiden Werte speichern.

Georg

von Äxl (geloescht) (Gast)


Lesenswert?

georg schrieb:
> Grundsätzlich ist die Frage: brauchst du nun ein Temperatur-Log über 24
> Stunden oder nur die Min/Max-Temperatur? Dafür musst du nicht mehr als
> diese beiden Werte speichern.

eben - diese Frage stelle ich mir auch gerade.
Du brauchst zwei Variablen
eine nennst Du MAX, die ande MIN.
die MAX belegst Du mit NULL vor und die andere mit "1000Grad" (wie immer 
deine Maßeinheit aussieht).
Jetzt misst du einfach vor dich hin und vergleichst deinen Messwert mit 
MAX("0") und mit MIN("1000Grad")
wenn der Messwert kleiner MIN ist, wird das ab sofort den neues MIN.
Ist der Messwert größer als MAX, wird das dein neuer Maximalwert.
Das in eine Schleife und gut.
Am Ende des Tages hast Du dann MIN mit zB 23Grad (ist ja >0) und MAX mit 
zB. 43Grad belegt (< 1000Grad).
Na - und den letzten Messwert hast Du auch.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Ingo L. schrieb:
> Die Abtastrate ist so hoch, weil ich die Temperatur in einem Container
> nicht unter eine bestimmte Temperatur fallen lassen will und ich mit bis
> zu 6kW gegen heize.
Ähem, diesen Gedankengang kannst du nochmal gehen und kommst dann sicher 
an das richtige Ziel. Als Denkanstoß: wie schnell ist denn deine 
6kW-Heizung? Bringt die nach 10 Sekunden schon so richtig heiß?

Äxl (geloescht) schrieb:
> Am Ende des Tages hast Du dann MIN mit zB 23Grad (ist ja >0) und MAX mit
> zB. 43Grad belegt (< 1000Grad). Na - und den letzten Messwert hast Du auch.
Die Forderung war aber nicht "min-max vom letzten Tag", sondern "min max 
in den vergangenen 24h". Das ist ein grundlegender Unterschied.

Ich würde das etwa so angehen, dass ich für jede der 24 vergangenen 
Stunden einen min-max-Wert entsprechend deiner Beschreibung ermittle und 
in einem Ringpuffer ablege. Aus diesen 24 mix-max-Werten wird dann ein 
einziger min-max-Wert der vergangenen 24h berechnet...

: Bearbeitet durch Moderator
von Ingo L. (corrtexx)


Lesenswert?

Lothar M. schrieb:
> Ähem, diesen Gedankengang kannst du nochmal gehen und kommst dann sicher
> an das richtige Ziel. Als Denkanstoß: wie schnell ist denn deine
> 6kW-Heizung? Bringt die nach 10 Sekunden schon so richtig heiß?
Ja, is sicher Overkill

Lothar M. schrieb:
> Äxl (geloescht) schrieb:
>> Am Ende des Tages hast Du dann MIN mit zB 23Grad (ist ja >0) und MAX mit
>> zB. 43Grad belegt (< 1000Grad). Na - und den letzten Messwert hast Du auch.
> Die Forderung war aber nicht "min-max vom letzten Tag", sondern "min max
> in den vergangenen 24h". Das ist ein grundlegender Unterschied.
Genau, Min/Max über gegen unendlich is kein Problem

Lothar M. schrieb:
> Ich würde das etwa so angehen, dass ich für jede der 24 vergangenen
> Stunden einen min-max-Wert entsprechend deiner Beschreibung ermittle und
> in einem Ringpuffer ablege. Aus diesen 24 mix-max-Werten wird dann ein
> einziger min-max-Wert der vergangenen 24h berechnet...
Das ist sogar eine noch bessere Variante als meine derzeitige. Danke!

von Ideengeber (Gast)


Lesenswert?

Servus,

Lothar M. schrieb:
> Ich würde das etwa so angehen, dass ich für jede der 24 vergangenen
> Stunden einen min-max-Wert entsprechend deiner Beschreibung ermittle und
> in einem Ringpuffer

wozu der Ringspeicher für die Stunden-Min/Max?

Es sollen für die letzten 24h min/max ermittelt werden, dafür brauche 
ich drei Variable: MIN, MAX und einen Sekundenzähler.

Zum Startzeitpunkt werden wie oben schon erwähnt die Werte so gesetzt:
MIN= 1000
MAX= -1000
COUNT=0

Bei jeder Messung werden MIN/MAX angepasst und COUNT um eins erhöht. 
Wenn COUNT==86400 sind die 24h-Stunden rum und die Endergebnisse können 
aus MIN und MAX gelesen werden. Für die Datenermittlung über mehrere 
Tage besteht keine Forderung.


Gruß,

von Rolf M. (rmagnus)


Lesenswert?

Ideengeber schrieb:
> wozu der Ringspeicher für die Stunden-Min/Max?
>
> Es sollen für die letzten 24h min/max ermittelt werden, dafür brauche
> ich drei Variable: MIN, MAX und einen Sekundenzähler.

Und wie bekommst du die Werte, die älter sind als 24h wieder 
rausgerechnet?

> Zum Startzeitpunkt werden wie oben schon erwähnt die Werte so gesetzt:
> MIN= 1000
> MAX= -1000
> COUNT=0
>
> Bei jeder Messung werden MIN/MAX angepasst und COUNT um eins erhöht.
> Wenn COUNT==86400 sind die 24h-Stunden rum und die Endergebnisse können
> aus MIN und MAX gelesen werden.

Und danach? Dann muss der erste gemessene Wert ja wieder aus dem 
Durchschnitt entfernt werden.

> Für die Datenermittlung über mehrere Tage besteht keine Forderung.

Aber dafür, dass zu jedem Zeitpunkt ein Minimum und Maximum über die 
letzten 24 Stunden vorhanden ist. Nicht über die Zeit seit dem letzten 
ganzzahligen Vielfachen von 24 Stunden. Also ein gleitender Min- und 
Max-Wert, wie es ja auch im Ursprungsposting gleich am Anfang seht:

Ingo L. schrieb:
> über 24h *gleitend*

: Bearbeitet durch User
von Ingo L. (corrtexx)


Lesenswert?

Ingo L. schrieb:
>> Ich würde das etwa so angehen, dass ich für jede der 24 vergangenen
>> Stunden einen min-max-Wert entsprechend deiner Beschreibung ermittle und
>> in einem Ringpuffer ablege. Aus diesen 24 mix-max-Werten wird dann ein
>> einziger min-max-Wert der vergangenen 24h berechnet...
> Das ist sogar eine noch bessere Variante als meine derzeitige. Danke!
Das ist eigentlich genau die Variante die ich benötigte. Ich habe es nur 
nicht geschafft mein Problem so "frei" zu machen.

Rolf M. schrieb:
>> Für die Datenermittlung über mehrere Tage besteht keine Forderung.
>
> Aber dafür, dass zu jedem Zeitpunkt ein Minimum und Maximum über die
> letzten 24 Stunden vorhanden ist. Nicht über die Zeit seit dem letzten
> Vielfachen von 24 Stunden. Also ein gleitender Min- und Max-Wert, wie es
> ja auch im Ursprungsposting gleich am Anfang seht:
>
> Ingo L. schrieb:
>> über 24h *gleitend*
Richtig

von Ingo L. (corrtexx)


Lesenswert?

Für alle die es interessiert:
1
if ( Temperature <= TEMP_MAX && Temperature >= TEMP_MIN ){
2
        if ( Temperature > TempHistoryMax[TempIndex] ) TempHistoryMax[TempIndex] = Temperature;
3
        if ( Temperature < TempHistoryMin[TempIndex] ) TempHistoryMin[TempIndex] = Temperature;
4
        
5
        if ( ++MinuteCounter >= ONE_HOUR ){// 1 Hour is over, next Hour
6
          MinuteCounter = 0;
7
          // Reset Index
8
          if ( ++TempIndex >= NR_OF_TEMPS ) TempIndex = 0;
9
        }
10
      }
und
1
if ( Flags.ReadMaxima == SET ){
2
      Flags.ReadMaxima = CLEAR;
3
      for ( uint8_t i = 0; i < NR_OF_TEMPS; i++ ){
4
        if ( TempHistoryMax[i] > TempMax24 ) TempMax24 = TempHistoryMax[i];
5
        if ( TempHistoryMin[i] < TempMin24 ) TempMin24 = TempHistoryMin[i];
6
      }
7
    }
wobei NR_OF_TEMPS hier 24(Stunden) is. Danke Leute, ich habs selber 
nicht gesehen wie trivial es ist.

: Bearbeitet durch User
von Karl K. (karl2go)


Lesenswert?

Lothar M. schrieb:
> Ich würde das etwa so angehen, dass ich für jede der 24 vergangenen
> Stunden einen min-max-Wert entsprechend deiner Beschreibung ermittle und
> in einem Ringpuffer ablege. Aus diesen 24 mix-max-Werten wird dann ein
> einziger min-max-Wert der vergangenen 24h berechnet...

Genau so wird das gemacht.

Äxl (geloescht) schrieb:
> die MAX belegst Du mit NULL vor und die andere mit "1000Grad" (wie immer
> deine Maßeinheit aussieht

Und wenn die Temp unter Null geht? Und wenn noch kein Wert gemessen, 
dann gibt min 1000°C aus?

Besser: -32768 als NaN  definieren und als Anfangswert festsetzen. Dann 
abfragen, ob NaN. Auch alle noch nicht berechneten Min-Max im Ringbuffer 
als NaN setzen.

von Ideengeber (Gast)


Lesenswert?

Ingo L. schrieb:
> über 24h *gleitend*

In der Tat, das habe ich überlesen.
Ich korrigiere mich: Der Ringbuffer ist nötig.

Ingo L. schrieb:
> Aber dafür, dass zu jedem Zeitpunkt ein Minimum und Maximum über die
> letzten 24 Stunden vorhanden ist. Nicht über die Zeit seit dem letzten
> ganzzahligen Vielfachen von 24 Stunden.

Wobei Lothar auch schon vereinfacht. Ich verwende ein 24h-Raster, er ein 
Stunden-Raster. Gleitend würde nur eine Speicherung im Sekundentakt 
(Messfrequenz) sein. Aber das Prinzip ist natürlich richtig und es 
sollte auch immer ausreichend vereinfacht werden.

Gruß,

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Ideengeber schrieb:
> Aber das Prinzip ist natürlich richtig und es sollte auch immer
> ausreichend vereinfacht werden.
Aus diesem Grund würde ich für die letzten 24h auch nicht 24 Werte 
speichern, sondern 32 (also jeweils für alle 45min. einen neuen Satz 
min-max-Werte berechnen). Denn dann wird die 
Ringpufferüberlaufverwaltung noch einfacher und ist letztlich ein 
"index&=0x1f;"...  ;-)

: Bearbeitet durch Moderator
von Ingo L. (corrtexx)


Lesenswert?

Lothar M. schrieb:
> Denn dann wird die
> Ringpufferüberlaufverwaltung noch einfacher und ist letztlich ein
> "index&=0x1f;"...  ;-)
:-), das is zu viel des Guten

Beitrag #5559822 wurde vom Autor gelöscht.
von Ingo L. (corrtexx)


Lesenswert?

So, nun nochmal, sodass es auch funktioniert:
1
if ( Temperature <= TEMP_MAX && Temperature >= TEMP_MIN ){
2
        static uint8_t IndexhangeOccoured = 0;
3
        
4
        if ( IndexchangeOccoured ){
5
          TempHistoryMax[TempIndex] = TEMP_MIN;
6
          TempHistoryMin[TempIndex] = TEMP_MAX;
7
          IndexchangeOccoured = CLEAR;
8
        }
9
        if ( Temperature > TempHistoryMax[TempIndex] ) TempHistoryMax[TempIndex] = Temperature;
10
        if ( Temperature < TempHistoryMin[TempIndex] ) TempHistoryMin[TempIndex] = Temperature;
11
        
12
        if ( ++MinuteCounter >= ONE_HOUR ){// 1 Hour is over, next Hour
13
          MinuteCounter = 0;
14
          // Reset Index
15
          if ( ++TempIndex >= NR_OF_TEMPS ) TempIndex = 0;
16
          IndexchangeOccoured = SET;
17
        }
18
      }
und
1
if ( Flags.ReadMaxima == SET ){
2
      Flags.ReadMaxima = CLEAR;
3
      TempMax48 = TEMP_MIN;
4
      TempMin48 = TEMP_MAX;
5
      for ( uint8_t i = 0; i < NR_OF_TEMPS; i++ ){
6
        if ( TempHistoryMax[i] > TempMax48 ) TempMax48 = TempHistoryMax[i];
7
        if ( TempHistoryMin[i] < TempMin48 ) TempMin48 = TempHistoryMin[i];
8
      }
9
    }
Man muss den neuen Index auch wieder überschreiben können ohne sein 
altes Maxima zu überschreiten.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Ingo L. schrieb:
> if ( Temperature <= TEMP_MAX && Temperature >= TEMP_MIN ){

 Da werden aber nur die Werte zwischen altem TEMP_MAX und
 altem TEMP_MIN in Betracht gezogen, oder ?
 Wozu soll das gut sein und wie kriegst du neue TEMP_MAX und _MIN ?

 Und:
1
        if ( Temperature > TempHistoryMax[TempIndex] ) TempHistoryMax[TempIndex] = Temperature;
2
        if ( Temperature < TempHistoryMin[TempIndex] ) TempHistoryMin[TempIndex] = Temperature;

 Besser:
1
        if ( Temperature > TempHistoryMax[TempIndex] ) TempHistoryMax[TempIndex] = Temperature;
2
        else if ( Temperature < TempHistoryMin[TempIndex] ) TempHistoryMin[TempIndex] = Temperature;

EDIT:
 TEMP_MAX und TEMP_MIN sind Konstanten um Ausreisser zu verhindern?

: Bearbeitet durch User
von Ingo L. (corrtexx)


Lesenswert?

Marc V. schrieb:
> TEMP_MAX und TEMP_MIN sind Konstanten um Ausreisser zu verhindern?
Genau, alles darüber und darunter sind unplausibel und werden in 
entsprechenden Fehlerauswertungen abgefangen.

Marc V. schrieb:
> if ( Temperature > TempHistoryMax[TempIndex] )
> TempHistoryMax[TempIndex] = Temperature;
>         else if ( Temperature < TempHistoryMin[TempIndex] )
> TempHistoryMin[TempIndex] = Temperature;
Würde bedeuten, solange ich den Fall steigender Temperaturen habe, 
würden keine Minima erfasst werden d.h. nach dem Start würde solange der 
initial Min-Wert nicht berücksichtigt. Das erscheint mit nicht sinnvoll.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Ingo L. schrieb:
> Würde bedeuten, solange ich den Fall steigender Temperaturen habe,
> würden keine Minima erfasst werden d.h. nach dem Start würde solange der
> initial Min-Wert nicht berücksichtigt. Das erscheint mit nicht sinnvoll.
Korrekt und logisch:
Weil der min-Wert natürlich vom max-Wert völlig unterschiedlich ist und 
beide nicht irgendwie zusammen gehören, muss natürlich auch die 
Auswertung für beide einzeln durchgeführt werden.

Ich würde den Wert schon beim Einlesen auf Plausibilität prüfen und 
ggfs. den die Berechnung des min-max-Werts gar nicht starten. 
Genausowenig wie unplausible Werte in die Regelung eingehen sollten.
1
   :
2
   :
3
   if (TempNeuerWert){
4
     if (TempAkt<TMinStunde) TMinStunde=TempAkt;  
5
6
     if (TempAkt>TMaxStunde) TMaxStunde=TempAkt;  
7
8
     if (NeueStunde) {
9
       // min-max-Werte der letzen Stunde speichern
10
       PufferMin[idx] = TMinStunde;
11
       PufferMax[idx] = TMaxStunde;
12
       // Index verwalten
13
       idx++;
14
       idx&=0x1f;
15
       // "freie" Variablen zur Auswertung verwenden
16
       TMaxStunde = PufferMin[0];
17
       TMinStunde = PufferMax[0];
18
       for (int i=1; i<32; i++) {
19
         if (PufferMin[idx]<TMinStunde) TMinStunde=PufferMin[idx];  
20
         if (PufferMax[idx]>TMaxStunde) TMaxStunde=PufferMax[idx];  
21
       }
22
       TMin24h = TMinStunde;
23
       TMax24h = TMaxStunde;
24
     }
25
     // aktuelle Temperatur als Ausgangswert für die nächste Stunde festlegen
26
     TMinStunde = TempAkt;
27
     TMaxStunde = TempAkt;
28
   }
29
   :
30
   :


Ingo L. schrieb:
> IndexchangeOccoured
BTW: man muss nicht unbedingt englische Begriffe nehmen, wenn man kein 
Mutersprachler ist und nicht Gefahr läuft, dass der Code auch von Indern 
verstanden, will sagen "bearbeitet" werden muss...  ;-)

https://www.google.com/search?q=occured

: Bearbeitet durch Moderator
von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Ingo L. schrieb:
> Würde bedeuten, solange ich den Fall steigender Temperaturen habe,
> würden keine Minima erfasst werden d.h. nach dem Start würde solange der
> initial Min-Wert nicht berücksichtigt. Das erscheint mit nicht sinnvoll.

 Nein, aber das kann sowieso nicht sein.
 Temperatur kann nicht größer als TempHistoryMax[TempIndex] sein und
 gleichzeitig kleiner als TempHistoryMin[TempIndex].

von Falk B. (falk)


Lesenswert?

@Lothar M. (lkmiller) (Moderator)

>> IndexchangeOccoured
>BTW: man muss nicht unbedingt englische Begriffe nehmen, wenn man kein
>Mutersprachler ist und nicht Gefahr läuft, dass der Code auch von Indern
>verstanden, will sagen "bearbeitet" werden muss...  ;-)

Yes, in deed!

http://www.amazon.de/Weniger-schlecht-programmieren-Kathrin-Passig/dp/3897215675/ref=sr_1_1?ie=UTF8&qid=1444238128&sr=8-1&keywords=weniger+schlecht+programmieren

Dort werden die diversen falschen Freunde erklärt und richtig gestellt, 
wenn man nur some brocken englisch spricht.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Lothar M. schrieb:
> Korrekt und logisch:

 Nein.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Doch, und zwar wenn man die beiden Arrays mit einem Initialwert von z.B. 
-40 für die Maximal- und +140 für die Minimaltemperatur vorbelegt.

Denn sonst müsste man beim ersten Einlesen einer gültigen Temperatur 
beiden Arrays diese Temperatur gegeben werden. Irgendwie holprig, 
Ausnahme auf Ausnahme...
Deshalb würde ich auch nicht auf dem Puffer herumrechnen.

: Bearbeitet durch Moderator
von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Lothar M. schrieb:
> Doch, und zwar wenn man die beiden Arrays mit einem Initialwert von z.B.
> -40 für die Maximal- und +140 für die Minimaltemperatur vorbelegt.

 Ich sehe das so:

 Beim ersten Einlesen ist Temperatur z.B. +20.
 Maximaltemperatur geht auf +20, Minimaltemperatur bleibt auf +140.
1
 a) Beim zweiten Einlesen ist Temperatur unverändert oder weniger.
2
    Maximaltemperatur unverändert, Minimaltemperatur geht auf +20.
3
4
 b) Bei nächsten 10 Messungen ist Temperatur += 0.1
5
    Maximaltemperatur wird korrigiert, Minimaltemp. unverändert.
6
7
    Auswertung für beide Fälle:
8
    Solange MinTemp == +140, MinTemp = MaxTemp.
9
    Solange MaxTemp == -40, MaxTemp = MinTemp.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Korrekt, solange a) zutrifft.
Besser und der Realität entsprechend wäre allerdings, wenn die 
Minimaltemperatur schon beim ersten Durchlaufen richtig gesetzt würde... 
?

Falk B. schrieb:
> @Lothar M. (lkmiller) (Moderator)
>>> IndexchangeOccoured
>> BTW: man muss nicht unbedingt englische Begriffe nehmen, wenn man kein
>>>Mutersprachler ist und nicht Gefahr läuft, dass der Code auch von
>> Indern >verstanden, will sagen "bearbeitet" werden muss...  ;-)
> Yes, in deed!
Muss das hier nicht "indeed" heißen? ?

: Bearbeitet durch Moderator
von georg (Gast)


Lesenswert?

Marc V. schrieb:
> Beim ersten Einlesen ist Temperatur z.B. +20.
>  Maximaltemperatur geht auf +20, Minimaltemperatur bleibt auf +140.

Warum? Man kann den normalen Algorithmus anwenden, dann werden mit dem 
ersten Wert beide gesetzt - es ist doch auch überhaupt nichts falsch 
daran, wenn Min und Max den gleichen Wert haben. Bei einer konstanten 
Temperatur ist das ja zwangsläufig der Fall und völlig korrekt.

Worauf man dagegen achten müsste ist dass die Startwerte von -40 und 
+140 nicht in eine Rechnung einbezogen werden. Das ist der Fall, wenn 
man so verfährt wie von mir beschrieben und die erste Berechnung erst 
nach der ersten Messung durchführt, was einfach ist: es wird immer nach 
einem neuen Messwert das gewünschte berechnet.

Georg

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Lothar M. schrieb:
>> Yes, in deed!
> Muss das hier nicht "indeed" heißen? ?

 He no good speeka amerikano.
 In dead.

: Bearbeitet durch User
von Ingo Less (Gast)


Lesenswert?

@Lothar
Der Unterschied zu meiner Variante is, dass mein 24h Wert schon ab dem 
Einschalten verfügbar ist, deiner erst nach „NeueStunde“. Oder?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Einfach NeueStunde mit 1 und die beiden Puffer passend initialisieren, 
dann geht das... ?

von Ingo Less (Gast)


Lesenswert?

Würdest du direkt in deine Buffer arbeiten hättest du die Werte on the 
fly... Aber dafür kenne ich dein Programm zu wenig

von Stefan F. (Gast)


Lesenswert?

Brauchst du eigentlich die min/max Werte der letzten 24 Stunden oder die 
min/max Werte pro Tag (mit Reset um Mitternacht oder so).

von Ingo Less (Gast)


Lesenswert?

24h

von Stefan F. (Gast)


Lesenswert?

Also wirklich 24h. Jetzt wäre die nächste Frage, wie genau dieses 24h 
Fenster eingehalten werden muss. Wenn wir zum Beispiel sagen, dass 
dieses nur auf die Minute genau sein muss, reduziert sich der 
Speicherbedarf auf 1/60.

Du musst dann einfach nur von jeder Minute den jeweiligen min und max 
Wert speichern.

60 Minuten x 24 Stunden x 2 Bytes x 2 Werte (min+max) = 5,8kB. Das würde 
in einen ATmega1284 passen.

Wenn 2 Minuten Intervalle erlaubt sind, wären sogar die vielen Modelle 
mit 4kB RAM geeignet.

Die größeren Intervalle der historischen Speicherung halten dich nicht 
davon ab, die Messungen jede Sekunde durchzuführen und damit zu Regeln.

von Ingo Less (Gast)


Lesenswert?

@Stefan
Ich schätze deine Beiträge sehr. Aber hast du diesen Threat komplett 
gelesen? Das Problem ist gelöst, die Hardware steht fix und fertig. Aber 
trotzdem danke! Is nicht böse gemeint

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.