Şu anda bir ısı pompası sisteminde sıcaklıkları, akışları, gerilimleri, gücü ve enerjiyi görüntülemek için bir grafik LCD sistemi geliştiriyorum. Grafik LCD kullanımı, SRAM'ımın yarısının ve flaşımın ~% 75'inin bir ekran arabelleği ve dizeleri tarafından kullanıldığı anlamına gelir.
Şu anda enerji için min / maks / ortalama rakamları gösteriyorum Günlük rakam sıfırlandığında gece yarısı sistem, günlük tüketimin bir önceki minimum veya maksimumun altında mı altında mı olduğunu kontrol eder ve değeri saklar. Ortalama, kümülatif enerji tüketiminin gün sayısına bölünmesiyle hesaplanır.
Geçen hafta ve ay boyunca günlük ortalama göstermek (basitlik için 4 hafta) yani hareketli ortalama. Şu anda bu, son 28 gün için bir değer dizisinin korunmasını ve tüm dizi boyunca haftalık ve aylık 7 gün boyunca bir ortalama hesaplanmasını içerir.
Başlangıçta bunu bir dizi şamandıra kullanarak yapıyordum (enerji "12.12kWh" biçiminde olduğu gibi), ama bu 28 * 4 bayt = 112 bayt (SRAM'ın% 5.4'ü) kullanıyordu. Tek bir ondalık çözünürlük noktasına sahip olmak umrumda değil, bu yüzden uint16_t kullanmak ve rakam 100 ile çarpmak için değişti. Bu 12.12 1212 olarak temsil edilir ve görüntüleme amacıyla 100'e bölmek anlamına gelir.
Dizinin boyutu şimdi 56 bayta düştü (çok daha iyi!).
Rakamı görebildiğim uint8_t değerine düşürmenin önemsiz bir yolu yok. Ondalık bir yerin kaybını tolere edebilirim ("12.12kWh" yerine "12.1kWh"), ancak tüketim genellikle 25.5kWh'den (255, 8-bit işaretsiz tamsayı ile temsil edilen en yüksek değerdir) daha yüksektir. Tüketim asla 10.0kWh'nin altında veya 35.0kWh'nin üzerinde olmamıştır, bu yüzden muhtemelen depolanan rakamlardan 10 çıkarabilirim, ancak bir gün bu sınırları aşacağımızı biliyorum.
Daha sonra bir diziye 9 bitlik değerleri paketlemek için kod test ettim. Bu 0-51.2kWh aralığı verir ve toplam 32 bayt kullanır. Bununla birlikte, böyle bir diziye erişmek oldukça yavaştır, özellikle de bir ortalama hesaplamak için tüm değerleri yinelemeniz gerektiğinde.
Benim sorum şu - üç pencere ile hareketli bir ortalama hesaplamanın daha verimli bir yolu var mı - ömür boyu, 28 gün ve 7 gün? Verimlilik, SRAM kullanımı açısından daha küçük, ancak büyük kodun cezası olmadan anlamına gelir. Tüm değerleri saklamaktan kaçınabilir miyim?