В даний час я розробляю графічну РК-систему для відображення температури, потоків, напруг, потужності та енергії в системі теплового насоса. Використання графічного РК-екрана означає, що половина моєї SRAM та ~ 75% моєї спалаху використовуються буферним екраном та рядками.
На даний момент я показую мінімальні / середні / середні показники енергії Опівночі, коли добова цифра скидається, система перевіряє, чи споживання за день вище або нижче попереднього мінімуму чи максимуму, і зберігає значення. Середнє значення обчислюється шляхом ділення кумулятивного споживання енергії на кількість днів.
Я хотів би відобразити середньоденні показники за останній тиждень і місяць (4 тижні для простоти), тобто середнє середнє значення. В даний час це включає підтримку масиву значень за останні 28 днів та обчислення середнього значення для всього масиву за місяць та останні 7 днів за тиждень.
Спочатку я робив це за допомогою масиву поплавків (оскільки енергія у формі "12,12 кВт-год"), але для цього було використано 28 * 4 байти = 112 байт (5,4% SRAM). Я не проти мати лише одну десяткову точку роздільної здатності, тому я перейшов на використання uint16_t і помножив цифру на 100. Це означає, що 12.12 представлений як 1212, і я ділю на 100 для відображення.
Розмір масиву тепер знизився до 56 байт (набагато краще!).
Немає тривіального способу зменшити фігуру до uint8_t, яку я бачу. Я міг би терпіти втрату десяткового знаку ("12,1 кВт-год" замість "12,12 кВт-год"), але споживання часто перевищує 25,5 кВт-год (255 - це найвище значення, представлене 8-бітним цілим числом, не підписаним). Споживання ніколи не було нижче 10,0 кВт · год або вище 35,0 кВт · год, тому, можливо, я міг би відняти 10 із збережених цифр, але я знаю, що одного разу ми перевищимо ці межі.
Потім я перевірив код, щоб запакувати 9-бітові значення в масив. Це дає діапазон 0-51,2 кВт-год і загалом використовує 32 байти. Однак отримати доступ до такого масиву досить повільно, особливо коли вам доведеться переглядати всі значення, щоб обчислити середнє значення.
Отже, моє запитання - чи є більш ефективний спосіб розрахунку ковзної середньої з трьома вікнами - термін служби, 28 днів і 7 днів? Ефективність означає менший показник використання SRAM, але без штрафного коду. Чи можу я уникати зберігання всіх значень?