Derzeit entwickle ich ein grafisches LCD-System zur Anzeige von Temperaturen, Durchflüssen, Spannungen, Leistung und Energie in einem Wärmepumpensystem. Die Verwendung eines grafischen LCD bedeutet, dass die Hälfte meines SRAM und ~ 75% meines Blitzes von einem Bildschirmpuffer und Zeichenfolgen verbraucht wurden.
Ich zeige derzeit Min / Max / Durchschnittswerte für Energie an. Um Mitternacht, wenn der Tageswert zurückgesetzt wird, prüft das System, ob der Verbrauch für den Tag über oder unter dem vorherigen Minimum oder Maximum liegt, und speichert den Wert. Der Durchschnitt wird berechnet, indem der kumulierte Energieverbrauch durch die Anzahl der Tage dividiert wird.
Ich möchte den Tagesdurchschnitt der letzten Woche und des letzten Monats (der Einfachheit halber 4 Wochen) anzeigen, dh einen gleitenden Durchschnitt. Derzeit umfasst dies die Verwaltung eines Array von Werten für die letzten 28 Tage und die Berechnung eines Durchschnitts über das gesamte Array für monatlich und die letzten 7 Tage für wöchentlich.
Anfangs habe ich dies mit einem Array von Floats gemacht (da die Energie in der Form "12,12 kWh" vorliegt), aber dies war mit 28 * 4 Bytes = 112 Bytes (5,4% des SRAM). Es macht mir nichts aus, nur einen Dezimalpunkt der Auflösung zu haben, also habe ich uint16_t verwendet und die Zahl mit 100 multipliziert. Dies bedeutet, dass 12.12 als 1212 dargestellt wird und ich für Anzeigezwecke durch 100 dividiere.
Die Größe des Arrays beträgt jetzt 56 Bytes (viel besser!).
Es gibt keine triviale Möglichkeit, die Zahl auf ein uint8_t zu reduzieren, das ich sehen kann. Ich könnte den Verlust einer Dezimalstelle ("12,1 kWh" anstelle von "12,12 kWh") tolerieren, aber der Verbrauch ist häufig höher als 25,5 kWh (255 ist der höchste Wert, der durch eine vorzeichenlose 8-Bit-Ganzzahl dargestellt wird). Der Verbrauch war noch nie unter 10,0 kWh oder über 35,0 kWh, daher könnte ich möglicherweise 10 von den gespeicherten Zahlen abziehen, aber ich weiß, dass wir eines Tages diese Grenzwerte überschreiten werden.
Ich habe dann Code getestet, um 9-Bit-Werte in ein Array zu packen. Dies ergibt einen Bereich von 0-51,2 kWh und verwendet insgesamt 32 Bytes. Der Zugriff auf ein solches Array ist jedoch ziemlich langsam, insbesondere wenn Sie alle Werte durchlaufen müssen, um einen Durchschnitt zu berechnen.
Meine Frage lautet also: Gibt es eine effizientere Methode zur Berechnung eines gleitenden Durchschnitts mit drei Fenstern - Lebensdauer, 28 Tage und 7 Tage? Effizienz bedeutet weniger SRAM-Nutzung, jedoch ohne die Strafe für großen Code. Kann ich vermeiden, alle Werte zu speichern?